natsu 0 15 марта Опубликовано 15 марта · Жалоба Доброго дня, Настроил выход таймера (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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 15 марта Опубликовано 15 марта · Жалоба 2 часа назад, natsu сказал: хотя в документации написано что выход будет установлен сразу и независимо от результата сравнения. Про "сразу" там ничего не сказано. Сказано, установка произойдет от внешнего триггера. Не работал с этим режимом, подробностей не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 16 марта Опубликовано 16 марта · Жалоба А где это? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
natsu 0 16 марта Опубликовано 16 марта · Жалоба В 16.03.2024 в 10:35, tonyk_av сказал: А где это? Это принудительная установка выхода, без других условий. Задача стояла установить активный уровень сразу при запуске. Как обычно, понять работу по документации на 100% невозможно, нужен ещё и осциллограф. Запуск по аппаратным событиям и программно видимо принципиально отличаются... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 16 марта Опубликовано 16 марта · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
natsu 0 16 марта Опубликовано 16 марта · Жалоба В 16.03.2024 в 12:35, Arlleex сказал: Вы не правильно понимаете суть замысла бита OCxFE. А суть очень проста. Проблема в том, что OCxFE в данном случае вообще ничего не меняет - ширина импульса просто зависит от CCR. Если поставить CCR=1 то импульс максимально длинный с задержкой на один такт, а если CCR=ARR то импульс самый короткий (в один такт счёта) с максимальной задержкой от команды старта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 16 марта Опубликовано 16 марта · Жалоба 1 час назад, natsu сказал: Проблема в том, что OCxFE в данном случае вообще ничего не меняет - ширина импульса просто зависит от CCR. Если поставить CCR=1 то импульс максимально длинный с задержкой на один такт, а если CCR=ARR то импульс самый короткий (в один такт счёта) с максимальной задержкой от команды старта. Да, все соответствует в т.ч. моему описанию выше. Ширина импульса будет равна ARR - CCR (при OCxFE == 0) или ARR - начальный CNT (при OCxFE == 1). Задержка до начала импульса будет равна CCR - CNT или 3 такта соответственно. Проблема в том, что это точно будет работать при запуске от внешнего триггера, но не факт (я не проверял), что при ручном запуске таймера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 17 марта Опубликовано 17 марта · Жалоба 15 часов назад, Arlleex сказал: чтобы эта шайтан-машина работала правильно, начальные условия должны удовлетворять CNT < CCR <= ARR. Вы уверены, что именно так работает? С STM32F7 я не работал, но например в таймерах XMC4xxx регистры периода работают по условию ==. Без всякого больше/меньше. Проверял также на STM32F103 - там по-крайней мере регистр периода (ARR) также работает по ==, а не по <=. Т.е. - если в прерываниях периода загружать в CNT значение = (1 << 16) - (ARR + 1) и таймер считает вверх, то частота этих прерываний уменьшается ровно в 2 раза; если загружать = (1 << 16) - (ARR + 1) * 2, уменьшается ровно в 3 раза. В документации STM32F103 этот момент описан неясно. Поэтому пришлось проверять. И работа таймера по == даёт больше возможностей программисту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 17 марта Опубликовано 17 марта · Жалоба 8 часов назад, jcxz сказал: Вы уверены, что именно так работает? С STM32F7 я не работал, но например в таймерах XMC4xxx регистры периода работают по условию ==. Без всякого больше/меньше. Проверял также на STM32F103 - там по-крайней мере регистр периода (ARR) также работает по ==, а не по <=. Я говорю про начальные условия (состояния регистров), при которых будет работать формирование импульса заданной ширины в One Pulse Mode. Привел цитату из RM. Естественно, сами компараторы срабатывают по ==. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться