Перейти к содержанию
    

Таймер и output compare (STM32F7)

Доброго дня,

Настроил выход таймера (tim3) на выход (gpioc8) и столкнулся с тем, что включение флага OCxFE никак не влияет на работу, выходной импульс всё равно начинается с значения CCRx, хотя в документации написано что выход будет установлен сразу и независимо от результата сравнения. Баг STM32F746 или я что-то упустил? Кто-нибудь сталкивался?

	TIM3->CR1=TIM_CR1_ARPE | TIM_CR1_OPM;	// одновибратор
	TIM3->CCER=TIM_CCER_CC3E;				// выход в порт МК
	TIM3->CCMR2=  TIM_CCMR2_OC3PE 		// требование документации
				| TIM_CCMR2_OC3FE		// форсированый выход
				| TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_0;	// PWM2
	TIM3->PSC=(ValueTIM1/10000)-1;	// 10 кГц (0,1 мс)
	TIM3->ARR=10-1;					//  1 мс
	TIM3->CCR3=1; // --------- без этого никак! но почему? ---------
	TIM3->EGR=TIM_EGR_UG;			// запись конфигурации
...
...
	TIM3->CR1=TIM_CR1_ARPE | TIM_CR1_OPM | TIM_CR1_CEN;
  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, natsu сказал:

хотя в документации написано что выход будет установлен сразу и независимо от результата сравнения.

Про "сразу" там ничего не сказано. Сказано, установка произойдет от внешнего триггера.

image.thumb.png.3924dfdadfa661759d38080b4c51bc9c.png

Не работал с этим режимом, подробностей не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 16.03.2024 в 10:35, tonyk_av сказал:

А где это?

image.png.33786437d0f3b0b39a06eb926008eac2.png

Это принудительная установка выхода, без других условий. Задача стояла установить активный уровень сразу при запуске. 

Как обычно, понять работу по документации на 100% невозможно, нужен ещё и осциллограф. Запуск по аппаратным событиям и программно видимо принципиально отличаются...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, natsu сказал:

Доброго дня,

Настроил выход таймера (tim3) на выход (gpioc8) и столкнулся с тем, что включение флага OCxFE никак не влияет на работу, выходной импульс всё равно начинается с значения CCRx, хотя в документации написано что выход будет установлен сразу и независимо от результата сравнения. Баг STM32F746 или я что-то упустил? Кто-нибудь сталкивался?

Вы не правильно понимаете суть замысла бита OCxFE. А суть очень проста.

Есть таймер. У него есть режим активации (например, включения счета) от внешнего события. Также предусмотрен режим генерации PWM, а режим одновибратора есть частный его случай (генерация одного периода). В CCR записывается задержка до формирования первого фронта импульса, а в ARR - значение, при котором будет сформирован второй (задний) фронт импульса и выключится таймер.

Так вот, для того, чтобы эта шайтан-машина работала правильно, начальные условия должны удовлетворять CNT < CCR <= ARR. Отсюда видно, что с момента получения сигнала включения таймера от внешнего триггера до генерации первого фронта должно пройти минимум CCR + (5, вроде, по документации) циклов синхронизации.

А теперь представьте ситуацию, когда импульс должен начать формироваться максимально быстро после получения триггера запуска таймера. Никаких задержек в виде отсчета CCR до первого фронта импульса не должно быть. Поэтому: при установленном OCxFE таймер при получении триггера старта немедленно (а если точнее, всего лишь строго 3 цикла) формирует первый фронт на выходном пине (как будто произошло событие равенства CNT == CCR). Затем, при достижении счетчиком CNT значения CCR, ничего не происходит. А потом счет доходит до ARR, ножка формирует второй фронт и таймер выключается.

P.S. Если у Вас вопрос только в том, почему требуется запись в CCR == 1, то я выше привел требование документации насчет запуска режима OPM для генерации импульса:

Цитата

A pulse can be correctly generated only if the compare value is different from the counter initial value.
Before starting (when the timer is waiting for the trigger), the configuration must be:
- In upcounting: CNT<CCRx ≤ ARR (in particular, 0<CCRx),
- In downcounting: CNT>CCRx.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 16.03.2024 в 12:35, Arlleex сказал:

Вы не правильно понимаете суть замысла бита OCxFE. А суть очень проста.

Проблема в том, что OCxFE в данном случае вообще ничего не меняет - ширина импульса просто зависит от CCR. Если поставить CCR=1 то импульс максимально длинный с задержкой на один такт, а если CCR=ARR то импульс самый короткий (в один такт счёта) с максимальной задержкой от команды старта. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, natsu сказал:

Проблема в том, что OCxFE в данном случае вообще ничего не меняет - ширина импульса просто зависит от CCR. Если поставить CCR=1 то импульс максимально длинный с задержкой на один такт, а если CCR=ARR то импульс самый короткий (в один такт счёта) с максимальной задержкой от команды старта. 

Да, все соответствует в т.ч. моему описанию выше. Ширина импульса будет равна ARR - CCR (при OCxFE == 0) или ARR - начальный CNT (при OCxFE == 1). Задержка до начала импульса будет равна CCR - CNT или 3 такта соответственно.

Проблема в том, что это точно будет работать при запуске от внешнего триггера, но не факт (я не проверял), что при ручном запуске таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, Arlleex сказал:

чтобы эта шайтан-машина работала правильно, начальные условия должны удовлетворять CNT < CCR <= ARR.

Вы уверены, что именно так работает?

С STM32F7 я не работал, но например в таймерах XMC4xxx регистры периода работают по условию ==. Без всякого больше/меньше. Проверял также на STM32F103 - там по-крайней мере регистр периода (ARR) также работает по ==, а не по <=.

Т.е. - если в прерываниях периода загружать в CNT значение = (1 << 16) - (ARR + 1) и таймер считает вверх, то частота этих прерываний уменьшается ровно в 2 раза; если загружать =  (1 << 16) - (ARR + 1) * 2, уменьшается ровно в 3 раза.

В документации STM32F103 этот момент описан неясно. Поэтому пришлось проверять.

И работа таймера по == даёт больше возможностей программисту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, jcxz сказал:

Вы уверены, что именно так работает?

С STM32F7 я не работал, но например в таймерах XMC4xxx регистры периода работают по условию ==. Без всякого больше/меньше. Проверял также на STM32F103 - там по-крайней мере регистр периода (ARR) также работает по ==, а не по <=.

Я говорю про начальные условия (состояния регистров), при которых будет работать формирование импульса заданной ширины в One Pulse Mode. Привел цитату из RM.

Естественно, сами компараторы срабатывают по ==.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...