找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 815|回复: 8
收起左侧

关于单片机pwm程序 小灯会出现闪烁

[复制链接]
ID:1143041 发表于 2025-1-15 00:10 | 显示全部楼层 |阅读模式
70fded2a592a7375dac64a7e93f55458.png 77b0c4c8baad3fc26229d03e53959259.png f1ba7fb927605f6b5aed10e0e80b7c43.png

在这里我发现小灯会出现闪烁,就是他会慢慢亮,慢慢灭,但是就是会闪几下
回复

使用道具 举报

ID:1133081 发表于 2025-1-15 08:10 | 显示全部楼层
调光灯出现闪烁是因为PWM周期大于20ms。楼主用改变定时中断周期来改变占空比的方式不妥。
//以200um中断周期为例,占空比0~100%
void Timer0Interrupt(void) interrupt 1
{
        static unsigned char count=0;
    TH0 = 0xFF;
    TL0 = 0x38;
        if(++count>=100)count=0;
//  num值在主函数中由按键调整0~100
        if(count>=num)OUT=0;//暗
        else OUT=1;//亮
}
回复

使用道具 举报

ID:161164 发表于 2025-1-15 09:33 | 显示全部楼层
41/42行+12太小了
最少要加30
回复

使用道具 举报

ID:161164 发表于 2025-1-15 11:02 | 显示全部楼层
WL0123 发表于 2025-1-15 08:10
调光灯出现闪烁是因为PWM周期大于20ms。楼主用改变定时中断周期来改变占空比的方式不妥。
//以200um中断周 ...

什么人工智%发言?
回复

使用道具 举报

ID:1143041 发表于 2025-1-15 23:24 | 显示全部楼层
WL0123 发表于 2025-1-15 08:10
调光灯出现闪烁是因为PWM周期大于20ms。楼主用改变定时中断周期来改变占空比的方式不妥。
//以200um中断周 ...

好的,谢谢了
回复

使用道具 举报

ID:1143041 发表于 2025-1-15 23:25 | 显示全部楼层
lkc8210 发表于 2025-1-15 09:33
41/42行+12太小了
最少要加30

感谢,我去试试看
回复

使用道具 举报

ID:891686 发表于 2025-1-16 08:34 | 显示全部楼层
PWM 是周期不变,占空比变化的信号。

定时器应设置为固定周期,定时时间到就对一个计数器进行加一操作。
计数器值小于占空比输出高电平;大于占空比输出低电平。
计数器值如果大于 PWM 周期则计数器清零。
回复

使用道具 举报

ID:1073939 发表于 2025-1-16 09:47 | 显示全部楼层
pwm工作期间只能在中断期间操作pwmout,否则可能会闪烁。
configpwm()要分成2个函数。一个仅用于计算High,Low的加载值,另一个配置T0,开启或关闭T0。
High,Low的加载值仅在T0中断处理更新。

  1. bit gbTR0;
  2. void pwm_onoff(bit b)
  3. {
  4.         gbTR0=b;
  5.         if(b){
  6.                 TR0 = 1;
  7.         }
  8. }
  9. void T0_ISR(void)
  10. {
  11.         pwmout=!pwmout;
  12.         if(pwmout){
  13.                 TH0=HighRH;TL0=HighRL;
  14.         }
  15.         else{
  16.                 //仅在此更新pwm加载值
  17.                 HighRH=high>>8;HighRL=high;LowRH=low>>8;LowRL=low;
  18.                 TH0=LowRH;TL0=LowRL;
  19.                 TR0 = gbTR0;
  20.         }
  21. }
复制代码
回复

使用道具 举报

ID:1073939 发表于 2025-1-16 10:56 | 显示全部楼层
小优化:
在占空比为0或100时关闭T0中断,否则开启T0中断。
这样configpwm()可以不用分成2个函数。

  1. unsigned int high,low;
  2. unsigned char HighRH,HighRL,LowRH,LowRL;
  3. bit gbTR0;
  4. void configpwm(unsigned int fr,unsigned char dc)
  5. {
  6.         //计算high,low;
  7.         if(!TR0){//否则由T0中断刷新加载值
  8.                 HighRH=high>>8;HighRL=high;LowRH=low>>8;LowRL=low;
  9.                 TH0=LowRH;TL0=LowRL;
  10.         }
  11.         if(dc==100){
  12.                 gbTR0=0;
  13.                 TR0 = 0;
  14.                 pwmout=1;
  15.         }
  16.         else if(dc==0){
  17.                 gbTR0=0;
  18.                 if(!TR0)//否则由T0中断使pwmout=0;
  19.                         pwmout=0;
  20.         }
  21.         else {
  22.                 gbTR0=1;
  23.                 TR0 = 1;
  24.         }
  25. }
  26. void T0_ISR(void)
  27. {
  28.         pwmout=!pwmout;
  29.         if(pwmout){
  30.                 TH0=HighRH;TL0=HighRL;
  31.         }
  32.         else{
  33.                 //仅在此更新pwm加载值
  34.                 HighRH=high>>8;HighRL=high;LowRH=low>>8;LowRL=low;
  35.                 TH0=LowRH;TL0=LowRL;
  36.                 TR0 = gbTR0;
  37.         }
  38. }

  39. void main(void)
  40. {
  41.         T0_cfg();
  42.         configpwm(100,0);
  43.         while(1){
  44.                 char dc=0;
  45.                 for(;dc<=100;dc+=10){
  46.                         configpwm(100,dc);
  47.                         //死等
  48.                 }
  49.                 for(;dc<=100;dc-=10){
  50.                         configpwm(100,dc);
  51.                         //死等
  52.                 }
  53.         }
  54. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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