Какая нужна микросхема часов для изготовления спидометра с AVR

Я собираю хот-род и решил сам сделать спидометр с трехзначным дисплеем. Я планирую использовать микротроллер Atmel AVR (вероятно, ATmega32). Мне нужны часы CMOS, которые я могу использовать для сравнения времени, чтобы спидометр был максимально точным.

  1. Какой хороший чип часов использовать?

  2. Как подключить его к AVR?

  3. Как мне правильно использовать его в программном обеспечении?

Вот что у меня есть до сих пор:

  • Генератор импульсов для передачи (знаковая волна, будет использовать схему преобразователя прямоугольных импульсов 4069 с автономным питанием, но отключать питание от PS, а не от волны)
  • Nixie трубки и розетки
  • Микротроллер и сокет Atmel
  • Микросхемы лампового драйвера Nixie
  • Разъем для программирования AVR

Я хотел бы сделать один заказ в Mouser и получить оборудование как можно скорее, поэтому любая помощь приветствуется.

Ответы (7)

Ваш спидометр должен измерять время, прошедшее между двумя импульсами, и ему не нужно знать время суток.

Я бы подумал об использовании калиброванного внутреннего генератора AVR. Его отклонение +-1% от номинальной частоты, вероятно, точнее, чем окружность шин вашего автомобиля.

Если этого недостаточно для вас, потратьте дополнительные пятьдесят центов на кварцевый генератор.

вы получите только +/- 1% отклонение, если вы запустите скрипт калибровки atmel на чипе, я полагаю
Может быть. Я написал свою собственную калибровочную прошивку только для того, чтобы узнать, что заводской OSCCAL отличался всего на 1 (не на 1%) от идеальной калибровки. И USART отлично работал с калибровкой или без нее.
Заводская «калибровка» Atmel имеет точность всего 10%. У них есть заметка о применении для повышения этого до 1%. PIC OTOH имеют заводскую калибровку до 1%.

Я бы не стал сильно беспокоиться о точности внутреннего генератора AVR, он достаточно хорош по сравнению с накачкой шин, которая сильно зависит от температуры дня, асфальта, агрессивности вождения и т. д., это может изменить окружность в серьезном проценте. . Как только вы сможете выполнить калибровку и получить максимум от гаджета, все в порядке. Информативный спидометр делает именно это, сообщая вам, если он показывает 37 миль в час вместо 36 миль в час, это не является драматической или травмирующей разницей.

Вероятно, вы можете использовать осциллятор чипов. Я сделал то же самое (ну, я использовал двухстрочный ЖК-дисплей) со старым PIC. Датчик на трансмиссии посылает так много тысяч импульсов на милю, что дает вам достаточно места для калибровки размера шин, передаточных чисел и т. д. Таким образом, вы можете выбрать любое количество решений от измерения времени между отдельными импульсами до измерения 10 импульсов или что-то в этом роде, с тайм-аутом, когда вы четко знаете, что машина остановилась, а скорость равна нулю. который вам понадобится для любого решения. если вы знаете или вычисляете количество импульсов на милю, нетрудно посчитать время между импульсами на разных скоростях, а затем добавить плюс или минус точность часов на микроконтроллере, чтобы узнать, какова ваша ошибка скорости. Я предполагаю, что аналоговая и временная природа датчика и проводов сами по себе будут иметь такую ​​​​же ошибку, как и часы, которые вы используете в качестве эталона. (дрожание импульсов с фиксированной частотой). Вы также можете добавить отстой в трансмиссию, изменение размеров шин (когда вы отклеиваете, нагружаете шину тормозом или акселератором и т. Д.), Вы, вероятно, в порядке, я бы начал с внутреннего генератора.

Используя внешний или внутренний осциллятор, вы можете иметь таймер, отсчитывающий каждую секунду или что-то в этом роде, и подсчитывать тики спидометра в секунду и обновлять дисплей (трубки) на основе этого (вместо измерения между каждым тиком спидометра). Самая большая проблема, с которой я столкнулся, когда я это делал, заключалась не в распознавании или синхронизации импульсов, у меня было чертовски много времени, когда я делил на десятки, чтобы напечатать скорость в десятичном формате, шестнадцатеричном было легко, восьмеричном еще проще, но десятичном, когда пространство программы составляло кбайт или меньше, а память измерялась в байтах. у вашего avr, вероятно, больше ресурсов, чем у меня в то время, и хороший (и доступный) компилятор C.

Хотелось бы увидеть фотки, когда заработаете...

Вот несколько советов:

http://winavr.scienceprog.com/example-avr-projects/measuring-motor-speed-and-display-result-on-lcd.html

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=642909

Как уже говорили другие, вам не нужны часы реального времени, если вы не заботитесь о дате и времени, вам просто нужно измерить время между вращениями.

Спасибо, я просмотрел ссылки, и я думаю, что мы можем обойтись без этого. На рынке есть спидометр, для калибровки которого вы едете по шоссе и один раз нажимаете кнопку калибровки на отметках 2 мили. это будет подсчитывать, сколько импульсов в миле, а затем мы можем рассчитать скорость на основе этих чисел и использовать напарника для подтверждения. Теперь все, что мне нужно, это выбор простого транзистора и резистора и реализация, и я готов сделать заказ.
Я также хочу иметь высоковольтные указатели поворота с использованием неоновых ламп, поэтому я решил использовать 2 резистора, чтобы разделить напряжение лампы поворота, а затем пропустить его через транзистор. У меня есть куча транзисторов mpsa42, я думаю, они будут работать. Спасибо, Эд.

Я бы не стал доверять бортовому радиоуправлению в автомобильном приложении для измерения скорости. Посмотрите на характеристику дрейфа по температуре. Какие экстремальные температуры вы ожидаете там, где вы живете или собираетесь путешествовать?

Простой кварц и два колпачка дадут вам осциллятор гораздо более точный, чем вам нужно.

Резонатор, наверное, подойдет. Некоторые из них имеют встроенные конденсаторы. Обычно они дешевле, чем кристаллы, хотя для хобби-проектов я думаю, что считать копейки немного глупо.

Я только что закончил аналогичный проект для друга, он купил гольф-кар и хотел установить на него SpeedOMeter. Это было просто. Прошу его изготовить диск, который бы крепился к одной из передних шин, магниты встроенные в диск, магнитный датчик (eBay). Датчик меняет свой логический вывод всякий раз, когда магнит приближается к его голове. Он измерил окружность шины и дал мне примерный размер 52,8 дюйма, что означает, что один оборот в секунду означает 3 мили в час. Исходя из этого, я попросил его установить в диск 15 маленьких магнитов, если я буду фиксировать импульсы от датчика в течение 200 мс, это даст мне 3 счета, то есть 3 мили в час. Это было легко. Но может потребоваться калибровка, его измерения могут быть неправильными, беговая шина может иметь другую окружность и т. д. Ничего страшного. Его удовлетворили бы два 7-сегментных синих светодиодных дисплея (1,5 дюйма). высокий) для обозначения скорости. Я выбираю простой AtMega88 (в ящике). AtMega может управлять дисплеем напрямую, без транзисторов, если ток не слишком велик. Приятно то, что в синем большом дисплее используются два светодиода последовательно под каждым сегментом, что дает двойную яркость при одном и том же токе одного светодиода. Но была загвоздка: два синих светодиода требуют более 5 В, им требуется 6,3 В, чтобы иметь хорошую яркость дневного света. Он купил 7 сегментов в версии с общим катодом, что сложного. AtMega не может работать от 6,3 В, поэтому нам нужно было создать виртуальную землю на +1,3 В постоянного тока для AtMega, в то время как заземление дисплея будет реальным нулевым напряжением. Решение было простым: подавать на AtMega напряжение 6,3 В, но его ZeroV подключался к реальной земле через два простых кремниевых диода 1N914 или 1N4148. AtMega будет иметь +5 В или меньше между контактами VCC и GND, а дисплей будет питаться от 6,3 В непосредственно от контактов порта ввода-вывода от AtMega. Это сработало хорошо. Теперь предохраните часы, чтобы использовать внутренний генератор 8 МГц. Подключил датчик пульса напрямую к контакту T1 (PD5), запрограммировал счетчик на подсчет, когда контакт T1 поднимается, постоянно. Запрограммированный Counter1 (16 бит) для подсчета от определенного значения и прерывания, когда счетчик достигает нуля, это прерывало меня каждые 200 мс. В подпрограмме прерывания просто прочитайте счетчик T1 и обнулите его. Сохраните прочитанное значение в 4 регистра и переместите их вперед, чтобы сохранить только последние 4 чтения в этих регистрах. Затем сложите их все и разделите на четыре, просто сделав логический сдвиг вправо дважды. Благодаря этому уменьшилась нестабильность, например, между значениями 3 и 4 на дисплее. Использовали простую таблицу сегментов, чтобы загораться на каждом двойном дисплее, от -0 до 29, и вуаля, просто найдите таблицу по значению среднего значения и сбросьте ее на контакты порта, управляющие 7-сегментным дисплеем. Работал как шарм. Ах, тележка для гольфа работает с максимальной скоростью 20 миль в час, это причина того, что таблица достигает только 29. Калибровка прошла легко. Простая перемычка заставляет AVR отключать прерывание 200 мс, считать импульсы с вывода T1, начиная с нуля, пока он ведет тележку ровно, точно 22 фута, что составляет 264 дюйма. Если окружность шины составляет ровно 52,8 дюйма, она совершит ровно 5 оборотов, ровно 75 импульсов на датчике. Теперь математика. Счетчик 1 переполняется каждые 200 мс при загрузке определенным значением, то есть делением 8 МГц с прескалером 256, какой именно номер 31250. Что я делаю сейчас? умножьте 31250 на 75 (это фиксированная константа 2343750 = 0x23C346) и разделите на фактические импульсы, подсчитанные во время движения на 22 фута. Не желая создавать полный хаос 24-битного деления, я просто вычел значение счетчика импульсов из 0x23C346 достаточное количество раз, чтобы достичь нуля, это не гонка скорости вычислений, это сработало. Бадабим. У меня будет новое значение для загрузки в переполнение счетчика 1, и у меня будет другое количество времени, 200 мс или другое, что переполнение счетчика 1 прерывает меня, чтобы прочитать значение счетчика импульсов T1 в течение этого времени. Легкий. Теперь все, что пользователь должен сделать для калибровки, это вставить перемычку, запустить 22 фута и удалить перемычку. При удалении перемычки выполняется расчет, и новое значение counter1 сохраняется в eeprom. Теперь каждый раз, когда он включает устройство, он считывает из eeprom значение переполнения counter1 и готов к работе. Легко, менее 100 байт программирования на ассемблере. Я люблю этот язык. Ему понравилась идея использования AVR, так как вначале он хотел сделать это с помощью простых счетчиков и таймеров в чистой логике TTL. Теперь он хочет, чтобы я обновил AVR, чтобы сделать управление мигающими лампами и таймерами, и так далее.