找回密码
 立即注册
查看: 43|回复: 2

32G单片机PWMA波形咨询

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2026-03-02 20:13:14

2

主题

28

回帖

146

积分

注册会员

积分
146
发表于 7 天前 | 显示全部楼层 |阅读模式
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Demo --------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.stcai.com ------------------------------------------*/
/* --- BBS: www.stcaimcu.com ---------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/


#define MAIN_Fosc                12000000L        //定义主时钟

#include        "STC32G.h"
sbit start=P0^3;
sbit stop =P0^2;
sbit add  =P3^5;
sbit sub  =P3^4;

#define        PWMA_DUTY                  1000                        //周期
u16          PWMA_PHASE1=100;              //通道1相位差  500 180度
u16          PWMA_PHASE2=100;              //通道2相位差  500 180度
u16                pwma1;                //PWMA1输出高电平时间
u16                pwma2;                //PWMA2输出高电平时间
bit                B_OutState,B_OutState2;        //中断使用, 用户层不可见.
u8 con;
void PWMA_config(void);

void delay(u16 i)
{
        u16 j ,k;
for(j=0;j<i;j++)
        for(k=0;k<500;k++);
}        
/******************** 主函数 **************************/
void main(void)
{ EAXFR = 1; //扩展寄存器(XFR)访问使能
        WTST   = 0;
        CKCON  = 0;
        P_SW2 |= 0x80;                //SFR enable   
  P2=0x00;
        pwma1 = 200;        //通道1占空比
        pwma2 = 200;        //通道2占空比
        PWMA_PHASE2=1;        
        PWMA_config();
        EA = 1;
//        IP=0x80;
//        IPH=0x80;
        while (1)
        {
                if(add==0){while(add==0);if(PWMA_PHASE2<500) PWMA_PHASE2+=1;}
                if(sub==0){while(sub==0);if(PWMA_PHASE2>=2)  PWMA_PHASE2-=1;}
        }
}
//========================================================================
// 函数: void PWMA_config(void)
// 描述: PWM配置函数。
// 参数: noe.
// 返回: none.
// 版本: V1.0, 2022-3-15
// 备注:
//========================================================================
void PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable   
        PWMA_ENO    = 0;        // IO输出禁止
        PWMA_IER    = 0;        // 禁止中断
        PWMA_SR1    = 0;        // 清除状态
        PWMA_SR2    = 0;        // 清除状态
        PWMA_CR1    = 0;        // 清除控制寄存器
        PWMA_CR2    = 0;        // 清除控制寄存器

        PWMA_PSCRH = 0;                        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_PSCRL = 1;                // 预分频, PWM时钟 = 24MHz/(2+1)=8MHz
        PWMA_DTR   = 12;                        // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
                                                        //                                0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
        PWMA_ARRH    = (PWMA_DUTY-1)/256;        // 自动重装载寄存器,  控制PWM周期
        PWMA_ARRL    = (PWMA_DUTY-1)%256;

        PWMA_CCMR1  = 0x68;                // 强制输出低
        PWMA_CCR1H  = pwma1/256;        // 比较值, 控制占空比(高电平时钟数)
        PWMA_CCR1L  = pwma1%256;

        PWMA_CCMR2 = 0x40;                // 强制输出低
        PWMA_CCR2H = PWMA_PHASE2/256;        // 匹配值
        PWMA_CCR2L = PWMA_PHASE2%256;

        PWMA_CCER1  = 0x55;        // 捕获/比较使能寄存器1
        PWMA_CCER2  = 0x00;        // 捕获/比较使能寄存器2
        PWMA_PS     = 0x05;                // 选择IO
        PWMA_IER    = 0x05;          // 设置允许通道1~4中断处理

        PWMA_BKR    = 0x80;                // 主输出使能 相当于总开关
        PWMA_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
        PWMA_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
        PWMA_ENO    = 0x0F;                // 允许IO输出
}
//========================================================================
// 函数: void PWMA_ISR(void) interrupt PWMA_VECTOR
// 描述: PWMA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-6-1
//========================================================================
void PWMA_ISR(void) interrupt 26
{if(PWMA_SR1 & 0x01)        //更新中断标志
        {
                PWMA_CCR2H = PWMA_PHASE2/256;        // 通道2匹配值
                PWMA_CCR2L = PWMA_PHASE2%256;
                B_OutState = 0;
        }
        if(PWMA_SR1 & 0x04)        //通道2匹配中断标志
        {
                if(!B_OutState)
                {
                        B_OutState = 1;
                        PWMA_CCMR2  = 0x50;                // 通道模式配置, 强制为有效电平
                        PWMA_CCR2H = (PWMA_PHASE2+pwma2)/256;        // 通道2匹配值
                        PWMA_CCR2L = (PWMA_PHASE2+pwma2)%256;
                        PWMA_CCMR2  = 0x60;                // 通道模式配置, PWM模式1, 匹配时输出低电平
                }
                else        PWMA_CCMR2  = 0x40;        // 通道模式配置, 强制为无效电平
        }
        PWMA_SR1 = 0;        //清除中断标志
        PWMA_SR2 = 0;        //清除中断标志
}
这是参考提供的程序修改的(想用软件的方式产生移相波形),通道1产生一个占空比为20%的波形,通道2也是产生人个占空比为20%的波形,通道2的相位差PWMA_PHASE2<20时,波形异常,>20时波形是正常的。请问下大家有没有碰到这个问题?


IMG_20260228_135332.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2026-03-07 16:27:23
已绑定手机
已实名认证

129

主题

3376

回帖

8788

积分

版主

积分
8788
发表于 5 天前 | 显示全部楼层
这个是因为代码执行也需要时间
如果你的值装载完成后,比你这个20+pwm大了,则没法比较到,所以就会坏掉。
建议你可以另外的打开一个通道进行比较,例如ccr3,但是不配置输出
这样ccr1设置20%时,使用ccr3设置10%,
然后在ccr3的比较中断内打开ccr2输出并设置当前值+20%宽度,即可实现移相输出。
pwm周期中断里让ccr2输出为0即可
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2026-03-02 20:13:14

2

主题

28

回帖

146

积分

注册会员

积分
146
发表于 5 天前 | 显示全部楼层
王*** 发表于 2026-3-2 09:45
这个是因为代码执行也需要时间
如果你的值装载完成后,比你这个20+pwm大了,则没法比较到,所以就会坏掉。 ...

这个方法之前也搞过,总是在一个地方有问题。通道1移相从50开始,通道2也从50开始,开始的时候波形正常,但通道2从50开始加1开始移相,加个几个数大概到57左右,波形就乱了,但加到60之后就开始正常。也是百思不得其解。扡通道1-2的开始一起改成30,60,100。都是一样的效果。现在准备改8051,可以实现不对称时没问题。哈哈
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-7 20:02 , Processed in 0.108280 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表