Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Чт сен 12, 2019 04:50:48
Здравствуйте!
Вводные - 1000 оборотов максимум, датчик пока не придумал, мк - атмега8.
Достаточно ли будет для самодельного тахометра такого алгоритма работы:
2 прерывания
первое прерывание INT0 - считывает импульсы с датчика
второе прерывание с частотой 1 раз в секунду перемножает импульсы которые накопились за секунду на INT0 и умножает их на 60, а потом сброс переменной подсчёта импульсов. И так частота обновления каждую секунду?
Вывод на 3 разряда семисегментника.............
Чт сен 12, 2019 06:48:31
Придумаете датчик - будет о чем говорить, пока не о чем. Слишком многое от него зависит.
1000 оборотов - в секунду, в минуту ... в сутки... ?
Чт сен 12, 2019 07:34:02
мне поручили обработку сигнала с датчика и вывод на индикатор...............
Наверное погрешность им не важна - главное чтобы было.......
Чт сен 12, 2019 08:02:59
Прилепите обычный частотомер на логике, не нужно там никаких прерываний.
Против лома нет приема (с)
Чт сен 12, 2019 08:09:30
ЭлектроKOT, судя по фразе умножает их на 60 - 1000 оборотов в минуту. Точнее 0..999, ибо 7-сегментник 3-разрядный.
Ну и, судя по всему, у ТС задача - сделать на МК. (Судя по всему, у студентов начались лабы по работе с МК) Даже если нет задачи - то сделать на восьмой меге гораздо проще сейчас, нежели ваять комплект счетчиков. Особенно, если нужна динамическая индикация.
рокки1945, Зачем вам возиться с INT0 ?
В меге есть шикарный таймер Т1 с внешним счетным входом и подавлением помех.
Используйте его счетный вход.
При этом в качестве секундного таймера берите Т2, у него есть режим СТС, комбинацией этого режима и предделителя можете получить ваш секундный интервал.
В обработчике прочитали значение счетчика Т1 и обнулили его. Прочитмнное умножиди на 60 и отправили в буфер вывода на дисплей.
Единственное, если ваша лабораторная работа будет воплощаться в железе - тактируйте мегу от кварца, иначе ваш тахометр будет врать.
Динамический вывод на 7сементник можете организовать на прерывании по переполнению от таймера 0.
Приоритет у прерываний таймера Т2 выше, чем у Т0 - поэтому вывод на индикатор не должен влиять на обработку Т2.
Можно вообще не использовать прерывание от Т0, а вывод сделать в основной программе в свободное от прерываний время - в цикле опрашивать флаг переполнения таймера, сбрасывать флаг, выполнять цикл действий по выводу на 7сегментник и опять возвращаться в ожилание флага.
Чт сен 12, 2019 08:24:43
goldenandy, это если датчик без дребезга. Иначе надо устранять дребезг программно, что никак не сочетается со счетным входом таймера. Или делать аппаратное устранение дребезга.
Чт сен 12, 2019 09:19:11
ПростоНуб, 1. Какой то антидребезг есть в подавлении помех самим таймером. По сути там чтение 4 раза и мажоритарное голосование.
2. На Int0 разве не надо делать антидребезг ?
3. 1000 об/мин - это 16,66 об/сек. Или 60 мс период.
Если датчик дает сигнал типа меандра, но с дребезгом - получаем полупериод 30 мс. Делаем простейший RC-фильтр с тау около 10 мс. Например 0.1мкФ * 130кОм * 0.7 = 9.1 мс.
Либо прерывание каждую миллисекунду, чтение состояния датчика, программный антидребезг....
Но это всё актуально для реального изделия.
А тут никакого ТЗ - просто сделай тахометр. Какой датчик - мы тебе не скажем. Т.е. это похоже не на реальную разработку, а на лабораторку.
Я бы делал на счетном входе меги + RC-цепочка на входе. Может даже с меньшим тау - 3..4 мс.
И сказал - вот прибор - он считает обороты, как вы и заказывали. На вход требует меандр без дребезга.
Добавлено after 40 minutes 26 seconds:
Вот кстати, мега - это процессор. Что мы ему скажем, то он и будет делать.
Можно считать не число оборотов в секунду, а длительность периода между импульсами от таходатчика.
Если стребовать от таходатчика аппаратный антидребезг и сигнал с чистыми фронтами - можно испльзовать вход захвата Т1, а заполнять таймер от тактового генератора.
Обороты придется получать делением. Но это вообще не проблема, за 60 мс мега выполняет 480 тысяч операций (при такте 8 МГц) - на деление хватит с головой. Минус - на низких оборотах перечет может уйти в переполнение таймера. И это надо отдельно обработать. Плюс - на средних оборотах быстрое обновление показаний, более точные значения (в алгоритме ТС показания кратны 60)....
Для такого алгоритма нужно, что бы в дельту периода тахоимпульсов вблизи верхнего предела уложился хотя бы несколько счетных импульсов.
Смотрим: 60 сек / 999 об.мин = 60060.06 мкс.
60 сек / 998 об.мин = 60120.24 мкс
Итого минимальная дельта периода = 60.18 мкс. При снижении частоты тахоимпульсов эта дельта будет только расти.
Смотим, что у нас по тактированию может Т1. Принимаем тактовую меги в 8 МГц.
С предделителем 256:
8МГц / 256 = 31250 Гц или период 32 мкс. Вроде бы хорошо.
Каждый импульс 32 мкс. в 60 секундах таких импульсов 1875000.
При 999 оборотах (период 60060.06 мкс) таймер насчитает 60060.06/32 = 1876 импульсов. 1875000/1876 = 999.467 = 999 оборотов.
При 998 оборотах (период 60120.24 мкс) таймер насчитает 60120.24/32 = 1878 импульсов. 1875000/1878 = 998.403 = 998 оборотов.
При этом таймер заполнится за 32мкс * 65536 = 2097152 мкс или около 2,1 сек. Т.е. Минимальная частота вращения должна быть такой, что бы между импульсами таходатчика было меньше 2097 мс - это 29 оборотов/мин. И это очень хороший результат, поскольку прямой пересчет импульсов за секунду дает число рассчитаных оборотов всегда кратное 60.
Т.е. ценой увеличения времени пересчета на низких оборотах до 2 сек и, к сожалению, одной 32-битной операции деления, мы получаем тахометр в интервале 30..999 об/мин с погрешностью 1 об/мин.
Чт сен 12, 2019 10:20:02
рокки1945 посмотрите эту старую веточку
https://radiokot.ru/forum/viewtopic.php?f=20&t=24703Тахометр методом измерения периода делается на одном таймере 1.
Спойлер
- Вложения
-
- tahom2313_4led.jpg
- (50.84 KiB) Скачиваний: 404
Чт сен 12, 2019 10:35:44
akl, так на нём я и предложил решение. Плюс на каком то из таймеров динамическую индикацию запилить.
Единственное, 32битное деление для 8битного МК - тяжелая по времени операция
Чт сен 12, 2019 10:49:07
Забыл написать. Включая динамическую индикацию и автопереключение пределов. Да, приходится делить, но главное результат.
Чт сен 12, 2019 10:58:43
akl, пересчет - прерывания по захвату и переполнению.
Динамическая как ? На прерывании по сравнению ? И смысл всё лепить в один таймер, оставляя второй гулять ?
Если изделие конечное и использование второго таймера не планируется, зачем ломать голову, впихивая в один таймер? Спортивный интерес ?
Чт сен 12, 2019 11:04:52
akl, пересчет - прерывания по захвату и переполнению.
Динамическая как ? На прерывании по сравнению?..
Да. В схемах с динамикой все процессы должны быть синхронными.
Чт сен 12, 2019 13:04:09
akl, а как тогда решается стабильная частота динамической индикации, если коэффициент пересчета таймера зависит от периода тахоимпульсов ?
В приведенном выше примере период сброса таймера Т1 гуляет от 2 сек до 30 мсек при оборотах от 30 до 999 об/мин ?
Чуть более подробно опишите свой алгоритм, как у вас сделан подсчет частоты тахоимпульсов и динамическая индикация на одном таймере ?
Чт сен 12, 2019 17:17:06
Вот здесь:
http://www.joyta.ru/6176-samyj-prostoj- ... ttiny2313/схема простейшего частотомера,
Спойлер
в архиве, в конце страницы, лежат модель в протеусе, прошивка и *.asm файл с комментариями, который, при знании программирования можно спокойно переделать под свои условия..
Проблема в том, что комментарии то ли на польском, то ли на чешском.. В общем- Hz..
но, при желании, понять можно..
Чт сен 12, 2019 18:19:44
так пойдёт
TCCR1A = 0;
TCCR1B = 6;//falling
//TCNT1L=0;
//TCNT1H=0;
DDRB |= ~(1<<5);//на выход
PORTB |= 1<<5 ;//подтяжка
в основе
FCV_V = TCNT1L;
FCV_V1 = TCNT1H;
FCV_SUPER = (FCV_V1 <<
|FCV_V;
Чт сен 12, 2019 20:31:33
рокки1945, Эммм.... что это?
Сразу приучите себя не писать магические числа.
TCCR1B = 6;//falling - что такое 6 ?
Запишите хоть вот так
TCCR1B = ( 1 << CS12 ) | (1 << CS11 ); - тогда понятно будет, что вы запускаете таймер в стандартном счетном режиме с источником сигнала - входом Т1 по спадающему фронту.
DDRB |= ~(1<<5);//на выход - это не выход, это вход.
И причем тут порт В, если вход T1 - это порт D, PD5 ?
И зачем так странно вычитывать счетный регистр?
Возьмите 16битную переменную и просто прочитайте в нее TCNT1, компилятор сам сделает последовательность правильного чтения 16-битных регистров таймера.
Пт сен 13, 2019 04:49:22
Да спасибо - переделал
TCCR1A = 0;
TCCR1B = 6;//falling
//TCNT1L=0;
//TCNT1H=0;
DDRD |= ~(1<<5);//на вход
PORTD |= 1<<5 ;//подтяжка
TCCR2 &= 0xf8;
TCCR2 |= 0x01;
OCR2=256-1;
sei();
TIMSK |= (1 << OCIE2);
TCCR2 |= (1 << WGM21);
_ _ _ _ _ _ _ _ _ __
if (FCV_TIME == 31250)
{
FCV_SUPER = TCNT1;
FCV_TIME = 0;
TCNT1 = 0;}
Но не нашёл программный фильтр каким битом выставить....... Придётся от дребезга RC делать
Пт сен 13, 2019 06:54:36
Есть готовый 7сегментный индикатор с дешифратором и счетчиком внутри. к490ип1
Пт сен 13, 2019 09:18:26
рокки1945,
Фильтр есть только для входа захвата
Timer/Counter 1
Control Register B – TCCR1B
Bit 7 – ICNC1: Input Capture Noise Canceler
Setting this bit (to one) activates the Input Capture Noise Canceler. When the noise canceler is
activated, the input from the Input Capture Pin (ICP1) is filtered. The filter function requires four
successive equal valued samples of the ICP1 pin for changing its output. The Input Capture is
therefore delayed by four Oscillator cycles when the noise canceler is enabled.
Так что действительно, делать RC-цепочку на входе. 100нФ/100..150кОм.
Офф. И еще раз:
TCCR2 &= 0xf8;
TCCR2 |= 0x01;
Без заглядывания в даташит я не могу определить, что вы хотите добиться этими числами.
Плюс если вы захотите переехать на другой МК, где в управляющем регистре биты расположены по другому, вы получите трудно находимую ошибку.
Если это разовая лабораторная работа - то фиг с ним. А если вы планируете работать с микроконтроллерами и дальше - уходите от таких магических цифр. (И это касается не только регистров МК, а и программирования вообще. )
Пт сен 13, 2019 09:26:22
делать RC-цепочку на входе. 100нФ/100..150кОм.
А вот этого я бы не советовал. Затягивание фронтов на цифровых входах ни к чему хорошему не приводят. Тогда уж ставить между ФНЧ и входом МК триггер Шмитта. Например на LM358 или NE555 по выбору.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.