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 各种存都很大,不允许我低调
|