Предделитель и значения периода для ШИМ в STM32 - PullRequest
1 голос
/ 27 мая 2020

Я использую STM32F103C8Tx и пытаюсь создать PID-регулируемый PWM. В PID я буду давать значения ШИМ от 0 до 100, чтобы установить рабочий цикл. Это означает, что мой контрпериод должен быть 100 в Cubemx. Потому что, как я узнал, когда я меняю голландский цикл, изменяется период счетчика. Однако мне нужно создать ШИМ с частотой 200 кГц и тактовую частоту таймера 72 МГц. Чтобы достичь значения 100 в периоде счетчика, мне нужно иметь предварительный делитель 3,6. Я следую неправильным путем или я неправильно понял этот рабочий цикл ШИМ в stm32?

Примечание: я использую htimx.Instance->CCRx =Duty_Cycle;, чтобы изменить рабочий цикл из кода.

1 Ответ

2 голосов
/ 27 мая 2020

Для достижения рабочего цикла 0–100% вам не нужно устанавливать период счетчика равным 100. Вместо этого вы можете установить его выше, а порог переключения выше. Давайте воспользуемся вашим примером, вам нужна частота 200 кГц, а ваши часы таймера 72 МГц, поэтому период счетчика должен быть 360, а пороговое значение должно быть htimx.Instance->CCRx = (int)(360 * dutyCycle / 100). Но если вы используете ПИД-регулятор для управления двигателем, вы должны учитывать его зону нечувствительности, и 0-100% будут соответствовать 60-360, а значение должно быть htimx.Instance->CCRx = (int)((360 - 60) * dutyCycle / 100)

В случае, если вам нужно точное значение , вы можете настроить частоту системы до 50 МГц или даже 100 МГц (да, вы можете, но я не поощряю это), или вы можете использовать другой MCU, например stm32f401ccu6, с той же стоимостью.

P / S: просто мое любопытство, какую цель вы хотите контролировать. Я имею в виду, что если это двигатель, я думаю, что 200 МГц - это довольно много. Для управления двигателем я обычно использую 20 МГц (о, мой недорогой драйвер :)), и значение CCRx будет более красивым.

...