STM32F051 — Различное состояние простоя в зависимости от входного сигнала перегрузки по току

#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;
  

Надеюсь, это будет полезно кому-то еще!