Простой регулятор коллекторного двигателя с реверсом на ATtiny25
Схему и плату мне прислал s0ll2, за что ему благодарность от меня. Так как я в пиках ничего не понимаю, то решил заменить PIC12F675 на ATtiny25, по интернет магазину на 10 руб. дороже. Большинство функций проги работает на аппаратных ресурсах контроллера. По внешнему прерыванию запускается таймер1 и измеряет ширину приходящих импульсов. На таймере0 работает быстрый ШИМ. ШИМ имеет 255 шагов, формула связи ширины управляющих импульсов с ШИМ простая (pulse_length±1500)/2+5, где pulse_length ширина управляющих импульсов в микросекундах. Математику можно навернуть любую 80% процессорного времени свободны и 1,5 КБт флеши. Отсечка работает на встроенном компараторе, при разряде ниже порога отключает двигатель и включает светодиод. Порог делителя R7 R8 можно настроить любой, отключение происходи ниже 1,1В на R7. Доступны следующие частоты ШИМ 31,25 КГц, 3,9 КГц, 488,3 Гц, 122,0 Гц, 30,5 Гц. В протеусе погонял, в железе не собирал. В архиве проект WinAVR, протеус, схема, печатка.
Буду рад конструктивно критике и помощи в оптимизации разводки платы.
Привет пользователям партала vrtp!
А с какой точностью у вас длина импульса высчитывается?
я не до конца еще осознал что у вас происходит в коде.
Я у себя сделал запуск таймера1 по переднему фронту и считывание значения по заднему. частота таймера 125кГц соответсвенно точность порядка 8мкс\\ а хотелось бы побольше. можете помочь?
Может мой опыт пригодится, кину свои пять копеек.
У меня в LRS канальные импульсы считываются без внешних прерываний, всё построено на циклах while, 16-и разрядный таймер молотит с частотой 1/8 тактового генератора, то есть 1000кГц, то есть 1 тик в микросекунду. Вот код, из комментов думаю всё понятно:
while(!PPM_IN){};//дожидаюсь высокого уровня и запускаю счётчик
TCNT1H=0;
TCNT1L=0;
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
while(PPM_IN){};//дожидаюсь низкого уровня и считываю его
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
PWML = TCNT1L;//подсчёт длительности канала
PWMH = TCNT1H;
в случае 16 разрядного таймера да, а у аттини*5 только два восьми разрядных
У автора в коде есть место где он по переполнению таймера инкрементирует переменную которая за длину импульса отвечает. а как это дальше масштабируется и пересчитывается я не понял((
Тогда можно сделать две переменных, в одной щитать кол-во переполнений, в другой значение таймера после спада импульса
наверно так и сделаю. по крайней мере попытаюсь) потому что не всегда понимаю что происходит в коде)) хорошо осциллограф есть можно посмотреть что на что влияет
Или еще один вариант, написать программный счетчик (на временных задержках в 1 мкс), Если подразумевается использование коллекторного регулятора на земноводной модели, то и 8-и битного разрешения за глаза
все оказалось гораздо проще) у топик стартера в коде есть строчка pulse_length=(count_length<<8)+temp;
temp это текущее значение таймера,
counb_lengt это количество переполнений. как раз то что нужно было осознать. и без Вас наверно бы долго думал что к чему\\
на земноводной модели, то и 8-и битного разрешения за глаза
модель земноводная, микроэко для бассейнов. да и просто корабль тоже пойдет… сегодня перепишу заново посмотрю что получится
Удачи
Так как я в пиках ничего не понимаю, то решил заменить PIC12F675 на ATtiny25…
Сама схема (особенно выходной каскад) интересна для слаботочных применений на транзисторах с малой емкостью затвора, поскольку для сильноточных управление верхними ключами становится проблематичным (их вообще лучше переключать только при реверсировании). Но при этой схеме на управление выходами нужно всего две лапки контроллера. Ресурсы тини25 тут явно избыточны, достаточно тини5 😃 Это вариант с питанием от шины приемника (2-3А) и без отсечки:
Переписал под реле с отсечкой.
для сильноточных управление верхними ключами становится проблематичным (их вообще лучше переключать только при реверсировании).
Переписал, без отсечки.