Mosfets queimando em H-Bridge

Sep 23 2020

Estou tendo um problema com uma ponte H, que aciona um motor.


Esquemático

Este é o esquema da ponte H. Os sinais H [4: 1] são gerados por um microcontrolador. mX e mY são as saídas para um motor DC.


Como funciona

O microcontrolador recebe uma mensagem externa via UART. Quando a mensagem é recebida, o microcontrolador comuta a ponte H, invertendo a direção do motor. Essas mensagens são recebidas cerca de uma vez a cada 4 segundos. Portanto, na prática, o motor deveria estar mudando seu sentido de rotação a cada 4 segundos.


Firmware de microcontrolador

while(TRUE) {
    if(receivedCmd == 0x01) {   //direction1
        GPIO_WriteLow(GPIOD, (GPIO_Pin_TypeDef) (GPIO_PIN_2 | GPIO_PIN_3));    //H1-H4
        GPIO_WriteHigh(GPIOC, (GPIO_Pin_TypeDef) (GPIO_PIN_3 | GPIO_PIN_4));   //H2-H3
    }
    else if(receivedCmd == 0x02) {  //direction2
        GPIO_WriteLow(GPIOC, (GPIO_Pin_TypeDef) (GPIO_PIN_3 | GPIO_PIN_4));    //H2-H3
        GPIO_WriteHigh(GPIOD, (GPIO_Pin_TypeDef) (GPIO_PIN_2 | GPIO_PIN_3));   //H1-H4
    }
    else {    //do not activate
        GPIO_WriteLow(GPIOC, (GPIO_Pin_TypeDef) (GPIO_PIN_3 | GPIO_PIN_4));    //H2-H3
        GPIO_WriteLow(GPIOD, (GPIO_Pin_TypeDef) (GPIO_PIN_2 | GPIO_PIN_3));    //H1-H4
    }
}

O problema

No início, o circuito está funcionando conforme o esperado, mas depois de trabalhar por 1 minuto ou mais, os mosfets Q3 e Q4 acabarão queimando.


Questões

Eu só tenho 2 mosfets extras comigo agora, então decidi pedir ajuda aqui antes de tentar implementar algumas mudanças.

  1. Eu não adicionei diodos flyback em paralelo com os mosfets. Eles são realmente necessários? Devo adicioná-los? Esse poderia ser o problema com meu circuito?
  2. Há algo de errado com meu firmware? Devo adicionar um tempo morto antes de reverter a direção do motor?
  3. A interrupção do motor (ativando Q1 e Q3 e desativando Q2 e Q4) antes de reverter pode ser uma solução?
  4. Alguma outra ideia sobre o que pode estar acontecendo?

Respostas

4 UweD Sep 24 2020 at 03:40

Enquanto interpreto o código:

if(receivedCmd == 0x01) {   //direction1
    GPIO_WriteLow(GPIOD, (GPIO_Pin_TypeDef) (GPIO_PIN_2 | GPIO_PIN_3));    //H1-H4
    GPIO_WriteHigh(GPIOC, (GPIO_Pin_TypeDef) (GPIO_PIN_3 | GPIO_PIN_4));   //H2-H3
}

No código acima, na direção 1, os pinos 3 e 4 estão ligados.

else if(receivedCmd == 0x02) {  //direction2
    GPIO_WriteLow(GPIOC, (GPIO_Pin_TypeDef) (GPIO_PIN_3 | GPIO_PIN_4));    //H2-H3
    GPIO_WriteHigh(GPIOD, (GPIO_Pin_TypeDef) (GPIO_PIN_2 | GPIO_PIN_3));   //H1-H4
}

Agora, na direção 2, os pinos 2 e 3 estão ativados. O pino 1 nunca é usado.

Isso significa que em ambas as direções o pino 3 está ativado. Isso significaria um curto em Q3 e Q4 durante a direção 2. Seus comentários para as linhas "H2-H3" e "H1-H4" estão corretos, mas acho que os pinos não foram implementados dessa forma.