找回密码
 立即注册
查看: 953|回复: 8

真正的呼吸灯效果

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-18 23:48:31

4

主题

78

回帖

658

积分

高级会员

积分
658
发表于 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[index]);
    PWMB_Duty6(green_led_pwm[index]);
    index ++;
    if (index > 127)
    {
        index = 0;
    }
设置一个全局变量 uint8_t index; 记录当前的状态

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

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

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


希望这个世界让我装一次B
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-18 23:48:31

4

主题

78

回帖

658

积分

高级会员

积分
658
发表于 2024-7-16 16:18:19 | 显示全部楼层
录了个视频

393_1721117710.mp4

2.78 MB, 下载次数: 90

效果演示

希望这个世界让我装一次B
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:470
  • 最近打卡:2025-06-19 00:01:06
已绑定手机

19

主题

3233

回帖

5297

积分

论坛元老

积分
5297
发表于 2024-7-16 16:51:33 来自手机 | 显示全部楼层
stc32也可以通过Python控制吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:471
  • 最近打卡:2025-06-19 00:01:43
已绑定手机

79

主题

5148

回帖

9162

积分

超级版主

DebugLab

积分
9162
发表于 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;
}


DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2025-06-18 09:45:31
已绑定手机

29

主题

349

回帖

1999

积分

金牌会员

机长

积分
1999
发表于 2024-7-16 19:33:39 | 显示全部楼层
Debu*** 发表于 2024-7-16 16:52
用不着这么复杂,做个gamma校正就好了,现在点灯的99%不做gamma校正

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

feel-gray.jpg
由于人眼特性,人对暗色变化更加敏感,因此肉眼感觉的50度灰实际线性值只有0.214左右。
为了使计算机表示色彩递进关系和人眼感受到的基本一致,微软联合爱普生、HP等制定了sRGB,它的通道值127就对应人眼感受到的中灰(传说中的伽玛校正)。
通常情况下如果没有特殊说明,一般所说的“RGB”均指sRGB
业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-7-16 21:25:19 | 显示全部楼层
so*** 发表于 2024-7-16 16:51
stc32也可以通过Python控制吗?

你可以用PY写个上位机 结合某种通讯协议 传递数据给STC32 然后让他执行对应的动作. 不能直接使用PY编程
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-18 23:48:31

4

主题

78

回帖

658

积分

高级会员

积分
658
发表于 2024-7-17 09:02:33 | 显示全部楼层
so*** 发表于 2024-7-16 16:51
stc32也可以通过Python控制吗?

就是用 python 生成一个c定义的数组而已,没有用python 控制,也运行不了python
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-18 23:48:31

4

主题

78

回帖

658

积分

高级会员

积分
658
发表于 2024-7-17 09:02:47 | 显示全部楼层
嵌入*** 发表于 2024-7-16 21:25
你可以用PY写个上位机 结合某种通讯协议 传递数据给STC32 然后让他执行对应的动作. 不能直接使用PY编程 ...

说的对
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-09-16 12:03:39

0

主题

11

回帖

86

积分

注册会员

积分
86
发表于 2024-8-20 10:37:46 | 显示全部楼层
楼主 stc8g带pwm的能用吗?我是新手,能否给个演示代码
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-19 00:08 , Processed in 0.150244 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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