找回密码
 立即注册
查看: 119|回复: 13

请教:如何才能让PWMA的占空比从0一直到100,把呼吸灯的效果充分展示?(已解决)

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-11-07 10:12:07
已绑定手机

11

主题

619

回帖

1152

积分

金牌会员

积分
1152
发表于 3 天前 | 显示全部楼层 |阅读模式
请教:如何才能让PWMA的占空比从0一直到100,把呼吸灯的效果充分展示?


最近在学习AiCube,先练习一下PWMA

看看下面这个程序片段(用在呼吸灯改变占空比):


////////////////////////////////////////
// PWMA中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
    //<<AICUBE_USER_PWM0_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
        
               
                if(blinkflag == 0) duty -= 40;                                //由暗到亮过程:duty-10
                else if(blinkflag == 1) duty += 40;                 //有亮到暗过程:duty+10
                if(duty >= 1000) blinkflag = 0;                                //防溢出周期1000
                else if(duty <= 0) blinkflag = 1;                        //防溢出
                updateduty = 1;                        //占空比更新标志置1
               
                P33=0;
               
                P32=0;
        
        
    if (PWMA_CheckCC1Flag())            //判断PWM捕获/比较中断
    {
        PWMA_ClearCC1Flag();            //清除PWM捕获/比较中断标志
    }
    if (PWMA_CheckCC2Flag())            //判断PWM捕获/比较中断
    {
        PWMA_ClearCC2Flag();            //清除PWM捕获/比较中断标志
    }
    //<<AICUBE_USER_PWM0_ISR_CODE1_END>>
}

现在的问题是占空比在50左右变动,但是幅度太小,变成眨眼灯啦!频率没问题,已经定在100HZ


回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:607
  • 最近打卡:2025-11-07 09:00:20
已绑定手机

87

主题

6477

回帖

1万

积分

超级版主

积分
12268
发表于 3 天前 | 显示全部楼层
点灯先做gamma校正吧,视觉亮度和占空比之间是非线性的
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-11-07 10:12:07
已绑定手机

11

主题

619

回帖

1152

积分

金牌会员

积分
1152
发表于 3 天前 | 显示全部楼层
Debu*** 发表于 2025-11-4 19:29
点灯先做gamma校正吧,视觉亮度和占空比之间是非线性的

谢谢大侠指点,

点评

给你个伽马校正的EXCEL表: [attachimg]119978[/attachimg]  详情 回复 发表于 3 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:219
  • 最近打卡:2025-11-06 21:59:58

83

主题

6828

回帖

1万

积分

超级版主

积分
14662
发表于 3 天前 | 显示全部楼层
wuzhe*** 发表于 2025-11-4 20:25
谢谢大侠指点,

伽马校正计算公式:
#define    PWM_PERIOD    1023      //定义PWM周期

#define    GAMMA             2.2f       //定义伽马系数
#define    DOTS                256       //定义总点数(步数)
//N为当前点数
pwm_duty = pow((float)N / DOTS, GAMMA) * PWM_PERIOD;

查表法的话,再给你个伽马校正的EXCEL表:

截图202511042104519227.jpg

呼吸灯-伽马系数计算.xls (142 KB, 下载次数: 15)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:607
  • 最近打卡:2025-11-07 09:00:20
已绑定手机

87

主题

6477

回帖

1万

积分

超级版主

积分
12268
发表于 3 天前 | 显示全部楼层
10bit IN 10bit OUT:(pow(duty,2.2F))/4088.0F
截图202511042145537380.jpg
12bit IN 12bit OUT:(pow(duty,2.2F))/21608.0F
截图202511042146199948.jpg
12bit IN 15bit OUT:(pow(duty,2.2F))/2700.91F
截图202511042146425876.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-11-07 10:12:07
已绑定手机

11

主题

619

回帖

1152

积分

金牌会员

积分
1152
发表于 前天 08:35 | 显示全部楼层
梁*** 发表于 2025-11-4 21:05
wuzhengmin 发表于 2025-11-4 20:25
谢谢大侠指点,
伽马校正计算公式:

谢谢梁工的耐心指导,我看了一下资料,已经知道呼吸灯的话,PWM的频率不能太高,我主频选22.1184M,分频系数我取219,然后ARR取999,目的是搞个100HZ的PWM波,呼吸(亮度)我只调整占空比CCR,因为占空比分母已经是ARR+1,所有CCR从0变化到1000

但现在效果不好,可以看出呼吸,但是太快,想细化一下!

这个伽马矫正,我慢慢研究一下!

点评

PWM频率无所谓,100~1000Hz都行,亮度变化的频率低一些就行  详情 回复 发表于 前天 09:59
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-11-07 10:12:07
已绑定手机

11

主题

619

回帖

1152

积分

金牌会员

积分
1152
发表于 前天 08:36 | 显示全部楼层
Debu*** 发表于 2025-11-4 21:49
10bit IN 10bit OUT:(pow(duty,2.2F))/4088.0F

12bit IN 12bit OUT:(pow(duty,2.2F))/21608.0F

感谢大佬的耐心指导,我慢慢来研究!
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-11-07 10:12:07
已绑定手机

11

主题

619

回帖

1152

积分

金牌会员

积分
1152
发表于 前天 08:59 | 显示全部楼层
另外,我用AiCube来试验了,我只是要产生4组PWM波(同时需要PWM中断+USD-CDC)

用AI8051U和STC8H8G64U ,都可以由AiCube先产生程序框架,但是芯片换成STC32G12K128就不行,

首先STC32G12K128的PWMA通道1引脚选择,选择不了,我折腾了好几天,后来投降了,干脆不用通道1

但是也不能同时产生4组PWM波(同时需要PWM中断+USD-CDC),感觉是和USB-CDC功能相冲突:

并且PS寄存器设置的脚位也没能实现。。。。。。。。

到今天为止,也没有搞明白

我先把stc-8h8k64u芯片用AiCube生成大框架,我再增加呼吸灯的完整程序打包发送上来:
截图202511050859162918.jpg
截图202511050859458778.jpg

FreeRTOS-STC32G-USB-CDC.zip

327.69 KB, 下载次数: 13

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-11-07 10:12:07
已绑定手机

11

主题

619

回帖

1152

积分

金牌会员

积分
1152
发表于 前天 09:01 | 显示全部楼层
Debu*** 发表于 2025-11-4 21:49
10bit IN 10bit OUT:(pow(duty,2.2F))/4088.0F

12bit IN 12bit OUT:(pow(duty,2.2F))/21608.0F

另外,随时欢迎来顺德伦教玩,我请你吃饭喝茶!我电话17364970665
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:607
  • 最近打卡:2025-11-07 09:00:20
已绑定手机

87

主题

6477

回帖

1万

积分

超级版主

积分
12268
发表于 前天 09:59 | 显示全部楼层
wuzhe*** 发表于 2025-11-5 08:35
谢谢梁工的耐心指导,我看了一下资料,已经知道呼吸灯的话,PWM的频率不能太高,我主频选22.1184M,分频 ...

PWM频率无所谓,100~1000Hz都行,亮度变化的频率低一些就行

点评

个人建议PWM频率高一些,如1000Hz,避免人眼看出频闪,尤其是在LED相对人眼快速移动的时候  详情 回复 发表于 前天 10:01
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-7 14:39 , Processed in 0.115148 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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