STM32 ШИН -нестабильность сигнала из -за быстрых обновлений CCR в LOOPC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 STM32 ШИН -нестабильность сигнала из -за быстрых обновлений CCR в LOOP

Сообщение Anonymous »

Я работаю над микроконтроллером 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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