![]() |
發布時間: 2025-7-5 09:41
正文摘要:由官方代碼修改,時鐘為24MHZ,頻率為85KHZ,不分頻 實際在20-40%占空比為目標輸出,但是占空比50時另一路在一個周期才會翻轉一次 AB圖為目標輸出 求解惑為什么無法輸出50%占空比,或者有無其他方法實現 ... |
你這種相位差180度的輸出,占空比一定要小于50%,否則就會有重疊,PWM會輸不出來的。 |
1、參考這個程序:15A-PWMB-2個相位差180度的PWM輸出P2口-匹配翻轉輸出 void main(void) { P_SW2 = 0x80; /* XOSCCR = 0xc0; //啟動外部晶振 while (!(XOSCCR & 1)); //等待時鐘穩定 CLKDIV = 0x00; //時鐘不分頻 CLKSEL = 0x01; //選擇外部晶振 */ pwmb1 = 200; //通道1(PWM5)占空比 pwmb2 = 200; //通道2(PWM6)占空比 PWMB_config(); EA = 1; while (1) { } } //======================================================================== // 函數: void PWMB_config(void) // 描述: PWM配置函數。 // 參數: noe. // 返回: none. // 版本: V1.0, 2022-3-15 // 備注: //======================================================================== void PWMB_config(void) { u8 ccer1; u8 ccer2; u8 ps; u8 eno; P_SW2 |= 0x80; //SFR enable PWMB_CCMR1 = 0x00; // 通道模式配置, 匹配模式1, 禁止預裝載, 匹配時輸出高 PWMB_CCMR2 = 0x00; // 通道模式配置, 匹配模式1, 禁止預裝載, 匹配時輸出高 PWMB_ENO = 0; // IO輸出禁止 PWMB_IER = 0; // 禁止中斷 PWMB_SR1 = 0; // 清除狀態 PWMB_SR2 = 0; // 清除狀態 PWMB_CR1 = 0; // 清除控制寄存器 PWMB_CR2 = 0; // 清除控制寄存器 ccer1 = 0; ccer2 = 0; ps = 0; eno = 0; PWMB_ISR_En = 0; PWMB_PSCR = 11; // 預分頻寄存器, PWM時鐘 = 12MHz/(11+1)=1MHz, 分頻 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 邊沿對齊PWM頻率 = SYSclk/((PSCR+1)*(AAR+1)), 中央對齊PWM頻率 = SYSclk/((PSCR+1)*(AAR+1)*2). PWMB_DTR = 0; // 死區寄存器, PWMB無效 PWMB_ARR = PWMB_DUTY-1; // 自動重裝載寄存器, 控制PWM周期 PWMB_ISR_En |= 0x01; // 使能更新中斷 PWMB_CCMR1 = 0x68; // 通道模式配置, PWM模式1, 預裝載允許 PWMB_CCR1 = pwmb1; // 比較值, 控制占空比(高電平時鐘數) ccer1 |= 0x05; // 開啟比較輸出, 高電平有效 ps |= 0; // 選擇IO, 0:選擇P2.0, 1:選擇P1.7, 2:選擇P0.0, 3:選擇P7.4, eno |= 0x01; // IO輸出允許, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P // PWMB_ISR_En |= 0x02; // 使能PWMB1(PWM5)中斷 PWMB_CCMR2 = 0x30; // 通道模式配置, 匹配模式3, 禁止預裝載, 匹配時取反輸出 PWMB_CCR2 = PWMB_PHASE2; // 匹配值 ccer1 |= 0x50; // 開啟比較輸出, 高電平有效 ps |= (0<<2); // 選擇IO, 0:選擇P2.1, 1:選擇P5.4, 2:選擇P0.1, 3:選擇P7.5 eno |= 0x04; // IO輸出允許, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P PWMB_ISR_En |= 0x04; // 使能PWMB2(PWM6)中斷 PWMB_CCER1 = ccer1; // 捕獲/比較使能寄存器1 PWMB_CCER2 = ccer2; // 捕獲/比較使能寄存器2 PWMB_PS = ps; // 選擇IO PWMB_IER = PWMB_ISR_En; //設置允許通道1~4中斷處理 PWMB_BKR = 0x80; // 主輸出使能 相當于總開關 PWMB_CR1 = 0x81; // 使能計數器, 允許自動重裝載寄存器緩沖, 邊沿對齊模式, 向上計數, bit7=1:寫自動重裝載寄存器緩沖(本周期不會被打擾), =0:直接寫自動重裝載寄存器本(周期可能會亂掉) PWMB_EGR = 0x01; //產生一次更新事件, 清除計數器和預分頻計數器, 裝載預分頻寄存器的值 PWMB_ENO = eno; // 允許IO輸出 } // PWMB_PS = (0<<6)+(0<<4)+(0<<2)+0; //選擇IO, 4項從高到低(從左到右)對應PWM8 PWM7 PWM6 PWM5 // PWMB_PS PWM8 PWM7 PWM6 PWM5 // 00 P2.3 P2.2 P2.1 P2.0 // 01 P3.4 P3.3 P5.4 P1.7 // 02 P0.3 P0.2 P0.1 P0.0 // 03 P7.7 P7.6 P7.5 P7.4 //======================================================================== // 函數: void PWMB_ISR(void) interrupt PWMB_VECTOR // 描述: PWMA中斷處理程序. // 參數: None // 返回: none. // 版本: V1.0, 2021-6-1 //======================================================================== void PWMB_ISR(void) interrupt PWMB_VECTOR { u8 sr1; // u8 sr2; sr1 = PWMB_SR1; //為了快速, 中斷標志用一個局部變量處理 PWMB_SR1 = 0; //清除中斷標志 // sr2 = PWMB_SR2; //為了快速, 中斷標志用一個局部變量處理 PWMB_SR2 = 0; //清除中斷標志 sr1 &= PWMB_ISR_En; //每個通道可以單獨允許中斷處理 if(sr1 & 0x01) //更新中斷標志 { PWMB_CCR2 = PWMB_PHASE2; // 通道2匹配值, 匹配時取反輸出 } if(sr1 & 0x04) //通道2匹配中斷標志 { PWMB_CCR2 = PWMB_PHASE2+pwmb2; // 通道2匹配值, 匹配時取反輸出 } } 2、下面是STC8H2K系列PWM硬件移相程序可以參考: 配置代碼
|
問題已經解決,換成pwm互補輸出加死區調節的方式實現目標波形輸出 |
可以用帶PWM硬件移相功能的STC8H2K32U系列 |
從問題描述來看,你在24MHz時鐘下嘗試實現85kHz頻率且占空比20%-40%的輸出,但發現占空比設為50%時另一路信號在單周期內僅翻轉一次,這可能與定時器計數機制及PWM生成邏輯有關。85kHz頻率對應的周期約為11.76μs,24MHz時鐘下每個計數周期為41.67ns,理論上定時器需計數約282次(24MHz/85kHz≈282.35)完成一個周期。若采用向上計數模式,占空比由比較值與周期值的比例決定,當比較值設為周期值一半(如141或142)時理論上應輸出50%占空比,但實際出現異常,可能是定時器工作模式(如是否支持中心對齊PWM)或輸出邏輯配置導致。 另一路信號單周期僅翻轉一次,可能是因為該通道采用了不同的輸出模式(如僅在計數到頂或底時翻轉),或與主通道存在時序耦合。例如,若兩路PWM共享定時器資源且配置為互補輸出,當占空比設為50%時,可能因死區時間設置或輸出極性配置導致信號翻轉頻率減半。此外,若定時器工作在向上/向下計數模式(中心對齊PWM),比較值設為周期值一半時應生成對稱波形,但若配置為向上計數模式(邊沿對齊PWM),50%占空比需精確設置比較值為周期值的一半,且需確保輸出模式為“匹配時置位/清零”而非“翻轉”模式,后者會導致每匹配一次翻轉一次,使占空比固定為50%但頻率減半。 要實現目標輸出,可嘗試以下方案:首先確認定時器工作模式及PWM生成方式,若使用邊沿對齊PWM,確保周期值N與比較值C滿足C=N×占空比(如20%占空比時C=0.2N),且輸出模式配置為“匹配時清零/置位”而非翻轉;若需50%占空比且頻率不變,可改用中心對齊PWM模式,通過設置比較值為N/2來生成對稱波形。此外,可獨立配置兩路PWM使用不同定時器資源,避免時序干擾,并通過示波器測量定時器計數寄存器與輸出引腳的時序關系,定位比較值設置與輸出翻轉的實際對應關系,從而優化參數配置。 |
是不是輸出疊加了,頻率不一樣 |
參考官方示例中帶死區控制的PWM互補輸出,控制死區時間即可達到圖A-B的波形變化。 |