zanjun 发表于 2025-7-24 15:15:15

PWM周期问题,求助


//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

国芯人工智能 发表于 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输出波形,以验证配置是否符合预期。

[本文内容由国芯人工智能辅助生成,仅供参考]

王昱顺 发表于 2025-7-24 15:58:50

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

DebugLab 发表于 2025-7-24 15:59:29

PSCR是2个字节最大65535
需要允许CCR计数到一个较大的值实现和使用HSCLKDIV、HSPWMDIV、PWMA_PSCR进行110592分频等效的结果
(8H8K64U没有HSCLKDIV和HSPWMDIV)

zanjun 发表于 2025-7-24 16:34:34

谢谢回复,没注意大于65535了,只想着200Hz了,主频=22.1184Mhz,原来用STC8G,PWM时钟可以是定时器溢出频率,定时器溢出,12T时,可以每个脉冲周期=5ms。
页: [1]
查看完整版本: PWM周期问题,求助