找回密码
 立即注册
查看: 79|回复: 1

还是关于STC8H PWM中断的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-12-12 08:06:35

5

主题

15

回帖

201

积分

中级会员

积分
201
发表于 2025-11-14 09:20:20 | 显示全部楼层 |阅读模式
sbit PWM1_PORT = P5^4;
unsigned char PWMA_ISR_En;

void main()
{
        DelaySec(2);
       
        P_SW2 |= 0x80;                                //扩展寄存器(XFR)访问使能

        //推挽模式
        P5M1 = B00000000;
        P5M0 = B00010000;                        //PWM2P/pin1/P5^4,STC8H2K12U,8脚               

        PWM1_PORT=0;
        DelaySec(2);

        PWMA_PSCR = 55295;        //配置预分频系数,PWM时钟频率=400Hz,PWM时钟周期=2.5ms,系统时钟22.1184MHz
        PWMA_ARR = 9;        //PWM周期=25ms
        PWMA_IER = B00000011;        //使能PWM1比较中断,更新中断
        PWMA_ISR_En = PWMA_IER;
        PWMA_CCR1 = 2;        //设置比较值
        PWM1_PORT = 1;        //PWM1
        PWMA_CR1 = 0x01;        //开始计数
       
        while(1);
}

void PWMA_ISR() interrupt 26
{
unsigned char bb, sr1;
       
        sr1 = PWMA_SR1;
        PWMA_SR1 = 0;
        PWMA_SR2 = 0;
        sr1 &=PWMA_ISR_En;

        if (sr1 & 0x01) //PWMA更新中断
        {
                PWM1_PORT = 1;        //PWM1
               
                bb = PWMA_CCR1;        //当前比较值
                bb = bb + 2;
                if (bb>8) bb = 2;
                PWMA_CCR1=bb;
        }
       
        if (sr1 & 0x02) //比较1中断
        {
                PWM1_PORT = 0;        //PWM1
        }
        if (sr1 & 0x04) //比较2中断
        {
        }
        if (sr1 & 0x08) //比较3中断
        {
        }
        if (sr1 & 0x10) //比较4中断
        {
        }
}

按设计,应该第一个5ms高电平,然后10ms高电平,15ms高电平,20ms高电平,之后循环
但实际上,
当初始CCR=2,15ms高电平,20ms高电平,5ms高电平.....
当初始CCR=4,20ms高电平,5ms高电平.....
当初始CCR=6,一个短暂的高电平,5ms高电平.....
当初始CCR=8,10ms高电平,15ms高电平,20ms高电平,5ms高电平.....
不知道为什么?


初值=2

初值=2

初值=4

初值=4

初值=6

初值=6

初值=8

初值=8
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-12-12 08:06:35

5

主题

15

回帖

201

积分

中级会员

积分
201
发表于 2025-11-17 14:00:16 | 显示全部楼层
请梁工解惑,谢谢
自说自话,经过几天反复试验,发现如下现象,
1、当启动PWM时,会立即产生一个中断,之前STC8G单片机,也是这样,
我在启动PWM前,设定一个变量作为标志ff=1,进入中断后,如果ff==1,就清中断标志,ff=0,然后退出中断
2、之后第二个中断,是比较中断,但与设计又些许不同,按我上面的设计,时钟2.5ms,ARR=9,PWM总周期=25ms
如果设PWMA_CCR1 = 2,应该在5ms处产生比较中断,实际在2.5ms处产生中断,整个PWM周期也减小了2.5ms
3、之后从第三个中断(更新中断)开始就正常了

快照4.png
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-19 05:25 , Processed in 0.103744 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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