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

Кто любит RISC в жизни, заходим, не стесняемся.
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

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

Сообщение spongebob »

Никак не могу получить ровные края генерации ШИМ по двум каналам.
Инициализация таймера:

Код: Выделить всё

	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 КБ) 480 скачиваний
В конце вот такая:
stop.png
(9.09 КБ) 501 скачивание
Как сделать ровные края? Что бы первый импульс был 12.5 мкс, и в конце не было этого импульса.
Реклама
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

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

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

Да и BDTR у него есть
Последний раз редактировалось a797945 Сб фев 20, 2021 18:21:51, всего редактировалось 1 раз.
Реклама
jcxz
Мудрый кот
Сообщения: 1725
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

freq предлагаете угадывать?
Чтоб "в конце не было этого импульса" нужно использовать теневые compare-регистры.
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

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

Сообщение spongebob »

uint32_t freq = 40000;
ок?
первый таймер уже не использовать, плата в устройстВАХ уже готова и выводы сделаны для РА6 и РА7
раньше (ну и сейчас) был ШИМ на РА6 и он был mode 2, так что косяков с краями не было, РА7 был выводом общего назначения, теперь его решено использовать для вывода инвертированного сигнала
Реклама
Эиком - электронные компоненты и радиодетали
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

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

у вашего камня map`ом подходящие линии TIM1 на эти ноги не коммутируются?
я наизусть МК не знаю :dont_know:
Реклама
jcxz
Мудрый кот
Сообщения: 1725
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="a797945",url="/forum/viewtopic.php?p=3984607#p3984607"]если он будет ВСЕГДА инверсным, то и проблемы не будет.
вы же - то подключаете ноги к каналам таймера, то отключаете от каналов.[/uquote]А где он такое делает?? :shock:
Имхо - в ISR ТС просто выключает генерацию после 4-х периодов. Что видно и на картинках.

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

Добавлено after 3 minutes 39 seconds:
[uquote="spongebob",url="/forum/viewtopic.php?p=3984529#p3984529"]сообщение не несёт смысловой нагрузки[/uquote]
Если вы не поняли этой нагрузки, то так и скажите. Вместо минусования желающих помочь.
Вам тут никто ничего не должен.
Реклама
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

отработав 4 периода, что заставило на второй линии "1" (как положено) вдруг кувыркнуться в "0",
из того что вижу только :
TIM3->CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E );
могу заподозрить.
Аватара пользователя
Alex-lab
Потрогал лапой паяльник
Сообщения: 308
Зарегистрирован: Ср ноя 20, 2013 11:29:26
Откуда: Манчестер
Контактная информация:

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

Сообщение Alex-lab »

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

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

Автору надо пояснить, что он хочет получить в конце. Что бы оба сигнала были в ноль, или один низкий, другой высокий?
Так же не ясно, только первый импульс имеет неправильную длительность или все?
При решение наиболее сложных задач, большинство, как правило, ошибается...
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

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

Сообщение spongebob »

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

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

Сообщение a797945 »

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

вы или вопрос переформулируйте или сами убирайте с ноги канал таймера, там где он лишний.
извините, а я в баньку пойду :)
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

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

Сообщение spongebob »

Я в баньку в 18 пойду
в прерывании видно что я ногу убираю с таймера, но "всплеск" всё равно есть
а когда ставлю - есть лишнее время в начале. и это легко доказать вставив задержку между установкой бита CCxE и запуском таймера
и никакой гордыни нет, изначально задал эти вопросы
видимо это невозможно без вмешательства ещё одного таймера
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

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

Я в STM'ах не силён, но мне кажется, что там в таймерах есть возможность его вырубить, дав отработать период до конца. Типа, с автоотключением счёта.
Хотя, я могу ошибаться. Лениво RM'ы искать и читать :roll:
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

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

Сообщение spongebob »

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

П.С. для людей будущего которых занесут сюда поисковые сервисы - пишите в ЛС, поделюсь мудростью
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Почему бы тут не сказать ? Зачем заставлять людей регистрироваться и писать Вам в личку ? :dont_know:
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

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

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

"люди будущего" наверное будут программировать другие контроллеры и не прикасаясь к клаве :))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Да... Вот такие люди бывают... Если у кого-то есть решение, то с ними должны поделиться. А если оно есть у них, то фигушки вам всем ...
Как-то они называются, такие люди... Слово забыл... Как же его там .... А, эгоисты, вот ... :)))
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

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

Сообщение spongebob »

Ну да. Я просил помощи.
Мне тут прилетело очень много "поддержки".
Я сделал сам, с чего вдруг я должен этой информацией делиться?
Кому понадобится - спросите, я обязательно напишу. И напишу не просто слова, а КОД.
Либо имена регистров и их биты.
Но если я не знаю - я не лезу.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Когда я игрался с WS2815, обнаружил, что нужно либо добавлять в конце буфера лишний нулевой байт, чтобы передать его по DMA, либо же, если работать честно, использовать грязный хак (т.к. по-человечески надо было бы заводить в прерывании по DMA transfer complete прерывание на CC1, но на больших скоростях оно тупо не успевает отработать).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

дел.
на оффтоп поперся - убрал
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

В некоторых таймерах STMки есть так называемый Repetition Counter. Тот вообще позволяет
таймеру прощелкать заданное количество полных циклов и остановиться. И это аппаратно.
I am DX168B and this is my favourite forum on internet!
Ответить

Вернуться в «ARM»