Re: Датчик холла 12В использование с ардуино
Считаю частоту выдачи сигнала датчиком холла (готовлюсь к замерам датчика скорости).
Подключил эл. двигатель через реле, на двигатель насажена железка, которая вращаясь перекрывает датчик холла.
При выводе через "Serial Monitor" - Serial.println(delta), показываются значения в милисекундах от включенного состояния датчика до выключенного. Все бы ничего, но проскакивают какие-то случайные значения (от наводок что-ли)...
Как быть?
Вот код:
Код:
int RelayPin = 14; // Connect Relay to input pin 2
int HallPin = 3; // Connect Hall to input pin 3
void setup()
{
Serial.begin(9600);
pinMode(RelayPin, OUTPUT); // declare Relay as output
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка
attachInterrupt(1, int_on, FALLING); // настроить прерывание interrupt 1 на pin 3
}
void int_on()
{
delta = millis() - miliss;
miliss = millis();
Serial.println(delta);
}
void loop()
{
RelayOn=HIGH;
digitalWrite(RelayPin, RelayOn); // реле включить
}
Re: Датчик холла 12В использование с ардуино
А реле ты как подключил? Возможно что помеха от него или магнитное поле не достаточное для датчика
Нужно считать сами импульсы, а не их длительность
На форуме есть много примеров , и код спидометра тоже кто то уже выкладывал
Re: Датчик холла 12В использование с ардуино
Реле для ардуино - RELAY
http://www.pacpac.ru/published/publi...ngle-relay.jpg
Датчик холла уже с магнитом (встроенным), в прорезь между магнитом и датчиком железка входит...
Код спидометра я смотрел...
Код:
dinaimpulsov = pulseIn(3, HIGH, 100000);
Длина импульса почему-то не стабильно выдается...
А как количество импульсов посчитать?
Re: Датчик холла 12В использование с ардуино
Возьми за основу вот этот код
Re: Датчик холла 12В использование с ардуино
Все равно наводки...
Попробую в машине, возможно помехи от привода идут...
Вот такой код попробую:
Код:
int HallPin = 3; // Контакт для датчика скорости
unsigned long speedtime = 0;
int count = 0;
unsigned long time;
float lkolesa; //длина окружности колеса
float Speed;
void setup()
{
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка входа датчика холла
attachInterrupt(1, int_on, FALLING);
Serial.begin(9600);
}
void loop()
{
}
void int_on()
{
count++; //увеличить счетчик
if (count >=6)
{
speedtime = micros()-time; //время прихода 6-ти импульсов
time = micros(); //обнулить
lkolesa=0.686; // длина окружности колеса 215/65 R16 = 686мм
Speed=((lkolesa*3600000)/speedtime); // км/ч
Serial.println(speedtime); // длина между 6-ю импульсами
Serial.println(Speed); // км/ч
count = 0;
}
}
Буду подключать вот так...
http://big-e.ru/files/speed1.jpg
Только никак не пойду как сигнал с цифрового входа дальше пойдет, ну пройдет он диод, а дальше-то что.... там же не земля, а выход с панели приборов (без нагрузки) +12В.
Если смотреть наоборот то сигнал 12В, через диод не пройдет ....
Объясните на пальцах...
Re: Датчик холла 12В использование с ардуино
Я думаю что проблема в другом.
В прерывании не стоит использовать такую медленную функцию как Serial.println да еще на такой медленной скорости.
И я приводил пример кода , лучше использовать MSTimer2
Re: Датчик холла 12В использование с ардуино
Ну то есть:
Код:
void setup()
{
...
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка входа датчика холла
MsTimer2::set(30000, flash); // таймер будет срабатывать через каждые 500ms
MsTimer2::start();//запустить таймер
...
}
void flash() //обработка прерывания таймера
{
if ((digitalread(HallPin)==HIGH)
{
обработка кода
}
}
Re: Датчик холла 12В использование с ардуино
Примерно так
Получишь число импульсов за пол секунды, рассчитай на их основе скорость
PHP код:
void setup()
{
attachInterrupt(1, int_on, RISING);
Serial.begin(115200);
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка входа датчика холла
MsTimer2::set(500, flash); // таймер будет срабатывать через каждые 500ms
MsTimer2::start();//запустить таймер
count=0;
}
void flash() //обработка прерывания таймера
{
count=0;
Serial.println(speed);
}
void int_on()
{
count++; //увеличить счетчик
}
Re: Датчик холла 12В использование с ардуино
В очередной раз спасибо за подсказку, код поправил...
Re: Датчик холла 12В использование с ардуино
Я извиняюсь, сегодня все внимательно обдумал и получается сбил с правильного пути. Предложенный мной способ имеет недостатки.
1-большая погрешность
2-медленная скорость замера
Чтобы делать быстрый и точный замер нужно измерять длительность импульса
PHP код:
#include <util/delay.h>
volatile unsigned long delta,micross;
unsigned long temp;
int RelayPin = 14; // Connect Relay to input pin 2
int HallPin = 3; // Connect Hall to input pin 3
void setup()
{
Serial.begin(115200);
pinMode(RelayPin, OUTPUT); // declare Relay as output
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка
attachInterrupt(1, int_on, RISING); // настроить прерывание interrupt 1 на pin 3
digitalWrite(RelayPin, HIGH); // реле включить
}
void int_on()
{
delta=3030*(micros()-micross);//получим время пробега 1 км
micross = micros(); //обнулить
}
void loop()
{
temp=delta;
Serial.println(temp);
_delay_ms(500);
}
что бы рассчитать коэффициент нужно знать размер колеса и число импульсов на 1 оборот. Для колеса размером 195/65 R15 и 6 импульсам на 1 оборот, пробег на 1 импульс будет составлять примерно 33см
получаем 33см за время delta