#timer #stm32 #pwm #stm32f0
#таймер #stm32 #шим #stm32f0
Вопрос:
У меня есть STM32F051, управляющий H-мостом (с соответствующими драйверами затвора и импульсом перегрузки по току, отправленным обратно в MCU), который питает трансформатор, используя TIM1 и дополнительные сигналы (и генерацию времени простоя).
Я пытаюсь настроить другое «безопасное» состояние в зависимости от того, какой импульс перегрузки по току я получаю:
- При перегрузке по току с высокой стороны отключите полевые транзисторы с низкой стороны, включите полевые транзисторы с высокой стороны.
- При перегрузке по току на низкой стороне выключите полевые транзисторы с высокой стороны, включите полевые транзисторы с низкой стороны.
Идея состоит в том, чтобы улучшить характеристики перегрузки по току на инверторе.
Есть ли возможность вручную установить выходы таймеров в определенное состояние сразу при получении импульса на GPIO? Я пробовал использовать функцию прерывания, но вы можете установить только одно предопределенное «безопасное» состояние. Для моего приложения мне нужно два (на данный момент, еще впереди).
Комментарии:
1. Является ли использование инвертированного вывода таймера опцией?
Ответ №1:
В конце концов я нашел результат и делюсь им с вами.
Исходный код и примеры libopencm3 помогли мне найти ответ.
#define TIM_CCMR1_OC1M_INACTIVE (0x2 << 4)
#define TIM_CCMR1_OC1M_FORCE_LOW (0x4 << 4)
#define TIM_CCMR1_OC1M_FORCE_HIGH (0x5 << 4)
#define TIM_CCMR1_OC1M_PWM2 (0x7 << 4)
#define TIM_CCMR1_OC2M_INACTIVE (0x2 << 12)
#define TIM_CCMR1_OC2M_FORCE_LOW (0x4 << 12)
#define TIM_CCMR1_OC2M_FORCE_HIGH (0x5 << 12)
#define TIM_CCMR1_OC2M_PWM2 (0x7 << 12)
Служебные функции для отключения и включения выходов.
void disable_pwm(){
TIM1->CCER amp;= ~(TIM_CCER_CC1E | TIM_CCER_CC1NE | TIM_CCER_CC2E | TIM_CCER_CC2NE);
}
void enable_pwm(){
TIM1->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC1NE | TIM_CCER_CC2E | TIM_CCER_CC2NE);
}
Вот как заставить мост H замкнуть нагрузку на землю в качестве примера.
TIM1->CCMR1 amp;= ~TIM_CCMR1_OC1M_Msk;
TIM1->CCMR1 |= TIM_CCMR1_OC1M_FORCE_LOW;
TIM1->CCMR1 amp;= ~TIM_CCMR1_OC2M_Msk;
TIM1->CCMR1 |= TIM_CCMR1_OC2M_FORCE_LOW;
Надеюсь, это будет полезно кому-то еще!