ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
17 июля
1439145
Idler (29.05.2024 08:03, просмотров: 593)
Вдруг кому интересно - вроде нигде не описанная тонкость работы таймера AT32F407 (а может, и других...) 

Смотрим RM_AT32F403A_407_EN_V2.05.pdf, стр.223, Figure 14-28 "Upcounting mode and PWM mode A"

Видим, что при CxDT > PR (регистр данных > регистра периода), на выходе пост.'1'. Так и есть, НО:

При CxDT = реальному периоду, то есть, значению PR + 1, при переполнении встает не только флаг переполнения, но одновременно и флаг сравнения.

Казалось бы, значение в регистре PR, на 1 меньшее реального периода, означает использование синхронной схемы.

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

и по следующему тактовому импульсу вместо CNT=PR->PR+1 сделать CNT=PR->0.

А вот хрен. Похоже, счетчик сначала успевает инкрементироваться, а затем уже сброситься. Соответственно, успевает сработать сравнение.

Например, у меня период 4000, PR=3999, DT=4000. На выходе 1, а флаги встают оба одновременно (при DT>4000 флага сравнения, конечно, нет).

И вот тут появляется тонкость - дальнейшая работа программы зависит от порядка обработки флагов в прерывании.

У меня каналы 3 и 4 делают PWM для вентиляторов (ON-OFF, 30Hz), а каналы 1 и 2 меряют длительность импульса с таходатчика.

Т.к. при отключенном питании на таходатчике может быть бардак, прерывания переполнения и сравнения включают и выключают флаг разрешения обработки таходатчика.

Обнаружил, что при полном включении вентилятора перестают меряться обороты. Нашел, что в прерывании сначала обрабатывался флаг переполнения (включение вентилятора и разрешение измерения) а потом непредусмотренный флаг сравнения (несуществующее выключение и, соответственно, запрет). При меньших значениях DT прерывания возникают в разное время и порядок пофиг. В общем, поменял местами и все работает...