找回密码
 立即注册
查看: 47|回复: 4

PWM周期问题,求助

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-07-28 10:10:55

2

主题

9

回帖

132

积分

注册会员

积分
132
发表于 2025-7-24 15:15:15 | 显示全部楼层 |阅读模式

//STC8H8K64U
unsigned int cnt1;

void main(void)
{
        P_SW2 |= 0x80;             //扩展寄存器(XFR)访问使能
        
        P4M1 = 0x00;   P4M0 = 0x00;     //设置为准双向口

        //主频=22.1184MHz
        PWMA_PSCR = 110591;        //设置预分频器,200Hz,周期=5ms
        PWMA_ARR = 0xffff;
        
        PWMA_CCER1 = 0x00;
        PWMA_CCMR1 = 0x00;                                //设置冻结模式
        
        cnt1 = PWMA_CCR1 = 10;
        PWMA_IER = 2;            // 使能中断
        PWMA_CR1 |= 0x81;           //使能ARR预装载,开始计时
   
        cnt1 += 10;

        EA = 1;                    //打开总中断

        while (1);
}

void PWMA_ISR() interrupt 26
{
unsigned char sr;
   
        sr = PWMA_SR1;
        PWMA_SR1 = 0;
   
        if (sr & 0x02)
        {
                PWMA_CCR1 = cnt1;
                cnt1 += 10;
                P41 = ~P41;
        }
}


按设计,PWM时钟=200Hz,计数10次,应该每50ms中断,可实际不是,不知道哪错了
程序,参考,做8路定时器, PWMA+PWMB

快照2.png
回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 2025-7-24 15:18:00 | 显示全部楼层
关于您提到的PWM周期问题,以下是对代码逻辑和配置的分析及建议:

从代码来看,您使用的是STC8H8K64U单片机,并尝试通过PWMA模块实现PWM输出。然而,当前代码中存在一些可能导致PWM周期异常的问题,具体如下:

1. 主频配置不明确  
   代码中注释“主频=221184MHz”,此频率显然不合理(常规单片机主频一般为几MHz至几十MHz)。若实际主频设置错误,将导致预分频器计算不准确,进而影响PWM周期。

2. PWMAPSCR配置不当  
   PWMAPSCR = 110591; 设置了预分频器值。假设系统主频为12MHz,则预分频后频率为:  
   $ f{out} = \frac{f{sys}}{PWMAPSCR + 1} = \frac{12,000,000}{110592} ≈ 108.5Hz $  
   若目标为200Hz,则应调整预分频器值为:  
   $ PWMAPSCR = \frac{f{sys}}{200} - 1 $  
   建议根据实际主频重新计算并设置该寄存器。

3. ARR与CCR配置逻辑问题  
   PWMAARR = 0xffff; 设置了自动重载寄存器的最大值,但未明确说明其与PWM周期的关系。若希望PWM周期为5ms,则需确保ARR值与主频、预分频器匹配。例如:  
   $ T{PWM} = \frac{(PWMAARR + 1) \times (PWMAPSCR + 1)}{f{sys}} $  
   需根据实际参数重新计算ARR值。

4. 中断处理逻辑缺失  
   当前代码在中断服务函数中仅读取状态寄存器,未对PWM占空比进行更新或处理。若需动态调整占空比,应在中断中修改PWMACCR1的值,并确保其不超过ARR范围。

建议修改方案  
明确系统主频,修正预分频器计算公式;  
根据目标PWM周期重新计算ARR和CCR值;  
完善中断服务函数逻辑,确保占空比动态调整;  
检查PWMACR1寄存器配置,确保使能位正确。

如需进一步调试,可使用示波器观察实际PWM输出波形,以验证配置是否符合预期。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-07-31 14:15:17
已绑定手机
已实名认证

116

主题

2499

回帖

6450

积分

版主

积分
6450
发表于 2025-7-24 15:58:50 | 显示全部楼层
您好,这是因为PWMA_PSCR 寄存器是16位的,最大值为65535,但是您设置的110591>65535了,所以会导致截断,进而出现输出的时间错误。
这里给出一个使用aicube生成的正确程序,可以在P43引脚上输出50ms一次取反的波形,以下是代码的工程文件,已经经过测试:

pwm.zip (262.85 KB, 下载次数: 1)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 2025-7-24 15:59:29 | 显示全部楼层
PSCR是2个字节最大65535
需要允许CCR计数到一个较大的值实现和使用HSCLKDIV、HSPWMDIV、PWMA_PSCR进行110592分频等效的结果
8H8K64U没有HSCLKDIV和HSPWMDIV

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-07-28 10:10:55

2

主题

9

回帖

132

积分

注册会员

积分
132
发表于 2025-7-24 16:34:34 | 显示全部楼层
谢谢回复,没注意大于65535了,只想着200Hz了,主频=22.1184Mhz,原来用STC8G,PWM时钟可以是定时器溢出频率,定时器溢出,12T时,可以每个脉冲周期=5ms。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-1 01:41 , Processed in 0.116377 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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