wuzhengmin 发表于 3 天前

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

请教:如何才能让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


DebugLab 发表于 3 天前

点灯先做gamma校正吧,视觉亮度和占空比之间是非线性的

wuzhengmin 发表于 3 天前

DebugLab 发表于 2025-11-4 19:29
点灯先做gamma校正吧,视觉亮度和占空比之间是非线性的

谢谢大侠指点,{:weixiao:}

梁工 发表于 3 天前

wuzhengmin 发表于 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表:





DebugLab 发表于 3 天前

10bit IN 10bit OUT:(pow(duty,2.2F))/4088.0F

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

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

wuzhengmin 发表于 前天 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

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

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

wuzhengmin 发表于 前天 08:36

DebugLab 发表于 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


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

wuzhengmin 发表于 前天 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生成大框架,我再增加呼吸灯的完整程序打包发送上来:

wuzhengmin 发表于 前天 09:01

DebugLab 发表于 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

DebugLab 发表于 前天 09:59

wuzhengmin 发表于 2025-11-5 08:35
谢谢梁工的耐心指导,我看了一下资料,已经知道呼吸灯的话,PWM的频率不能太高,我主频选22.1184M,分频 ...

PWM频率无所谓,100~1000Hz都行,亮度变化的频率低一些就行
页: [1] 2
查看完整版本: 请教:如何才能让PWMA的占空比从0一直到100,把呼吸灯的效果充分展示?(已解决)