在使用XMC1402的互補PWM功能進行開發時,我遇到了一個問題,即在停止PWM輸出時始終有一個引腳會輸出高電平,不能兩路引腳保持一致低電平,後來確定原因是在關斷PWM的時候,單片機只是關閉了PWM的產生,而沒有將引腳電平拉低。
在使用多個品牌的MCU進行測試後,我發現這個問題是普遍存在的,而且問題不只是在互補PWM中,單路PWM的輸出中也會出現這個問題。這樣的問題對於應用來講無疑是非常致命的,在使用互補PWM驅動功率器件時,包括在一些半橋/全橋電路、電機控制的應用中,如果不能保證在關斷PWM後兩個引腳保持一致的高低電平,也許會出現電路直通導致器件損壞等問題。
在使用多個品牌的MCU進行測試後,我發現這個問題是普遍存在的,而且問題不只是在互補PWM中,單路PWM的輸出中也會出現這個問題。這樣的問題對於應用來講無疑是非常致命的,在使用互補PWM驅動功率器件時,包括在一些半橋/全橋電路、電機控制的應用中,如果不能保證在關斷PWM後兩個引腳保持一致的高低電平,也許會出現電路直通導致器件損壞等問題。
在MCU中,引腳在關斷PWM時候的電平取決於GPIO初始化的特性和關斷那一刻時的電平,對於出問題,想要得到恆定的高低電平,這裡提出兩種方法來解決:
1. 最簡單直接的方法,就是調整PWM的占空比為0或100,讓引腳一直輸出低電平,這種方法不需要關閉PWM,隨後想開啟PWM直接調整占空比即可,恢復響應快。但是這種方法的缺陷就是不能使用在互補PWM上,在互補PWM中,如果一路PWM輸出為低電平,那麼另外一路輸出就會為高電平(死區以外),這時候就該使用第二種方法。
2. 在互補PWM中,我們可以直接關閉PWM,強制輸出高低電平。首先關掉PWM,然後重新初始化GPIO為輸出模式,最後更改輸出電平。當想要開啟PWM的時候,再次重新初始化。在XMC中我們可以直接使用庫函數XMC_GPIO_Init(XMC_GPIO_PORT_t *const port, const uint8_t pin, const XMC_GPIO_CONFIG_t *const config)來進行配置,將引腳配置的寄存器值提前保存。
下面我貼出如何使用:
(1) 停止PWM輸出
XMC_GPIO_Init((XMC_GPIO_PORT_t *) PORT0_BASE, 12U,&PWM_stop_gpio_config);
其中 PWM_stop_gpio_config定義如下
const XMC_GPIO_CONFIG_t PWM_stop_gpio_config =
{ .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL,
.output_level = XMC_GPIO_OUTPUT_LEVEL_LOW,};
(2) 啟動PWM輸出
XMC_GPIO_Init((XMC_GPIO_PORT_t *) PORT0_BASE, 12U,&PWM_CCU8_0_ch1_out0_config);
其中 PWM_CCU8_0_ch1_out0_config定義如下
const XMC_GPIO_CONFIG_t PWM_CCU8_0_ch1_out0_config =
{ .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7,
.input_hysteresis = XMC_GPIO_INPUT_HYSTERESIS_STANDARD,
.output_level = XMC_GPIO_OUTPUT_LEVEL_LOW };
參考資料:
(1) Peripheral - Capture and Compare Unit 8 (CCU8)
(2) AP32288 - XMC1000/XMC4000 - Capture Compare Unit 8(CCU8)
評論