Я работаю над микроконтроллером STM32 (работающим при 168 МГц), чтобы генерировать сигналы ШИМ на каналах таймера (CH1 и CH2) с частотой 500 Гц. ШИМ используется для управления приложенным напряжением двигателя, где значение напряжения обновляется каждые 0,002 секунды (2 мс) в прерывании таймера. Однако я обновляю регистр CCR (для регулировки рабочего цикла ШМ) внутри цикла времени без какой -либо задержки. Это приводит к тому, что значение CCR обновляется несколько раз в пределах одного цикла ШИМ, что потенциально вызывает нестабильный или непрерывный выход импульса. Я читаю в Интернете, что обновление CCR в цикле без синхронизации может привести к проблемам, но я не уверен, как это разрешить. /> [*] тактовая частота: 168 МГц.
[*] Частота PWM: 500 Гц (таймер настроен с подходящим Prescaler и ARR). 2 мс.
[*] Проблема: Регистр CCR обновляется во время цикла, что приводит к быстрым обновлениям, которые могут мешать генерации сигналов PWM.
Приводит ли обновление регистра CCR в цикле DIST на гораздо более высокой частоте, чем нестабильность сигнала PWM или непрерывные импульсы? Обновление событий прерывание или включение функций предварительной нагрузки?
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
float startTarj = HAL_GetTick();
if (startTarj >= 5000)
{
u = Optimal_Control();
}
}
if (htim->Instance == TIM4)
{
// Read encoder counters
cartCounter = (int16_t)TIM1->CNT;
pendCounter = (int16_t)TIM3->CNT;
// Calculate the new system state
currentTime = HAL_GetTick();
currentState = calculate_system_state(cartCounter, pendCounter,currentTime, pastTime, &pastState);
// Update past values
pastCartCounter = cartCounter;
pastPendCounter = pendCounter;
pastState = currentState;
pastTime = currentTime;
position = currentState.cartPosition;
angle = currentState.pendAngle;
speed = currentState.cartSpeed;
omega = currentState.pendSpeed;
}
}
/* USER CODE END 0 */
int mymain(void)
{
MX_USB_HOST_Process();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN 2 */
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
HAL_TIM_Base_Start_IT(&htim4);
MotorControl motor;
PWMControl pwm(&htim2);
LQRControl lqr;
/* USER CODE END 2 */
while (1)
{
float voltage = motor.calculateVoltage(u, speed);
if (currentState.cartPosition > -0.45 && currentState.cartPosition < 0.45)
{
pwm.setPWM(voltage);
}
}
return 0;
}
< /code>
Моя цель состоит в том, чтобы убедиться, что быстрые обновления CCR в цикле не мешают импульсам ШИМ, вызывая нестабильность или непреднамеренный непрерывный выход. Я подозреваю, что частые обновления CCR (из -за быстрого цикла) могут нарушать цикл ШИМ, особенно с более длительным периодом прерывания.
Подробнее здесь: https://stackoverflow.com/questions/796 ... while-loop
STM32 ШИН -нестабильность сигнала из -за быстрых обновлений CCR в LOOP ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение