Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 16:50:27

Никак не могу получить ровные края генерации ШИМ по двум каналам.
Инициализация таймера:
Код:
   RCC->APB1RSTR |= RCC_APB1RSTR_TIM3RST;
   __NOP();__NOP();__NOP();
   RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM3RST;

   GPIOA->ODR &= ~( GPIO_ODR_ODR6 | GPIO_ODR_ODR7 );
   GPIOA->CRL &= ~( GPIO_CRL_CNF6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE6 | GPIO_CRL_MODE7 );
   GPIOA->CRL |= ( GPIO_CRL_MODE6 | GPIO_CRL_CNF6_1 | GPIO_CRL_MODE7 | GPIO_CRL_CNF7_1 );

   uint32_t arr = 200;
   uint32_t ccr = arr/2;
   uint32_t syf = 56000000;

   TIM3->CR2 |= TIM_CR2_MMS_1; // TRGO trigger

   TIM3->PSC = syf/arr/freq - 1;
   TIM3->ARR = arr - 1;
   TIM3->CCR1 = ccr;
   TIM3->CCR2 = ccr;
   TIM3->CCMR1 |= ( TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 ); // TIM3_CH2 PWM mode 1
   TIM3->CCMR1 |= ( TIM_CCMR1_OC1M ); // TIM3_CH1 PWM mode 2
   TIM3->DIER |= TIM_DIER_UIE;
   TIM3->EGR = TIM_EGR_UG;
   TIM3->CR1 |= TIM_CR1_ARPE;
   TIM3->CCER |= ( TIM_CCER_CC1E | TIM_CCER_CC2E );
   TIM3->CR1 |= TIM_CR1_CEN;

Прерывание:
Код:
void TIM3_IRQHandler(void)
{
   static uint8_t count = 0;
   if (TIM3->SR & TIM_SR_UIF)
   {
      if(++count > 4)
      {
         count = 0;
         TIM3->CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E );
         TIM3->CR1 &= ~TIM_CR1_CEN;
      }
      TIM3->SR &= ~TIM_SR_UIF;
   }
}


На старте ситуация такая:
start.png
(8.16 KiB) Скачиваний: 444


В конце вот такая:
stop.png
(9.09 KiB) Скачиваний: 464


Как сделать ровные края? Что бы первый импульс был 12.5 мкс, и в конце не было этого импульса.

Re: stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 17:33:07

На сколько я понимаю - таймер здесь не при делах
Ты же сам дрыгаешь CCER

Добавлено after 4 minutes 29 seconds:
И может TIM1 удобней, у него " счетчик импульсов" есть

Да и BDTR у него есть
Последний раз редактировалось a797945 Сб фев 20, 2021 18:21:51, всего редактировалось 1 раз.

Re: stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 17:37:54

freq предлагаете угадывать?
Чтоб "в конце не было этого импульса" нужно использовать теневые compare-регистры.

Re: stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 19:24:14

uint32_t freq = 40000;
ок?
первый таймер уже не использовать, плата в устройстВАХ уже готова и выводы сделаны для РА6 и РА7
раньше (ну и сейчас) был ШИМ на РА6 и он был mode 2, так что косяков с краями не было, РА7 был выводом общего назначения, теперь его решено использовать для вывода инвертированного сигнала

Re: stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 21:26:25

если он будет ВСЕГДА инверсным, то и проблемы не будет.
вы же - то подключаете ноги к каналам таймера, то отключаете от каналов.
мне кажется дело в этом.

у вашего камня map`ом подходящие линии TIM1 на эти ноги не коммутируются?
я наизусть МК не знаю :dont_know:

Re: stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 22:08:59

если он будет ВСЕГДА инверсным, то и проблемы не будет.
вы же - то подключаете ноги к каналам таймера, то отключаете от каналов.
А где он такое делает?? :shock:
Имхо - в ISR ТС просто выключает генерацию после 4-х периодов. Что видно и на картинках.

PS: Хотя подробно биты конфигурации я не проверял, сужу по беглому взгляду, может ошибаюсь...

Добавлено after 3 minutes 39 seconds:
сообщение не несёт смысловой нагрузки

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

Re: stm32f103c8 Ровные края ШИМ

Сб фев 20, 2021 23:36:41

отработав 4 периода, что заставило на второй линии "1" (как положено) вдруг кувыркнуться в "0",
из того что вижу только :
TIM3->CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E );
могу заподозрить.

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 01:08:36

TIM3->CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E );
могу заподозрить.

Да, именно это и выключает, а сам импульс формируется из задержки входа в прерывание.

Автору надо пояснить, что он хочет получить в конце. Что бы оба сигнала были в ноль, или один низкий, другой высокий?
Так же не ясно, только первый импульс имеет неправильную длительность или все?

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 09:58:43

очевидно что оба в ноль
либо вы что-то недопонимаете, либо что-то путаете, но биты CC1E и CC2E регистра CCER подключают выходные контакты, мне нужен этот ШИМ снаружи, а не внутри
если подключать пины этими битами раньше, то и уровень на пине будет высокий (для PWM mode 1) СРАЗУ! а не при старте таймера
работать постоянно таймер не должен, в этом нет смысла (как и в сообщении про теневые регистры без указания их имен и вообще без полезной информации)
таймер должен запуститься, отработать 4 (или сколько я потом захочу) раз и выключиться до следующего запуска. при этом на ногах РА6 и РА7 должны получиться ровные импульсы по 12.5 мкс (ШИМ 40 кГц со скважностью 50%) инвертированные друг к другу, в остальное время там должен быть НОЛЬ!

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 11:16:03

э-ка, как Вас гордыня то ... ;)
и это - "очевидно что оба в ноль" - ни нам ни таймеру совсем не очевидно.

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

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 14:11:27

Я в баньку в 18 пойду
в прерывании видно что я ногу убираю с таймера, но "всплеск" всё равно есть
а когда ставлю - есть лишнее время в начале. и это легко доказать вставив задержку между установкой бита CCxE и запуском таймера
и никакой гордыни нет, изначально задал эти вопросы
видимо это невозможно без вмешательства ещё одного таймера

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 15:08:48

spongebob писал(а):в прерывании видно что я ногу убираю с таймера, но "всплеск" всё равно есть
Вы не учитываете время от конца периода (события для прерывания) до "выключения ноги".

Я в STM'ах не силён, но мне кажется, что там в таймерах есть возможность его вырубить, дав отработать период до конца. Типа, с автоотключением счёта.
Хотя, я могу ошибаться. Лениво RM'ы искать и читать :roll:

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 15:28:13

Сделал как хотел без использования доп таймера

П.С. для людей будущего которых занесут сюда поисковые сервисы - пишите в ЛС, поделюсь мудростью

Re: stm32f103c8 Ровные края ШИМ

Вс фев 21, 2021 15:31:43

Почему бы тут не сказать ? Зачем заставлять людей регистрироваться и писать Вам в личку ? :dont_know:

Re: stm32f103c8 Ровные края ШИМ

Пн фев 22, 2021 09:55:15

самому не доводилось решать эту задачку, ну как вариант:
- переставить прерывание на регистр (чтоб попадать во второй полупериод),
- в обработчике : поднимать OPM (CR1) и маскировать уже не нужный канал например этим OCхM (CCMRх) (100/101),
- буферизация ARR уже есть, добавить для ccr OCхPE (CCMRх),
- до старта записывать чуть меньшие aar и ccr, а стартовав вписать полноразмерные.
или дополнить счет лишним периодом, но первый период спрятать, подключая каналы в работу по очереди в не активную фазу, хоть этим OCхM (CCMRх) .
вроде должно получиться.

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

"люди будущего" наверное будут программировать другие контроллеры и не прикасаясь к клаве :))

Re: stm32f103c8 Ровные края ШИМ

Пн фев 22, 2021 16:34:50

Да... Вот такие люди бывают... Если у кого-то есть решение, то с ними должны поделиться. А если оно есть у них, то фигушки вам всем ...
Как-то они называются, такие люди... Слово забыл... Как же его там .... А, эгоисты, вот ... :)))

Re: stm32f103c8 Ровные края ШИМ

Пн фев 22, 2021 19:21:51

Ну да. Я просил помощи.
Мне тут прилетело очень много "поддержки".
Я сделал сам, с чего вдруг я должен этой информацией делиться?
Кому понадобится - спросите, я обязательно напишу. И напишу не просто слова, а КОД.
Либо имена регистров и их биты.
Но если я не знаю - я не лезу.

Re: stm32f103c8 Ровные края ШИМ

Пн фев 22, 2021 23:12:07

Когда я игрался с WS2815, обнаружил, что нужно либо добавлять в конце буфера лишний нулевой байт, чтобы передать его по DMA, либо же, если работать честно, использовать грязный хак (т.к. по-человечески надо было бы заводить в прерывании по DMA transfer complete прерывание на CC1, но на больших скоростях оно тупо не успевает отработать).

Re: stm32f103c8 Ровные края ШИМ

Вт фев 23, 2021 18:11:22

дел.
на оффтоп поперся - убрал

Re: stm32f103c8 Ровные края ШИМ

Пн апр 19, 2021 19:18:32

В некоторых таймерах STMки есть так называемый Repetition Counter. Тот вообще позволяет
таймеру прощелкать заданное количество полных циклов и остановиться. И это аппаратно.
Ответить