-
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
-
Re: Датчик холла 12В использование с ардуино
Chip
Я сегодня замерил с помощью старой программы и методом подбора выяснил, что сигнал на комбинации приборов, от которого я пляшу, имеет 24 импульса на 1 оборот колеса - видимо это после преобразования контроллера или датчик такой...или передаточное число в КПП.
В результате получил вполне приемлемые данные, соответствующие показанию спидометра.
Единственно бывает, что скорость отличается на 3-4 км между соседними срабатываниями таймера, например 39 и 36, на самом деле скорость ~40. Выбивание из ряда объясняю тем, что граничные импульсы попали в соседнее срабатывание таймера.
В принципе код вполне устраивает
Код:
#include <MsTimer2.h>
int ledPin = 13; // контакт для светодиода
int switchPin = 30; // контакт для кнопки
int RelayPin = 14; // Контакт для реле
int HallPin = 3; // Контакт для датчика холла
int SpeakerPin=8; // Контакт для динамика
boolean RelayOn = false;
unsigned long speedtime = 0;
int count = 0;
unsigned long time;
float lkolesa;
float Speed;
float TimerInterval=500;
void setup()
{
Serial.begin(115200);
pinMode(SpeakerPin, OUTPUT); // для динамика
pinMode(ledPin, OUTPUT); // для светодиода
pinMode(switchPin, INPUT); // для кнопки
pinMode(RelayPin, OUTPUT); // для реле
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка входа датчика холла
attachInterrupt(1, int_on, RISING);
MsTimer2::set(TimerInterval, flash); // таймер будет срабатывать через каждые 500ms
MsTimer2::start();//запустить таймер
}
void loop()
{
}
void int_on()
{
count++; //увеличить счетчик
}
void flash() //обработка прерывания таймера
{
lkolesa=0.686;
Speed=lkolesa*count*(2400/TimerInterval);
Serial.flush();
Serial.println(count);
Serial.println(Speed);
count=0;
}
Также проверил и более старый код:
Код:
void int_on()
{
count++; //увеличить счетчик volatile
if (count >=24)
{
speedtime = micros()-time; //время прихода 6-ти импульсов
time = micros(); //обнулить
lkolesa=0.686;
Speed=((lkolesa*3600000*4)/speedtime);
Serial.println(speedtime);
Serial.println(Speed);
count = 0;
}
он выдает более точные данные, но реже, только после получения 24 импульсов...
Над твоим новым кодом думаю... учитывая мои 24 импульса.
Код:
void int_on()
{
delta=3030*(micros()-micross);// тут 1 имульс и время за которое он произошел
micross = micros(); //обнулить
}
Мне кажется по одному импульсу судить нельзя, не точно получится
У меня выше тоже самое, но за 24 импульса, возможно стоит за 4 или 6 импульсов судить о скорости
-
Re: Датчик холла 12В использование с ардуино
Цитата:
Мне кажется по одному импульсу судить нельзя, не точно получится
Можно и по одному импульсу рассчитывать
-
Re: Датчик холла 12В использование с ардуино
Кажись я ошибся, не 24 импульса, а все-таки 6... или 8
Я забыл умножить диаметр=0,686 на число пи.
Кстати, почему-то везде пишут, что 6 импульсов не на оборот колеса, а на 1 м пробега - хотя наверное для какого-то колеса оно так и есть - 1м пробега соответствует одному обороту, но только не моему - 1 об. = 2,15м
-
Re: Датчик холла 12В использование с ардуино
Считаем так;
Колесный диск и/или посадочный размер шины обычно имеет размер в дюймах, например для расчета возьмем 15 дюймов.
Дюймы переводим в миллиметры, т.е. умножаем на 25,4 (1 дюйм = 25,4 мм). Д=D*25,4
Размерность шины обычно указывается двумя числами через косую черту, например, 185/70 или 195/60.
Первый параметр - это ширина протектора шины в мм.
Второй параметр определяет высоту профиля шины относительно ширины (в процентах), т.е. "70% от 185мм" или "60% от 195мм".
Т.е. чтобы узнать высоту профиля шины надо первый параметр шины (ширину шины в мм) умножить на второй параметр шины (проценты) и разделить на 100.
П=W*H/100
Высота колеса в сборе - это диаметр диска (он же посадочный диаметр шины) плюс две высоты профиля шины (если внимательно посмотреть на колесо, то очевидно, что шина есть и сверху и снизу диска).
В=Д+2*П=D*25,4+2*W*H/100
результат получается в мм (т.к. обычно сантиметрами меряются портные, а инженеры - мм :-).
Пример:
195/65 R15
(15*25,4+2*195*65/100)*3,14=1993мм пробег колеса за один оборот
-
Re: Датчик холла 12В использование с ардуино
Выяснил окончательно, у нас движок и коробка японские и датчик японский: 2500 импульсов на километр, 2.5 импульса на метр.
Посему код выглядит так:
Код:
void int_on()
{
count++; //увеличить счетчик volatile
if (count >=2) //ждем 2 импульса - 2имп=0,8м
{
speedtime = micros()-time; //время прихода 2 импульсов
time = micros(); //обнулить
Speed=((0.8*3600000)/speedtime); //перевод в км/ч
Serial.println(speedtime);
Serial.println(Speed);
count = 0;
}
}
Единственный ньюанс:
Значение micros() переполняется и сбрасывается на ноль, приблизительно через 70 минут.
То есть после часа поездки, произойдет сбой или это программно обработать придется...
-
Re: Датчик холла 12В использование с ардуино
Если пугает что один замер проскочит сбойный , то можно следить за переполнением или делать два замера и сравнивать между собой с допуском (+)(-)
можно использовать таймер счетчик и после каждого замера обнулять его
-
Re: Датчик холла 12В использование с ардуино
Хочу подобрать замену датчику что в первом посту http://www.compcar.ru/forum/showpost...16&postcount=1
с учетом цитаты
Цитата:
Сообщение от
Chip
Это датчик с открытым коллектором, подключи сопротивление 10к на вых. и на +12в
Если сопротивление повесить на Выход датчика и на +5в то ни какого делителя не понадобится
Какой выбрать http://www.newic.ru/catalog/sensors/magnetic/hall/
NPN нормально открытый
или
PNP нормально открытый
и являются ли они датчиками с отрытым коллектором?
Ну грубо говоря смогу я подключить их также к первый?
-
Re: Датчик холла 12В использование с ардуино
-
Re: Датчик холла 12В использование с ардуино
PHP код:
void int_on()
{
count++; //увеличить счетчик volatile
if (count >=2) //ждем 2 импульса - 2имп=0,8м
{
speedtime = micros()-time; //время прихода 2 импульсов
time = micros(); //обнулить
Speed=((0.8*3600000)/speedtime); //перевод в км/ч
Serial.println(speedtime);
Serial.println(Speed);
count = 0;
}
}
При скорости 5 км/ч., ты два импульса, целую вечность будешь ждать!!!
Надо один импульс мерить (и то долго)!
С диаметром колеса тоже не к чему заморачиваться, я взял скорость с GPS и корректировал числитель (650000).
Убери лишнее вычисление Speed=((0.8*3600000)/speedtime); 0.8*3600000 = 2880000.
Получится Speed = (2880000 / speedtime);
И всю дьявольщину (Serial.println(speedtime); Serial.println(Speed); ) тоже убери из прерывания ))))))))))))
PHP код:
/////////////// СПИДОМЕТР//////////////////////////////////////
dinaimpulsov = pulseIn(3, HIGH, 100000); // Считывание длительности
ValSpCurr = (650000 / dinaimpulsov); // Перевод в км/ч
if (dinaimpulsov > 120000 || ValSpCurr > 350)
{
ValSpCurr = 0;
}
if (ValSpCurr > peakspeed) //pikspeed
{
peakspeed = ValSpCurr;
И функция pulseIn(); не очень подходит для этих целей, при низкой скорости авто она всю программу тормозит, пока ждёт конца импульса.
Сделал на прерывании.
PHP код:
void int_on()
{
spidometr = micros()-time; //время прихода импульсa
time = micros(); //обнулить
ValSpCurr = (1450000 / spidometr);
}
}
А чтоб не было вот этого: (я с этим тоже столкнулся)
Цитата:
Единственно бывает, что скорость отличается на 3-4 км между соседними срабатываниями таймера, например 39 и 36, на самом деле скорость ~40
Я думаю надо при скорости свыше 20 км/ч. , брать три-четыре последних значения и выводить среднее арифметическое, тогда наверно не будет разброса.
Сейчас проверить не могу, по причине поломки авто...
А на столе всё круто работает))))))
Вабще со скоростью запара, с оборотами всё проще гораздо))))))))
PHP код:
void loop()
//////////////////////////ТАХОМЕТР///////////////////////////////////////
{
if (taxometr > 6000)
{
taxo = (80000000 / taxometr);
}
else
{
taxo = 0;
}
if (taxo > peakrpm) //pikrpm
{
peakrpm = taxo;
}
void int_on()
{
count++; //увеличить счетчик volatile
if (count >= 4)
{
taxometr = micros()-time; //время прихода 4-ти импульсов
time = micros(); //обнулить
count = 0;
}
}
-
Re: Датчик холла 12В использование с ардуино
Все это не правильно, нужно измерять в фоновом режиме и что бы измерения не зависели от выполняемого кода. В примере на выходе показывает частоту в Гц, минимально измеряемая частота 4Гц
Вот пример :
Код:
#include <util/delay.h>
volatile unsigned int tachBuf;
unsigned long tachValue;
ISR(TIMER1_CAPT_vect)
{
TCNT1 = 0;
tachBuf = ICR1+2;
}
//********************************************************************
void setup()
{
pinMode(8, INPUT); //Вход для импульсов тахометра
pinMode(6, OUTPUT);//выход ШИМ
TCCR0B = TCCR0B & 0b11111000 | 5;//частота ШИМ. Для проверки тахометра
analogWrite(6, 128); //Запустить ШИМ
digitalWrite(8, HIGH); // включить подтяжку входа
Serial.begin(115200);
TIM_Init();//инициализация таймера
_delay_ms(300);
}
//********************************************************************
void loop()
{
cli();
tachValue =250000/tachBuf;
Serial.print("freq=");
Serial.println(tachValue,DEC);
tachBuf=1;
sei();
_delay_ms(300);
}
//********************************************************************
void TIM_Init(void)
{
TIMSK1=(1<<ICIE1);
TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);
TCCR1B=(1<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);
TCNT1 = 0;
-
Re: Датчик холла 12В использование с ардуино
Что не правильно? Ведь всё работает!!!!
-
Re: Датчик холла 12В использование с ардуино
Работает, но с погрешностью и в многозадачном режиме погрешность будет увеличиваться
-
Re: Датчик холла 12В использование с ардуино
Обьясни пожалуйста, почему?
-
Re: Датчик холла 12В использование с ардуино
Потому что приведенный мной пример считает импульсы в фоновом(хардверном) режиме и ресурсы процессора можно использовать для других задач
-
Re: Датчик холла 12В использование с ардуино
А что вот это за библиотека?
#include <util/delay.h>
А тут я чушь написал!
-
Re: Датчик холла 12В использование с ардуино
Эдуард, а ты мог бы прокомментировать этот код?
Последние два блока.....
PHP код:
#include <util/delay.h>
volatile unsigned int tachBuf;
unsigned long tachValue;
ISR(TIMER1_CAPT_vect)
{
TCNT1 = 0;
tachBuf = ICR1+2;
}
//********************************************************************
void setup()
{
pinMode(8, INPUT); //Вход для импульсов тахометра
pinMode(6, OUTPUT);//выход ШИМ
TCCR0B = TCCR0B & 0b11111000 | 5;//частота ШИМ. Для проверки тахометра
analogWrite(6, 128); //Запустить ШИМ
digitalWrite(8, HIGH); // включить подтяжку входа
Serial.begin(115200);
TIM_Init();//инициализация таймера
_delay_ms(300);
}
//********************************************************************
void loop()
{
cli();
tachValue =250000/tachBuf;
Serial.print("freq=");
Serial.println(tachValue,DEC);
tachBuf=1;
sei();
_delay_ms(300);
}
//********************************************************************
void TIM_Init(void)
{
TIMSK1=(1<<ICIE1);
TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);
TCCR1B=(1<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);
TCNT1 = 0;
-
Re: Датчик холла 12В использование с ардуино
Я немного по другом считаю импульсы. Использую аппаратные прерывания по входу. Когда приходит на вход фронт импульса с высокого на низкий или наоборот, обрабатывается прерывание, в котором счетчик импульсов увеличивается на единицу.
Функцией с интервалом 200 мс значение счетчика передается в порт, а сам счетчик обнуляется. В аппаратном прерывании используется оба фронта, и соответственно частота срабатывания прерывания в 2 раза выше реальной частоты на входе, выше точность. Пробовал прерывания одновременно с двух входов с разной частотой, и никакого взаимного влияния не обнаружил.
-
Re: Датчик холла 12В использование с ардуино
Я использую специальное аппаратное прерывание ICR (захват/сравнение)
-
Re: Датчик холла 12В использование с ардуино
-
Re: Датчик холла 12В использование с ардуино
Имею датчик холла:
http://m2.uxcell.com/i/11a/ux_a11031400ux0312_ux_c.jpg
Провода:
Black, Brown, Blue
Нашел тут http://answers.yahoo.com/question/in...9081442AAmCEM7, что:
Brown -> Power/Positive
Blue -> Ground/Neutral/Negative
Black -> Output
Не вяжется Black он обычно земля, не ошибка ли тут?
-
Re: Датчик холла 12В использование с ардуино
Ага разобрался.
Действительно "Черный" сигнальный.
Теперь другой вопрос:
Подал питание на датчик +12В.
На выходе получил:
Без магнита ~ 12В
С магнитом 0,02В
Если датчик http://www.compcar.ru/forum/showpost...2&postcount=10 был с открытым коллектором и подключался на цифровой выход ардуино с внутренней подтяжкой.
То как мне этот датчик к ардуине подключить? на нем ведь 12В на выходе - видимо он не с открытым коллектором...
-
Re: Датчик холла 12В использование с ардуино
Мне посоветовали так:
http://big-e.ru/files/DH.jpg
Верно ли?
-
Re: Датчик холла 12В использование с ардуино
Или просто подключить ДХ через диод и выход с внутренней подтяжкой?
-
Re: Датчик холла 12В использование с ардуино
Chip
Подскажи пожалуйста, могу ли я ДХ(12В) с выходом те же 12В подключить по обычной схеме: через диод на цифровой вход с подтяжкой?
P.S. Уж извини за частые вопросы, я уже говорил, в схемотехнике я никакой.
-
Вложений: 1
Re: Датчик холла 12В использование с ардуино
Цитата:
Сообщение от
kadushkin
Правильно будет на приложенной схеме
-
Re: Датчик холла 12В использование с ардуино
Не совсем понял, это вот так или диод за резистор засунуть?
http://big-e.ru/files/DH1.jpg
-
Вложений: 4
Re: Датчик холла 12В использование с ардуино
Вот тебе четыре варианта схем для преобразования уровней сигнала
-
Re: Датчик холла 12В использование с ардуино
Спасибо, 1 вариант предпочтительнее
Если диод шоттки я возьму:
BAT42, DO-35
BAT85
нормально будет?
Может какой-то ширпотребовский подскажете, который легко купить можно?
-
Re: Датчик холла 12В использование с ардуино
Не дорогие и распространенные диоды Шоттки 1N5817, 1N5818, 1N5819
P.S.
Число вариантов схем выше увеличил.
С оптроном считается самый надежный вариант
-
Re: Датчик холла 12В использование с ардуино
Спасибо!
Так может и на этой схеме
http://www.compcar.ru/forum/showpost...&postcount=496
обычный диод на диод шоттки надо заменить?