找回密码
 立即注册
查看: 327|回复: 10

请问这样设置PWM占空比为什么LED灯的亮度是一样的,是那里的问题?求大神解答一下

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-10-16 09:14:47
已绑定手机

8

主题

29

回帖

142

积分

注册会员

积分
142
发表于 2025-9-2 15:51:46 | 显示全部楼层 |阅读模式
请问这样设置PWM占空比为什么LED灯的亮度是一样的,是那里的问题?求大神解答一下,是那里的问题
截图202509021551086397.jpg
回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 2025-9-2 15:53:00 | 显示全部楼层
您好,关于您提到的“设置PWM占空比后LED灯亮度一致”的问题,可能是由以下几个方面的原因导致的。以下为专业分析与建议:

1. PWM频率过低  
   PWM(脉宽调制)控制LED亮度的核心原理是通过调节占空比来改变LED的平均电流。如果PWM频率过低,人眼可能会感知到闪烁,但若频率过高,则可能无法有效控制亮度。然而,若您发现无论占空比如何变化,LED亮度始终一致,可能是因为PWM频率过低,导致LED未被正确驱动。建议将PWM频率提升至200Hz以上,以确保LED能够稳定响应。

2. 驱动电路设计不当  
   如果使用的是MOSFET或三极管作为开关器件,需确保其工作在饱和区,以保证足够的导通能力。若驱动电路存在阻抗过大、驱动能力不足或信号失真等问题,可能导致LED实际电流未随占空比变化而变化,从而造成亮度不变。

3. LED电源供电不稳定  
   若LED的供电电压波动较大,或电源本身不具备良好的稳压能力,即使PWM占空比变化,LED的实际发光效果也可能不明显。建议检查电源稳定性,并确保LED工作在额定电压范围内。

4. PWM信号输出异常  
   检查PWM信号是否正常输出。可通过示波器观察PWM波形,确认占空比是否按预期变化。若PWM信号未正确生成或存在干扰,可能导致LED无法响应占空比变化。

5. 软件配置错误  
   若使用单片机或微控制器生成PWM信号,需检查相关寄存器配置是否正确,包括定时器模式、预分频值、周期和比较值等。若配置错误,可能导致PWM输出固定,无法实现亮度调节。

6. LED自身特性影响  
   不同LED的正向压降、电流-亮度曲线可能存在差异。若所选LED对电流变化不敏感,或处于非线性区域,可能难以通过PWM实现明显亮度变化。

7. 外部干扰或测量误差  
   在实际测试中,若使用光强传感器或肉眼观察,可能因环境光线干扰或视觉适应性导致误判。建议使用专业仪器进行测量,以排除主观判断误差。

综上所述,建议您从上述几个方面逐一排查,优先检查PWM信号是否正常、驱动电路是否合理、电源是否稳定。如仍无法解决问题,可提供更多硬件和软件配置信息,以便进一步定位原因。

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-10-16 09:14:47
已绑定手机

8

主题

29

回帖

142

积分

注册会员

积分
142
发表于 2025-9-2 16:45:11 | 显示全部楼层
国芯人*** 发表于 2025-9-2 15:53
您好,关于您提到的“设置PWM占空比后LED灯亮度一致”的问题,可能是由以下几个方面的原因导致的。以下为专 ...

示波器观察PWM的波形不对
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-10-11 16:47:28
已绑定手机

11

主题

79

回帖

783

积分

版主

积分
783
发表于 2025-9-2 16:53:26 | 显示全部楼层
已转发技术,请稍等
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-10-15 08:56:42
已绑定手机

47

主题

2274

回帖

7997

积分

论坛元老

积分
7997
发表于 2025-9-2 17:08:30 | 显示全部楼层
参考附件例子,通过这个函数设置占空比:
  1. void UpdatePcaPwm(u8 PCA_id, u16 pwm_value)
  2. {
  3.         if(PCA_id == PCA0)
  4.         {
  5.                 PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
  6.                 CCAP0H = (u8)pwm_value;
  7.         }
  8.         else if(PCA_id == PCA1)
  9.         {
  10.                 PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
  11.                 CCAP1H = (u8)pwm_value;
  12.         }
  13.         else if(PCA_id == PCA2)
  14.         {
  15.                 PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
  16.                 CCAP2H = (u8)pwm_value;
  17.         }
  18. }
复制代码

STC8G PCA型PWM-10位.zip

6.7 KB, 下载次数: 11

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-2 17:23:44 | 显示全部楼层
截图202509021706306544.jpg

具体可以查看技术手册介绍
也就是说,实际使用中,如果没有特殊需求,需要将下面的这两个寄存器给同样的值,例如给了CCAP0H=10,那么CCAP0L也要给10
截图202509021707033110.jpg
如果你想要小占空比可以给CCAP0H = CCAP0L = 10;更大一点就CCAP0H = CCAP0L = 100;这样子,前面的EPCnH和XCCAPnH也可以跟着改动,这里举例的时候默认为0了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-10-16 09:14:47
已绑定手机

8

主题

29

回帖

142

积分

注册会员

积分
142
发表于 2025-9-3 08:41:53 | 显示全部楼层
乘风*** 发表于 2025-9-2 17:08
参考附件例子,通过这个函数设置占空比:

好的,谢谢了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:585
  • 最近打卡:2025-10-16 07:20:54
已绑定手机

86

主题

6274

回帖

1万

积分

超级版主

积分
11738
发表于 2025-9-3 12:12:46 | 显示全部楼层
测试通过的程序供参考:
通过设置EPCxH,使占空比设置为0或1023时,波形都是直线,解决了极值关不死的问题
初始化:
  1.         CCON=0x00;                                //设置PCA控制寄存器
  2.         CMOD=0x80;                                //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
  3.         CL=0x00;                                //设置PCA计数器
  4.         CH=0x00;                                //设置PCA计数器
  5.         CCAPM0=PWM0;                        //使能PCA模块0PWM功能
  6.         PCA_PWM0=0xc0;                        //设置PCA模块0输出10位PWM
  7.         CCAPM1=PWM1;                        //使能PCA模块1PWM功能
  8.         PCA_PWM1=0xc0;                        //设置PCA模块1输出10位PWM
  9.         CCAPM2=PWM2;                        //使能PCA模块2PWM功能
  10.         PCA_PWM2=0xc0;                        //设置PCA模块2输出10位PWM
  11.         CR=1;                                        //启动PCA
复制代码
设置PWM占空比:
  1. void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
  2. {
  3.         unsigned char temp_l,temp_h,temp;
  4.         
  5.         temp_l=pwm_0&0x00ff;                //读pwm_0低8位赋值给temp_l
  6.         temp_h=(pwm_0&0x0300)>>4;        //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0[5:4])位置,赋值给temp_h
  7.         temp=PCA_PWM0&0xcd;                        //读PCA_PWM0,XCCAP2H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
  8.         temp_h|=temp;                                //写其他位到temph
  9.         if(pwm_0==0x03ff)                        //如果pwm_0最大
  10.                 temp_h|=0x02;                        //设置EPC0H(PCA_PWM0[1])为1
  11.         PCA_PWM0=temp_h;                        //写PCA_PWM0(先写高2位)
  12.         CCAP0H=temp_l;                                //写CCAP0H(再写低8位)
  13.         
  14.         temp_l=pwm_1&0x00ff;                //读pwm_1低8位赋值给temp_l
  15.         temp_h=(pwm_1&0x0300)>>4;        //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1[5:4])位置,赋值给temp_h
  16.         temp=PCA_PWM1&0xcd;                        //读PCA_PWM1,XCCAP1H(PCA_PWM2[5:4])、EPC1H(PCA_PWM1[1])清零后赋值给temp
  17.         temp_h|=temp;                                //写其他位到temph
  18.         if(pwm_1==0x03ff)                        //如果pwm_1最大
  19.                 temp_h|=0x02;                        //设置EPC1H(PCA_PWM1[1])为1
  20.         PCA_PWM1=temp_h;                        //写PCA_PWM1(先写高2位)
  21.         CCAP1H=temp_l;                                //写CCAP1H(再写低8位)
  22.         
  23.         temp_l=pwm_2&0x00ff;                //读pwm_2低8位赋值给temp_l
  24.         temp_h=(pwm_2&0x0300)>>4;        //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2[5:4])位置,赋值给temp_h
  25.         temp=PCA_PWM2&0xcd;                        //读PCA_PWM2,XCCAP2H(PCA_PWM2[5:4])、EPC2H(PCA_PWM2[1])清零后赋值给temp
  26.         temp_h|=temp;                                //写其他位到temph
  27.         if(pwm_2==0x03ff)                        //如果pwm_2最大
  28.                 temp_h|=0x02;                        //设置EPC2H(PCA_PWM2[1])为1
  29.         PCA_PWM2=temp_h;                        //写PCA_PWM2(先写高2位)
  30.         CCAP2H=temp_l;                                //写CCAP2H(再写低8位)
  31. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:516
  • 最近打卡:2025-10-16 00:05:49
已绑定手机

154

主题

1889

回帖

2621

积分

金牌会员

积分
2621
发表于 2025-9-3 16:53:23 | 显示全部楼层
10位pwm要转换,
void PWM_SET(u16 val)   //val 取值 0-1023
{
    CCAPM1 = 0x40;
        PCA_PWM1&= ~(3<<4);        //清零重装值高2位
        PCA_PWM1|= (val>>4)&0x30; //设置新的重装值高2位
    CCAP1H = val;

        CCAPM1 = 0x42;
}
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-10-16 09:14:47
已绑定手机

8

主题

29

回帖

142

积分

注册会员

积分
142
发表于 2025-9-11 10:33:31 | 显示全部楼层
void UpdatePcaPwm(u8 PCA_id, u16 pwm_value)
{
        if(PCA_id == PCA0)
        {
                PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
                CCAP0H = (u8)pwm_value;
        }
        else if(PCA_id == PCA1)
        {
                PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
                CCAP1H = (u8)pwm_value;
        }
        else if(PCA_id == PCA2)
        {
                PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
                CCAP2H = (u8)pwm_value;
        }
}
void main()
{
P3M0 |= 0x08; P3M1 &= ~0x08; //P3.3推挽模式
        if(LorH)
                P3M0 |= 0x04; P3M1 &= ~0x04; //P3.2推挽模式


       
  P_SW1 = 0x00; //ECI/P1.2, CCP0/P1.1, CCP1/P1.0, CCP2/P3.7
        //P_SW1 = 0x10; //ECI_2/P3.4, CCP0_2/P3.5, CCP1_2/P3.6, CCP2_2/P3.7
        //P_SW1 = 0x20; //ECI_3/P2.4, CCP0_3/P2.5, CCP1_3/P2.6, CCP2_3/P2.7
       
        CCON = 0x00;
        //CMOD = 0x04; //PCA 时钟为定时器0的溢出脉冲
        CMOD = 0x08; //PCA 时钟为系统时钟
        CL = 0x00;
        CH = 0x00;


        //-- 10 位 PWM--       
        if(LorH)
        {
                CCAPM0 = 0x02;          //PCA 模块 0 为 PWM 工作模式
                PCA_PWM0 = 0xc0; //PCA 模块 0 输出 10 位 PWM
                CCAP0L = 0xff;
                CCAP0H = 0x03;
        }
       
        CCAPM1 = 0x02;          //PCA 模块 1 为 PWM 工作模式
        PCA_PWM1 = 0xc0; //PCA 模块 1 输出 10 位 PWM
        CCAP1L = 0xff;
        CCAP1H = 0x03;
        CR = 1; //启动 PCA 计时器


        UpdatePcaPwm(PCA1,1023);
        if(LorH)
                UpdatePcaPwm(PCA0,1023);
while (1);

}
为什么初始化后灯是常亮的,UpdatePcaPwm(PCA1,1023);调用后灯彩熄灭,导致上电后灯会闪一下彩熄灭
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 10:06 , Processed in 0.129819 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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