Настройка скважности ШИМ в STM32F103

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
kotarnold
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Настройка скважности ШИМ в STM32F103

Сообщение kotarnold »

Здравствуйте, уважемые коты.

Я пытаюсь настраивать ШИМ в STM32F103C8T6. Почему-то не получается настроить скважность.
Делаю следующее:
Порт, настроенный на 72 МГц, настраиваю на выход таймера TIM1. Хочу генерировать ШИМ, например, с частотой 18кГц, соответственно выбираю делитель частоты, равным 8, а счетчик периода выбираю равным 500.

Код инициализации таймера, соответственно:

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

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 8;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 500;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
Далее запускаю сам таймер, записывая в CCR1 400 (насколько я понял, скважность должна получиться 400/500).

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

	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
	TIM1->CCR1 = 400;
В итоге получаю импульсы с частотой около 16 кГц и скважностью 5/57

Где я ошибаюсь?
Вложения
Cube.jpg
(123.07 КБ) 113 скачиваний
PWM.jpg
(51.52 КБ) 106 скачиваний
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: Настройка скважности ШИМ в STM32F103

Сообщение AlanDrakes »

1. 57.14/6268 = 0.91 = 91%. Хотя и не совпадает с ожидаемыми 400/500
2. Используйте что-то одно - либо HAL, либо обращение к регистрам.

Взял код от проекта контроллера кулеров, по быстрому переделал под ваш вашиант.
Какой канал используете - не знаю, потому оставил как есть - все.

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

	SystemCoreClockUpdate();
	TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
	TIM1->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3PE | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4PE;
	TIM1->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E;
	TIM1->ARR = SystemCoreClock / 18000;

	TIM1->CCR1 = TIM2->ARR * Percent / 100;
Значение Percent - поставьте своё. У меня код работает именно таким образом, максимально самостоятельно вычисляя значения. Хотя это и имеет некоторые проблемы при нечётных значениях.
Аватара пользователя
kotarnold
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Re: Настройка скважности ШИМ в STM32F103

Сообщение kotarnold »

Спасибо, но непонятно: куда именно внедрять этот код и как быть с параметрами таймера в Cube?

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

SystemCoreClockUpdate();
найдена аж в system_stm32f10x.c, т.е. править этот файл?

Добавлено after 1 hour 41 minute 28 seconds:
[uquote="AlanDrakes",url="/forum/viewtopic.php?p=4236773#p4236773"]1. 57.14/6268 = 0.91 = 91%. Хотя и не совпадает с ожидаемыми 400/500[/uquote]


Откуда Вы взяли число 6268?
В том-то и дело, что скважность (и по графику это видно невооруженным взглядом) скорее похожа на 1/10 (фактически 5/57), чем на 400/500 = 8/10

При этом замена числа в регистре CCR1 на скважность заметным образом не влияет. Это если редактировать связку

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

   HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
   TIM1->CCR1 = 400;
Вложения
PWM.jpg
(51.52 КБ) 87 скачиваний
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Настройка скважности ШИМ в STM32F103

Сообщение Eddy_Em »

Я в этом вашем калокубе не разбираюсь, но таки если "прескалер" - это TIM1->PSC, то от желаемого единичку надо отнимать. Т.е. если хочется 9МГц, то и писать нужно туда 7!
Аналогично с регистрами ARR и CCRx. В общем, нужно было написать:

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

TIM1->PSC = 7;
TIM1->ARR = 499;
TIM1->PSC1 = 399;
но даже с 500 и 400 должно было быть заполнение 401/501=0.800, а никак не 5/57=0.088…

P.S. Если бы у вас там был инвертированный выход, заполнение (длительность 1 / полная длительность) составляло бы не 401/501, а 100/501=0.200. Откуда взялось 5/57 — одному калу известно!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

Re: Настройка скважности ШИМ в STM32F103

Сообщение Cheeseman »

Вот лежали функции инициализации шим на хал и на регистрах. Вроде работали
Инициализация на хал

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

void init_PWM(void)
{
	__HAL_RCC_TIM4_CLK_ENABLE();
	TMR4.Instance = TIM4; 
	TMR4.Init.Period = 19999; 
	TMR4.Init.CounterMode = TIM_COUNTERMODE_UP; 
	TMR4.Init.Prescaler = 0; 
	TMR4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
	HAL_TIM_PWM_Init (&TMR4);  //

	PWM4.OCMode  = TIM_OCMODE_PWM1; 
	PWM4.Pulse =10000;
	PWM4.OCPolarity = TIM_OCPOLARITY_HIGH; 
	PWM4.OCFastMode = TIM_OCFAST_ENABLE; 
	HAL_TIM_PWM_ConfigChannel(&TMR4, &PWM4, TIM_CHANNEL_1); 
	HAL_TIM_PWM_Start(&TMR4, TIM_CHANNEL_1); 
}
на регистрах

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

void init_servo_port(void) {
	__HAL_RCC_GPIOF_CLK_ENABLE();

	GPIOF->MODER |= GPIO_MODER_MODE6_1; // Alternate function mode
	GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; // very high
	GPIOF->PUPDR |= GPIO_PUPDR_PUPD6_1; // pull-down
	GPIOF->AFR[0] |= (0x03 << 6 * 4);
}

void init_servo_PWM(void) {
	__HAL_RCC_TIM10_CLK_ENABLE();
	/* f = 50 Гц. Время периода 20 мс */
	TIM10->ARR = (20000 - 1); // период в микросекундах
	TIM10->PSC = (120 - 1); // предделитель

	TIM10->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // режим ШИМ1
	TIM10->CCMR1 |= TIM_CCMR1_OC1PE; // буферизируем CCR1. необходимо в шиме. Подгрузка осуществляется только после события обновления
	TIM10->CCMR1 &= ~TIM_CCMR1_CC1S; //канал на выход

	TIM10->CCR1 = TIM10->ARR/2; // коэффициент заполнения 50%
	TIM10->CCER &= ~TIM_CCER_CC1P;
	TIM10->CCER |= TIM_CCER_CC1E; //   активировать выход OC1
	TIM10->EGR = TIM_EGR_UG; 

	TIM10->CR1|= TIM_CR1_CEN; // Запуск таймера
}
Аватара пользователя
kotarnold
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Re: Настройка скважности ШИМ в STM32F103

Сообщение kotarnold »

Всё заработало на другом таймере
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: Настройка скважности ШИМ в STM32F103

Сообщение AlanDrakes »

[uquote="kotarnold",url="/forum/viewtopic.php?p=4236803#p4236803"]Спасибо, но непонятно: куда именно внедрять этот код и как быть с параметрами таймера в Cube?

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

SystemCoreClockUpdate();
найдена аж в system_stm32f10x.c, т.е. править этот файл?[/uquote]
Нет. Этот файл обычно компилируется совместно с проектом. Сам.
[uquote="kotarnold",url="/forum/viewtopic.php?p=4236803#p4236803"]Добавлено after 1 hour 41 minute 28 seconds:
[uquote="AlanDrakes",url="/forum/viewtopic.php?p=4236773#p4236773"]1. 57.14/6268 = 0.91 = 91%. Хотя и не совпадает с ожидаемыми 400/500[/uquote]


Откуда Вы взяли число 6268?[/uquote]
Пардон, опечатался. Должно быть 62,68. А взял из вашего скриншота логического анализатора. Вы не на ту строку смотрели.
Ответить

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