Цифровой датчик Холла
- Войдите на сайт для отправки комментариев
Пнд, 02/04/2012 - 17:06
Хочу через матлаб управлять вентилятором (при помощи цапа), который будет дуть на другой вентилятор и разгонять его. Со второго винта снимать частоту. Меняя напряжение на 1 винте добиться требуемых оборотов на 2м.
Вопрос - по какому протоколу работает датчик холла? OneWire? или что то другое, может есть библиотеки? Не хотелось бы мудрить с аналоговым.
Ни по какому. Практически все продаваемые датчики Холла цифровые, имеют 3 провода, два из них питание и сигнальный. В двух словах большинство работает так: когда магнитное поле отсутствует на сигнальном проводе напряжение питания (т.е. логическая 1), когда датчик находится в магнитном поле на сигнальном проводе 0 вольт (т.е. логический 0). Вы какой датчик холла используете? Каким напряжением питаете датчик? Вот этот код проверяли на датчике Холла (5В) и на ИК-датчике:
Еще даже не купил датчик, пока только решаем все тонкости проекта.
Ну если датчик покупной, то при правильной установке и подключении этот код должен работать.
Кстати, если не ошибаюсь, в куллерах от компа стоят датчики холла, можно разобрать куллер, удалить металлический сердечник с обмотками, только так чтобы ничего не замкнуть (а может и где-то подпаять) и будет вам вентилятор с датчиком холла да и еще на шаракоподшипнике (если куллер с шарикоподшипником).
Спасибо за подсказку!
Делается на лодку прибамбас который будет отображать на семисегментнике(4разряда), температуру, обороты двигателя итд.итп.
Лодочный двигатель Вихрь30.
Собственно сейчас ковыряюсь с тахометром, датчик холла будет стоять под маховиком на котором есть 4 магнита в каком порядке они стоят видно на фото макета .
Решил использовать ваш скетч для тахометра и здесь появились вопросы
1. После запуска моторчика обороты показывает но после полной остановки не становится в ноль (956)
2. оч большой разброс в оборотах при стабильном питании 1.5V моторчика
зы, скетч юзал не изменяя, деление не делал, все как есть
1. Это нормально, потому как нужно дописывать сброс оборотов в 0 при отсутствии импульсов.
2. Питание может и стабильно, а вот обороты двигателя могу и скакать + к этому при таком способе измерения оборотов очень важно равномерное расположение магнитов на валу относительно друг друга и оси вращения, небольшое биение вала приведет к неверным данным. Нужно дописывать сглаживание или применять другой способ подсчета оборотов.
А датчик холла у вас сработывает одинакого что на S что на N ? или только на один полюс? Данный расчет предназначен для одного срабатывания датчика за один оборот вала.
Спасибо за ответ.
Датчик срабатывает так: северный полюс - имеем на выходе лог1, южный лог0 и так далее. В итоге rpm нужно будет поделить на 4 если не ошибаюсь.
Делай прерывания по времени, думаю так проще.
Делай прерывания по времени, думаю так проще.
Не проще. Разве если нужна точность до "микросекунд" (но на интервалах в 5 сек, это вряд ли).
Имхо намного проще в loop сделать так:
И еще, желательно не забывать про ключевое слово volatile при объявлении переменных меняющихся в обработчике прерываний ( rpm )
А можно сочинить такую "помогалку дефайн" (разместить где-то в начале скетча):
Тогда в Loop() все будет вообще выглядить "чисто и красиво"
И в каждом цикле тратим время
Сперва на
millis()
Затем вычитание
millis()-lastReportTime
Ну и сравнение конечно
millis()-lastReportTime>=5000
Только после чего совершается пропуск ненужного фрагмента.
Выполнение этого кода еще все время обрывается внешними прерываниями...
Ну и конечно нельзя забывать про очень быстрый рост размера переменной
- Это же милисекунды как ни как!
lastReportTime
Запустить на 10 минут или на пару часов - есть разница?
Плюс, за все это время прилетит еще парочку прерываний - точность тоже никчерту.
И в каждом цикле тратим время
Сперва на
millis()
Затем вычитание
millis()-lastReportTime
Ну и сравнение конечно
millis()-lastReportTime>=5000
Только после чего совершается пропуск ненужного фрагмента.
Ой. Не смешите меня. Это микросекунды (даже не мили). 5 sec времени, по сравнению с этим - вечность. Ну какая разница прийдет отчет в ровно через 5 sec, или 5.000005 секунды? Сколько там лишнего успеет накопить RPM за это время? В процентах от его текущего значения это сколько будет? Комаринный писк?
Да по сравнению с тем что занимает вывод в сериал это вообще ничто (ой, а мы его еще постоянно проверяем, нестрашно что на это тоже тратится время?)
Да и вообще, мы что платим деньги за каждый такт процессора? Он же у нас, один черт ничем не занимается больше. Чем крутить пустой loop будет лучше?
Что лучше, экономить такты процессора, которые, вданном случае не нужны, или подрубасить либу, потратить дефецитную память, заюзать дефецитный ресурс "таймер" (который может пригодится для задачь которые действительно требуют "точности")? Ну а как вам нужно будет 5-ть "псевдо-одновременных" действий? Дополнительные контроллеры начнете ставить?
Кстати вход/выход в обработчик таймера - тоже не бесплатная операция. нужно запомнить "текущие состояние проца", потом востановить. Отработать все ваши stop/start. В итоге еще не известно кто больше тиков rpm пропустит.
Выполнение этого кода еще все время обрывается внешними прерываниями...
И что с того? Для того прерывания и предуманы. Негативных эффектов от этого - нет.
Ну и конечно нельзя забывать про очень быстрый рост размера переменной
- Это же милисекунды как ни как!
lastReportTime
А взять калькулятор и посчитать сколько влезет в unsigned long? На 49-дней хватит. Более того, даже после этого - ничего страшного не случится :) Код нормально отработает и в случае переполнения.
Вообщем опять пришили: и что с того? лично у меня нет страха перед "большими числами".
Запустить на 10 минут или на пару часов - есть разница?
Смотря что запускать. Если сердечника в финскую сауну - есть, если деньги на ветер - то нет.
Плюс, за все это время прилетит еще парочку прерываний - точность тоже никчерту.
И опять "и что с того"? По сравнению с тем что мы насчитали в rpm за 5 sec - это фигня. Между прочим операции с делением это тоже "не точная" штука :)
Кстати, вы почему-то упустили что в вашем коде вы тоже на время отчета делаете detachInterrupt.
Вообщем заявить "точность ни к черту" - это круто. А вот цифрами показать что ваш код на два порядка более точный сможете?
IMHO он нифига не точнее, более ресурсоемкий, менее читабельный.
Если уж очень сильно озаботились точностью, то нужно брать в зубы даташит на ATMEGA (или искать другие библиотеки работы с таймером, где это реализовано) и искать как настроить таймер и компаратор, что-бы он сам считал/увеличивал rpm. Без обработчика прерыаний, не отвлекая процессор даже на это, на железном уровне (ой... а ATMEGA даже такое умеет), так же как он не отвлекает камень на генерацию PWM.
Но обычно, на это заморачиватся имеет смысл только если речь идет о необходимой точности в микросекунды (не милли).
заюзать дефецитный ресурс "таймер" (который может пригодится для задачь которые
Кстати, похоже долго ждать этого не нужно AFMotor тоже использует таймеры. Причем разные, в зависимости от того под какую плату компилим. Так что можно поймать очень классную головную боль. Из серии почему на mega/uno по разному себя ведет или вообще не работает.
Да и подключение любых других Lib - тоже становится "ходьбой по минному полю" (Tone и т.п.) нужно внимательно следить какие таймеры уже заняты.
1. После запуска моторчика обороты показывает но после полной остановки не становится в ноль (956)
Логично. rpm у вас пересчитывается только в момент сработки датчика. А при остановленном движке - сработок нет. Функция RPM() - не вызывается.
Поэтому нежно в loop(), поверять если с последней сработки прошло слишком много времени - насильно обнулять rpm
и да... microsold лучше, от греха объявить так:
а не просто long.
2. оч большой разброс в оборотах при стабильном питании 1.5V моторчика
Можете немного "усреднить". Заведите дополнительную переменную counter. И в RPM() - увеличивайте ее. И только когда она накопит, например 20-ть сработок, обнуляем ее и пересчитываем rpm переменную (естественно учтя что у нас теперь замеряно время не между каждой сработкой, а межку каждой 20-той сработкой).
offtop: заметил на фото "полиморфус". Реально круто/удобная штука ;) для подобных игр.
Извиняюсь, что пропал. Неожиданно в больницу загремел.
Всем спасибо за советы, нарыл темку и сварганилскопипастил :) тахометр из нее http://robocraft.ru/blog/electronics/594.html
по тестам работает норм вот только сравнить бы с каким нибудь эталоном.
вот что вышло в предварительном варианте
PS: Да Вы правы полиморфус классная штука не жалею что купил :)
как можно удалять свои сообщения? Дубляж вышел