![]() |
Y_G_G 發表于 2024-8-20 13:12 u16 flash_crc = 0; u16 flash_cnt = 1000; void TM0_Isr() interrupt 1 { flash_crc = (flash_crc + 1) % flash_cnt; if(flash_crc <=5) { P1=0x01; } else if (flash_crc >= (flash_cnt/ 2) && flash_crc <= (flash_cnt/ 2)+5) { P1=0x02; } else P1=0x00; } 屎山代碼, ![]() |
STC8A8K64D4、STC8G2K64S4這些型號非常方便的輸出多路帶相位差的15位PWM,直接指定輸出高低電平的時刻即可。 |
首先先確定時基,假如是1000,讓定時器執行累加操作,當寄存器內的數據達到了500的時候,讓電平進行反轉,這樣就會輸出一個占空比為50 |
你這只是相位差,并不是互補,可以試一下這個方案: 定義兩個全局變量: u16 flash_crc = 0; u16 flash_cnt = 1000; 在定時器中斷中加入flash_crc = (flash_crc + 1) % flash_cnt; 在主函數中或者定時器中斷中檢測,并輸出電平 if(flash_crc >= (flash_cnt/ 2)) { 高電平; } else { 低電平; } 這個是產生50%占空比的 根據 flash_crc 的值,可以輸出不同長度的脈沖 |
目前使用ARM核的32位單片機的高級定時器都具備互補輸出模式,如三星、NXP公司等等。 |
ST公司有這樣MCU,N年前我使用過ST公司STM8S系列單片機開發無刷三相直流電機的控制器,這一系列芯片的高級定時器采用互補輸出模式;ARM核STM32系列單片機的高級定時器同樣采用互補輸出模式,它提供路數比STM8S系列單片機多。可根據實際需要選擇。 |