久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STC8H3K48S4的兩路PWM相位差180度輸出問題

查看數: 399 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2025-7-5 09:41

正文摘要:

由官方代碼修改,時鐘為24MHZ,頻率為85KHZ,不分頻 實際在20-40%占空比為目標輸出,但是占空比50時另一路在一個周期才會翻轉一次 AB圖為目標輸出 求解惑為什么無法輸出50%占空比,或者有無其他方法實現 ...

回復

ID:1034262 發表于 2025-7-9 11:23
你這種相位差180度的輸出,占空比一定要小于50%,否則就會有重疊,PWM會輸不出來的。
ID:1149771 發表于 2025-7-9 10:05
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硬件移相程序可以參考:
配置代碼
  •     PWMA_PSCRH = 0x00;  //預分頻器
  •     PWMA_PSCRL = 0x00;
  •     PWM_PERIOD = 1000;    //設置周期值
  •     PWMA_CCER1 = 0x00; //寫 CCMRx 前必須先清零 CCxE 關閉通道
  •     PWMA_CCER2 = 0x00;
  •     PWMA_CCMR1X = 0x00;//通道1:PWM1模式
  •     PWMA_CCMR1 = 0x60;
  •     PWMA_CCMR3X = 0x01;//通道3:組合PWM2模式
  •     PWMA_CCMR3 = 0x50;
  •     PWMA_CCMR4X = 0x00;//通道4:PWM1模式
  •     PWMA_CCMR4 = 0x60;
  •     PWMA_CCER1 = 0x55; //配置通道輸出使能和極性
  •     PWMA_CCER2 = 0x55;
  •     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //設置周期時間
  •     PWMA_ARRL = (u8)PWM_PERIOD;
  •     PWMA_ENO = 0x00;
  •     PWMA_ENO |= ENO1P; //使能輸出
主函數里的改變PWM的代碼
  •             if( dir==0 )
  •             {
  •                 pul++;
  •                 if( pul>=495 )
  •                     dir =1;
  •             }
  •             else
  •             {
  •                 pul--;
  •                 if( pul<=5 )
  •                     dir =0;
  •             }
  •             PWM_SET(pul);
  •             Delay3ms();




ID:1044977 發表于 2025-7-8 22:44
問題已經解決,換成pwm互補輸出加死區調節的方式實現目標波形輸出
ID:1149771 發表于 2025-7-8 09:59
可以用帶PWM硬件移相功能的STC8H2K32U系列
ID:1137639 發表于 2025-7-6 08:13
從問題描述來看,你在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使用不同定時器資源,避免時序干擾,并通過示波器測量定時器計數寄存器與輸出引腳的時序關系,定位比較值設置與輸出翻轉的實際對應關系,從而優化參數配置。
ID:1089588 發表于 2025-7-5 17:20
是不是輸出疊加了,頻率不一樣
ID:1133081 發表于 2025-7-5 15:25
參考官方示例中帶死區控制的PWM互補輸出,控制死區時間即可達到圖A-B的波形變化。

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜视频在线观看 | 日韩中文字幕一区 | 国产精品一二三 | 美丽的姑娘观看在线播放 | 日韩视频在线观看 | 永久免费看片在线播放 | 美女视频福利 | 三级在线看 | 国产精品永久久久久久久久久 | 日韩精品视频免费 | 天堂网亚洲| 日本黄a三级三级三级 | 亚洲国产中文字幕 | 天天躁日日躁狠狠很躁 | 国产永久免费视频 | 亚洲一区二区国产精品 | 91在线看片 | 天堂中文在线资 | 精品免费国产 | 国产精品伦一区二区三级视频 | 欧美在线日韩 | 中文字幕av一区 | 91精品国产成人www | 四虎视频 | 亚洲黄色三级 | 日韩av在线免费播放 | 91视频观看 | 亚洲黄色小视频 | 国产日批视频 | 欧美不卡一区二区三区 | 亚洲男人天堂av | 一级肉体全黄裸片 | 毛片毛片毛片 | 男人添女荫道口图片 | 成人国产精品视频 | 欧美一级做性受免费大片免费 | 91看片看淫黄大片 | 性欧美bbw | 国产综合视频在线观看 | www.久久久 | 青青视频网|