Кто любит RISC в жизни, заходим, не стесняемся.
Сб фев 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;
}
}
На старте ситуация такая:
В конце вот такая:
Как сделать ровные края? Что бы первый импульс был 12.5 мкс, и в конце не было этого импульса.
Сб фев 20, 2021 17:33:07
На сколько я понимаю - таймер здесь не при делах
Ты же сам дрыгаешь CCER
Добавлено after 4 minutes 29 seconds:И может TIM1 удобней, у него " счетчик импульсов" есть
Да и BDTR у него есть
Последний раз редактировалось
a797945 Сб фев 20, 2021 18:21:51, всего редактировалось 1 раз.
Сб фев 20, 2021 17:37:54
freq предлагаете угадывать?
Чтоб "в конце не было этого импульса" нужно использовать теневые compare-регистры.
Сб фев 20, 2021 19:24:14
uint32_t freq = 40000;
ок?
первый таймер уже не использовать, плата в устройстВАХ уже готова и выводы сделаны для РА6 и РА7
раньше (ну и сейчас) был ШИМ на РА6 и он был mode 2, так что косяков с краями не было, РА7 был выводом общего назначения, теперь его решено использовать для вывода инвертированного сигнала
Сб фев 20, 2021 21:26:25
если он будет ВСЕГДА инверсным, то и проблемы не будет.
вы же - то подключаете ноги к каналам таймера, то отключаете от каналов.
мне кажется дело в этом.
у вашего камня map`ом подходящие линии TIM1 на эти ноги не коммутируются?
я наизусть МК не знаю
Сб фев 20, 2021 22:08:59
если он будет ВСЕГДА инверсным, то и проблемы не будет.
вы же - то подключаете ноги к каналам таймера, то отключаете от каналов.
А где он такое делает??
Имхо - в ISR ТС просто выключает генерацию после 4-х периодов. Что видно и на картинках.
PS: Хотя подробно биты конфигурации я не проверял, сужу по беглому взгляду, может ошибаюсь...
Добавлено after 3 minutes 39 seconds:сообщение не несёт смысловой нагрузки
Если вы не поняли этой нагрузки, то так и скажите. Вместо минусования желающих помочь.
Вам тут никто ничего не должен.
Сб фев 20, 2021 23:36:41
отработав 4 периода, что заставило на второй линии "1" (как положено) вдруг кувыркнуться в "0",
из того что вижу только :
TIM3->CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E );
могу заподозрить.
Вс фев 21, 2021 01:08:36
TIM3->CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E );
могу заподозрить.
Да, именно это и выключает, а сам импульс формируется из задержки входа в прерывание.
Автору надо пояснить, что он хочет получить в конце. Что бы оба сигнала были в ноль, или один низкий, другой высокий?
Так же не ясно, только первый импульс имеет неправильную длительность или все?
Вс фев 21, 2021 09:58:43
очевидно что оба в ноль
либо вы что-то недопонимаете, либо что-то путаете, но биты CC1E и CC2E регистра CCER подключают выходные контакты, мне нужен этот ШИМ снаружи, а не внутри
если подключать пины этими битами раньше, то и уровень на пине будет высокий (для PWM mode 1) СРАЗУ! а не при старте таймера
работать постоянно таймер не должен, в этом нет смысла (как и в сообщении про теневые регистры без указания их имен и вообще без полезной информации)
таймер должен запуститься, отработать 4 (или сколько я потом захочу) раз и выключиться до следующего запуска. при этом на ногах РА6 и РА7 должны получиться ровные импульсы по 12.5 мкс (ШИМ 40 кГц со скважностью 50%) инвертированные друг к другу, в остальное время там должен быть НОЛЬ!
Вс фев 21, 2021 11:16:03
э-ка, как Вас гордыня то ...
и это - "очевидно что оба в ноль" - ни нам ни таймеру совсем не очевидно.
вы или вопрос переформулируйте или сами убирайте с ноги канал таймера, там где он лишний.
извините, а я в баньку пойду
Вс фев 21, 2021 14:11:27
Я в баньку в 18 пойду
в прерывании видно что я ногу убираю с таймера, но "всплеск" всё равно есть
а когда ставлю - есть лишнее время в начале. и это легко доказать вставив задержку между установкой бита CCxE и запуском таймера
и никакой гордыни нет, изначально задал эти вопросы
видимо это невозможно без вмешательства ещё одного таймера
Вс фев 21, 2021 15:08:48
spongebob писал(а):в прерывании видно что я ногу убираю с таймера, но "всплеск" всё равно есть
Вы не учитываете время от конца периода (события для прерывания) до "выключения ноги".
Я в STM'ах не силён, но мне кажется, что там в таймерах есть возможность его вырубить, дав отработать период до конца. Типа, с автоотключением счёта.
Хотя, я могу ошибаться. Лениво RM'ы искать и читать
Вс фев 21, 2021 15:28:13
Сделал как хотел без использования доп таймера
П.С. для людей будущего которых занесут сюда поисковые сервисы - пишите в ЛС, поделюсь мудростью
Вс фев 21, 2021 15:31:43
Почему бы тут не сказать ? Зачем заставлять людей регистрироваться и писать Вам в личку ?
Пн фев 22, 2021 09:55:15
самому не доводилось решать эту задачку, ну как вариант:
- переставить прерывание на регистр (чтоб попадать во второй полупериод),
- в обработчике : поднимать OPM (CR1) и маскировать уже не нужный канал например этим OCхM (CCMRх) (100/101),
- буферизация ARR уже есть, добавить для ccr OCхPE (CCMRх),
- до старта записывать чуть меньшие aar и ccr, а стартовав вписать полноразмерные.
или дополнить счет лишним периодом, но первый период спрятать, подключая каналы в работу по очереди в не активную фазу, хоть этим OCхM (CCMRх) .
вроде должно получиться.
изначально не прозвучало, что причина "неровности" понятна, поэтому я покумекал о причине за решение не думал, приемлемое ему решение я полагал автор придумает сам. как оно позже и получилось
"люди будущего" наверное будут программировать другие контроллеры и не прикасаясь к клаве
Пн фев 22, 2021 16:34:50
Да... Вот такие люди бывают... Если у кого-то есть решение, то с ними должны поделиться. А если оно есть у них, то фигушки вам всем ...
Как-то они называются, такие люди... Слово забыл... Как же его там .... А, эгоисты, вот ...
Пн фев 22, 2021 19:21:51
Ну да. Я просил помощи.
Мне тут прилетело очень много "поддержки".
Я сделал сам, с чего вдруг я должен этой информацией делиться?
Кому понадобится - спросите, я обязательно напишу. И напишу не просто слова, а КОД.
Либо имена регистров и их биты.
Но если я не знаю - я не лезу.
Пн фев 22, 2021 23:12:07
Когда я игрался с WS2815, обнаружил, что нужно либо добавлять в конце буфера лишний нулевой байт, чтобы передать его по DMA, либо же, если работать честно,
использовать грязный хак (т.к. по-человечески надо было бы заводить в прерывании по DMA transfer complete прерывание на CC1, но на больших скоростях оно тупо не успевает отработать).
Вт фев 23, 2021 18:11:22
дел.
на оффтоп поперся - убрал
Пн апр 19, 2021 19:18:32
В некоторых таймерах STMки есть так называемый Repetition Counter. Тот вообще позволяет
таймеру прощелкать заданное количество полных циклов и остановиться. И это аппаратно.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.