Свежие обсуждения
Микроконтроллеры

Какой тип таймера ATMega16 лучше использовать?

1 2

Есть задача: Формировать бесконечно пачки из 58 импульсов с паузой в 2 импульса между ними на одном выходе МК, а на другом - на каждую нечётную пачку, т.е. на каждые 58 импульсов - один.

Вопросы: Какой тип таймера ATMega16 лучше использовать? 8-ми или 16-ти разрядный? В каком режиме таймер лучше всего включить (Normal или CTC)? И ещё, можно ли с помощью только 16-разрядного таймера (8-ми разрядные для ШИМ-а пригодились бы ещё) решить мою задачу, а то непонятно, как его так сконфигурировать, чтобы он одному своему выходу он досчитывал до 58, а потом передавал управление второму своему выходу?

 

ВременнУю диаграмму нарисуйте. И длительность укажите. И частоту генератора Меги.

 

Digital: В каком режиме таймер лучше всего включить

Режима прерывания по переполнению одного таймера достаточно. Делал такую вещь для вспомогательного оборудования, и для 60-2, и для 36±2 (для V6 и V8).

 

chav1961: ВременнУю диаграмму нарисуйте. И длительность укажите. И частоту генератора Меги.

Взаимное расположение сигналов - в приложенном рисунке. Частота кварца меги 8МГц (т.к. имеется парочка).

Тип импульсов - меандр на выходе 1, с частотой 50 Гц.

На выходе 2 - один импульс на каждую нечётную пачку по выходу 1. Длительность импульса на выходе 2 не особо принципиальна, важно лишь, чтобы его формирование начиналось в момент формирования "дырки" на выходе 2.

 

GM: Делал такую вещь для вспомогательного оборудования, и для 60-2, и для 36±2 (для V6 и V8).

А как вы задавали точно такую "некруглую" частоту, например 27.3Гц (820об/мин.)? А формулой для расчета частота-обороты такой пользовались?:

Частота искрообразования: f=nN/120 (для четырехтактного двигателя, для двухтактного - делить на 60), где f - частота искрообразования, n - скорость вращения коленвала (об/мин), N - число цилиндров.

 

Численно, в Герцах, частота ваших импульсов выражается по формуле F=N, где N - частота вращения кранкшафта, об/мин. Да и частота не нужна, вам нужно устанавливать период переполнения вашего таймера в тактах проца, T=8000000/N. Для 820 об/мин Т=9756 тактов (мне больше нравится говорить МЦ-машинных циклов). Для 6000 об/мин Т=133 такта. Точности для практики более чем достаточно.

 

Тогда получается, что таймер надо использовать по-любому 16-разрядный, т.к. 8-ми разрядный до числа Т=9756 не сможет досчитать? Или есть какие-то варианты с 8-ми разрядным?

 

Нет, можете использовать 8-разрядный. Просто Вам нужно 38 раз поймать прерывание по переполнению, и один раз после этого - прерывание по OCR, причем в OCR должно быть число 28. 38 * 256 + 28 = 9756, что и требовалось. Таймер после последнего OCR нужно будет остановить, обнулить, и запустить заново. Частота импульсов у вас очень низкая, можете изгаляться как хотите Возможно, в OCR нужно не 28, а 28 +/- 1 - тут нужно детально смотреть даташит, что, честно говоря, влом Проще проверить экспериментально.

 

chav1961: Проще проверить экспериментально. ...возможно, в OCR нужно не 28, а 28 +/- 1....

Согласен, это уже дело отладки. А число 28 +/-1 в регистр OCR0 записать нужно будет после прерывания по OCR, я правильно вас понял?

 

chav1961: Таймер после последнего OCR нужно будет остановить, обнулить, и запустить заново.

А в функции обработки прерывания как заставить таймер пропустить точно два импульса? Непонятно сколько времени пройдет в процессе остановки-обнуления-запуска? Функцию delay не хочется использовать, да и мне кажется неправильно это?