Я работаю над микроконтроллером 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++
Программы на C++. Форум разработчиков
1748106915
Anonymous
Я работаю над микроконтроллером STM32 (работающим при 168 МГц), чтобы генерировать сигналы ШИМ на каналах таймера (CH1 и CH2) с частотой 500 Гц. ШИМ используется для управления приложенным напряжением двигателя, где значение напряжения обновляется каждые 0,002 секунды (2 мс) в прерывании таймера. Однако я обновляю регистр CCR (для регулировки рабочего цикла ШМ) внутри цикла времени без какой -либо задержки. Это приводит к тому, что значение CCR обновляется несколько раз в пределах одного цикла ШИМ, что потенциально вызывает нестабильный или непрерывный выход импульса. Я читаю в Интернете, что обновление CCR в цикле без синхронизации может привести к проблемам, но я не уверен, как это разрешить. /> [*] [b] тактовая частота: [/b] 168 МГц.
[*] [b] Частота PWM: [/b] 500 Гц (таймер настроен с подходящим Prescaler и ARR). 2 мс.
[*] [b] Проблема: [/b] Регистр 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 (из -за быстрого цикла) могут нарушать цикл ШИМ, особенно с более длительным периодом прерывания.
Подробнее здесь: [url]https://stackoverflow.com/questions/79636756/stm32-pwm-signal-instability-due-to-rapid-ccr-updates-in-while-loop[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия