armfans 发表于 2025-2-3 08:31:23

给PWMB_CCR5赋值超出0xFF出现错误

芯片:STC8H      


PWMB_CCR5 = 0;
      Delay_ms(2000);
      while(PWMB_CCR5 < 600)
      {
            PWMB_CCR5 += 10;
            Delay_ms(1000);
            printf("%d\r\n",PWMB_CCR5);            
      }
程序如上:PWMB_CCR5循环自增,在小于255以下的情况没有问题,超出则出现随机值,请问这是如何造成的。程序开头已经加了 P_SW2 |= 0x80;//扩展寄存器(XFR)访问使能。
打印信息:

220
230
240
250
\0270
\0290
\0310
\0330
\0350
\0370
\0390
410
430
450
204
470
224
234
244
254
\0274
\0294
\0314
\0334
\0354
\0374
\0394
218


王昱顺 发表于 2025-2-3 10:54:58

需要改为:printf("%d\r\n",(int)PWMB_CCR5);//否则printf就会出现一些问题

armfans 发表于 2025-2-3 11:43:56

加了(int)强制转换,问题依旧,超过255以后还是每隔一行输出错误,不知道是printf的问题,还是PWMB_CCR5赋值的问题。

armfans 发表于 2025-2-3 12:13:48

确定是PWMB_CCR5赋值的问题,PWM外接阻容滤波,接万用表看电压,250之前确实电压稳步升高,再到后面就变随机值了,证明确实是PWMB_CCR5赋值的问题,由于随机值造成循环次数也会出错。

王昱顺 发表于 2025-2-3 12:25:44

armfans 发表于 2025-2-3 12:13
确定是PWMB_CCR5赋值的问题,PWM外接阻容滤波,接万用表看电压,250之前确实电压稳步升高,再到后面就变随 ...

如果使用PWMB_CCR5H和PWMB_CCR5L分开赋值试试呢?
同时,可以使用PWMB_CCMR1 = 0x68;以开启预装载
要求是先写高字节然后再写低字节



1325986650 发表于 2025-2-3 17:00:37

CCR5的值必须小于ARR/100,你看看ARR是多少。

armfans 发表于 2025-2-4 19:15:55

王昱顺 发表于 2025-2-3 12:25
如果使用PWMB_CCR5H和PWMB_CCR5L分开赋值试试呢?
同时,可以使用PWMB_CCMR1 = 0x68;以开启预装载
要求是 ...

可以了,原来16位寄存器需要分高低字节分别赋值,多谢
页: [1]
查看完整版本: 给PWMB_CCR5赋值超出0xFF出现错误