Простой регулятор коллекторного двигателя с реверсом на ATtiny25

ooogo

Схему и плату мне прислал 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, протеус, схема, печатка.
Буду рад конструктивно критике и помощи в оптимизации разводки платы.

ESC_tiny25.zip

1 month later
Alexey2

А с какой точностью у вас длина импульса высчитывается?
я не до конца еще осознал что у вас происходит в коде.
Я у себя сделал запуск таймера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;

Alexey2

в случае 16 разрядного таймера да, а у аттини*5 только два восьми разрядных
У автора в коде есть место где он по переполнению таймера инкрементирует переменную которая за длину импульса отвечает. а как это дальше масштабируется и пересчитывается я не понял((

Евгеньич

Тогда можно сделать две переменных, в одной щитать кол-во переполнений, в другой значение таймера после спада импульса

Alexey2

наверно так и сделаю. по крайней мере попытаюсь) потому что не всегда понимаю что происходит в коде)) хорошо осциллограф есть можно посмотреть что на что влияет

Евгеньич

Или еще один вариант, написать программный счетчик (на временных задержках в 1 мкс), Если подразумевается использование коллекторного регулятора на земноводной модели, то и 8-и битного разрешения за глаза

Alexey2

все оказалось гораздо проще) у топик стартера в коде есть строчка pulse_length=(count_length<<8)+temp;
temp это текущее значение таймера,
counb_lengt это количество переполнений. как раз то что нужно было осознать. и без Вас наверно бы долго думал что к чему\\

Евгеньич:

на земноводной модели, то и 8-и битного разрешения за глаза

модель земноводная, микроэко для бассейнов. да и просто корабль тоже пойдет… сегодня перепишу заново посмотрю что получится

2 months later
V_Alex
ooogo:

Так как я в пиках ничего не понимаю, то решил заменить PIC12F675 на ATtiny25…

Сама схема (особенно выходной каскад) интересна для слаботочных применений на транзисторах с малой емкостью затвора, поскольку для сильноточных управление верхними ключами становится проблематичным (их вообще лучше переключать только при реверсировании). Но при этой схеме на управление выходами нужно всего две лапки контроллера. Ресурсы тини25 тут явно избыточны, достаточно тини5 😃 Это вариант с питанием от шины приемника (2-3А) и без отсечки:

ooogo
V_Alex:

для сильноточных управление верхними ключами становится проблематичным (их вообще лучше переключать только при реверсировании).

Переписал, без отсечки.

ESC_tiny25_2.zip