Mosfets cháy ở H-Bridge

Sep 23 2020

Tôi đang gặp sự cố với cầu H, dẫn động một động cơ.


Sơ đồ

Đây là giản đồ cho cầu H. Tín hiệu H [4: 1] được tạo ra bởi một bộ vi điều khiển. mX và mY là đầu ra của động cơ DC.


Làm thế nào nó hoạt động

Bộ vi điều khiển nhận một thông báo bên ngoài qua UART. Khi nhận được thông báo, bộ vi điều khiển sẽ chuyển cầu H, đảo chiều động cơ. Tin nhắn này được nhận khoảng 4 giây một lần. Vì vậy, trong thực tế, động cơ nên thay đổi hướng quay của nó sau mỗi 4 giây.


Phần mềm vi điều khiển

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
    }
}

Vấn đề

Lúc đầu, mạch hoạt động như mong đợi, nhưng sau khi làm việc khoảng 1 phút, các mosfet Q3 và Q4 sẽ kết thúc cháy.


Câu hỏi

Hiện tại tôi chỉ còn lại 2 mosfet dự phòng, vì vậy tôi quyết định yêu cầu trợ giúp ở đây trước khi cố gắng thực hiện một số thay đổi.

  1. Tôi đã không thêm điốt flyback song song với các mosfet. Chúng có thực sự cần thiết? Tôi có nên thêm chúng không? Đây có thể là vấn đề với mạch của tôi?
  2. Có điều gì đó sai với phần sụn của tôi? Tôi có nên thêm thời gian chết trước khi đảo chiều động cơ không?
  3. Có thể ngắt động cơ (kích hoạt Q1 và Q3, và hủy kích hoạt Q2 và Q4) trước khi đảo ngược nó có phải là một giải pháp không?
  4. Bất kỳ ý tưởng nào khác về những gì có thể đang xảy ra?

Trả lời

4 UweD Sep 24 2020 at 03:40

Khi tôi diễn giải mã:

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
}

Trong đoạn mã trên, ở hướng 1, chân 3 và 4 đang bật.

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
}

Bây giờ, ở hướng 2, chân 2 và 3 đang bật. Pin 1 không bao giờ được sử dụng.

Điều này có nghĩa là ở cả hai hướng, chân 3 được bật. Điều này có nghĩa là ngắn qua Q3 và Q4 trong hướng 2. Nhận xét của bạn cho các dòng "H2-H3" và "H1-H4" là đúng, nhưng tôi nghĩ rằng các chân không được triển khai như thế này.