Yang.Lian 发表于 2024-7-16 16:12:23

真正的呼吸灯效果

STC32G-SOFTWARE-LIB 附送的

高级PWM1-PWM2-PWM3-PWM4驱动P6口呼吸灯实验程序
高级PWM5-PWM6-PWM7-PWM8输出测试程序


这两个例子里面,实现的呼吸灯效果,只能说可以亮,效果不是很好

我搜了一下坛子,没有找到比较好的实现

是不是得抓住机会,挣点积分,来点贡献?
先写个python代码生成占空比的列表


import math

def generate_breathing_array(num_elements, pwm_max, gamma):
    breath_array = []
    for i in range(num_elements):
      # 生成正弦波值,并调整相位以从2047开始到0再回到2047
      t = (i / num_elements) * 2 * math.pi
      sin_value = (math.sin(t - math.pi / 2) + 1) / 2# 正弦波从1到0再到1

      # 应用gamma校正
      gamma_corrected_value = math.pow(sin_value, gamma)

      # 映射到PWM占空比范围
      pwm_value = int(gamma_corrected_value * pwm_max)
      
      breath_array.append(2047-pwm_value)

    return breath_array

# 定义参数
num_elements = 128
pwm_max = 2047


# 生成两个数组,一个用于翠绿色LED,一个用于红色LED
green_led_pwm = generate_breathing_array(num_elements, pwm_max, 2.4)
red_led_pwm = generate_breathing_array(num_elements, pwm_max, 2.2)

def print_c_array(name, array):
    print(f"uint16_t {name}[] = {{")
    for i in range(len(array)):
      if i % 8 == 0 and i != 0:
            print()
      print(f"{array[i]:4d}, ", end='')
    print("\n};")

print("Green LED PWM values in C array format:")
print_c_array("green_led_pwm", green_led_pwm)

print("Red LED PWM values in C array format:")
print_c_array("red_led_pwm", red_led_pwm)





上述纯 python 代码实现了基于正弦函数的正半周期的呼吸效果,顺便加入的gamma修正,让整个效果看上去更加顺滑

其中有一句是
    breath_array.append(2047-pwm_value)
这里是由于我这里的LED是灌电流方式,也就是说GPIO低电平才亮,高电平灭,所以这里用2047减了一下子

gamma 值大家可以根据自己LED的特性自行修改,差不多都是在 2.2 附近

调整好以后,就可以运行python脚本了,我运行的结果是

Green LED PWM values in C array format:
uint16_t green_led_pwm[] = {
2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
2047, 2046, 2045, 2044, 2042, 2040, 2036, 2032,
2027, 2021, 2013, 2003, 1992, 1979, 1964, 1946,
1926, 1903, 1877, 1849, 1817, 1782, 1745, 1704,
1660, 1612, 1562, 1509, 1453, 1394, 1333, 1269,
1203, 1136, 1068,998,928,857,787,717,
648,580,514,451,390,333,279,228,
183,141,105,   73,   47,   27,   12,    3,
   0,    3,   12,   27,   47,   73,105,141,
183,228,279,333,390,451,514,580,
648,717,787,857,928,998, 1068, 1136,
1203, 1269, 1333, 1394, 1453, 1509, 1562, 1612,
1660, 1704, 1745, 1782, 1817, 1849, 1877, 1903,
1926, 1946, 1964, 1979, 1992, 2003, 2013, 2021,
2027, 2032, 2036, 2040, 2042, 2044, 2045, 2046,
2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
};

Red LED PWM values in C array format:
uint16_t red_led_pwm[] = {
2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
2046, 2045, 2043, 2041, 2039, 2035, 2030, 2025,
2018, 2009, 1999, 1987, 1973, 1956, 1938, 1917,
1893, 1867, 1838, 1806, 1771, 1733, 1692, 1649,
1602, 1552, 1500, 1445, 1388, 1329, 1267, 1204,
1139, 1073, 1006,938,870,802,735,668,
603,539,477,418,361,307,257,210,
168,130,   96,   67,   44,   25,   11,    3,
   0,    3,   11,   25,   44,   67,   96,130,
168,210,257,307,361,418,477,539,
603,668,735,802,870,938, 1006, 1073,
1139, 1204, 1267, 1329, 1388, 1445, 1500, 1552,
1602, 1649, 1692, 1733, 1771, 1806, 1838, 1867,
1893, 1917, 1938, 1956, 1973, 1987, 1999, 2009,
2018, 2025, 2030, 2035, 2039, 2041, 2043, 2045,
2046, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
};


根据上述结果
其他内容请自行抄 STC32G-SOFTWARE-LIB 附送的代码
设置一个定时器,定时器每40毫秒中断一次
在中断中更新PWM的占空比,像这样   
    PWMB_Duty7(red_led_pwm);
    PWMB_Duty6(green_led_pwm);
    index ++;
    if (index > 127)
    {
      index = 0;
    }
设置一个全局变量 uint8_t index; 记录当前的状态

最后上机运行的呼吸效果很顺滑。

当然由于是对称的,所以还可以优化,省下64字节

但是,没办法,STC32G 各种存都很大,不允许我低调


Yang.Lian 发表于 2024-7-16 16:18:19

录了个视频

soma 发表于 2024-7-16 16:51:33

stc32也可以通过Python控制吗?

DebugLab 发表于 2024-7-16 16:52:29

用不着这么复杂,做个gamma校正就好了,现在点灯的99%不做gamma校正


这是10bit的gamma校正,其他位数修改4088.0F



unsigned int Gamma(unsigned int temp)
{
        return (pow(temp,2.2F))/4088.0F;
}


hsrzq 发表于 2024-7-16 19:33:39

DebugLab 发表于 2024-7-16 16:52
用不着这么复杂,做个gamma校正就好了,现在点灯的99%不做gamma校正



{:4_184:}死去的脑细胞又开始攻击我了。当年做的笔记:


由于人眼特性,人对暗色变化更加敏感,因此肉眼感觉的50度灰实际线性值只有0.214左右。
为了使计算机表示色彩递进关系和人眼感受到的基本一致,微软联合爱普生、HP等制定了sRGB,它的通道值127就对应人眼感受到的中灰(传说中的伽玛校正)。
通常情况下如果没有特殊说明,一般所说的“RGB”均指sRGB

嵌入式之路 发表于 2024-7-16 21:25:19

soma 发表于 2024-7-16 16:51
stc32也可以通过Python控制吗?

你可以用PY写个上位机 结合某种通讯协议 传递数据给STC32 然后让他执行对应的动作. 不能直接使用PY编程

Yang.Lian 发表于 2024-7-17 09:02:33

soma 发表于 2024-7-16 16:51
stc32也可以通过Python控制吗?

就是用 python 生成一个c定义的数组而已,没有用python 控制,也运行不了python

Yang.Lian 发表于 2024-7-17 09:02:47

嵌入式之路 发表于 2024-7-16 21:25
你可以用PY写个上位机 结合某种通讯协议 传递数据给STC32 然后让他执行对应的动作. 不能直接使用PY编程 ...

说的对

那年夏天 发表于 2024-8-20 10:37:46

楼主 stc8g带pwm的能用吗?我是新手,能否给个演示代码{:4_184:}
页: [1]
查看完整版本: 真正的呼吸灯效果