[活动专区] 【AT-START-F405测评】 2、GPIO正弦呼吸灯

[复制链接]
 楼主| xu@xupt 发表于 2024-6-8 10:32 | 显示全部楼层 |阅读模式
#有奖活动#

目的:①实现呼吸灯效果;②呼吸灯呈现出正弦效果;③LED3和LED4亮度互补
1、程序设计思路
该程序的目的是通过使用GPIO控制,实现两个LED灯(LED3和LED4)的呼吸灯效果,其中两个LED的亮度是互补变化的。程序使用正弦函数来计算亮度值,以达到平滑的亮度变化效果。以下是程序的整体设计思路:
1.包含必要的头文件:
   - 引入控制LED和系统时钟配置的头文件。
   - 引入数学库头文件用于计算正弦函数。
2. 定义常量:
   - 定义PI的值用于角度到弧度的转换。
   - 定义最大亮度值(255),表示LED全亮的情况。
3. 初始化系统:
   - 调用函数`system_clock_config()`配置系统时钟。
   - 调用函数`at32_board_init()`初始化开发板,设置GPIO引脚。
4. 主循环设计:
   - 使用`while(1)`进入无限循环,使程序能够持续运行,实现连续的呼吸灯效果。
5. 正弦波亮度控制:
   - 通过一个外部`for`循环从0到360度,遍历一个完整的正弦周期。
   - 在每个角度下计算对应的正弦波亮度值,并将其转换到0到255范围内。
   - 通过正弦函数计算LED3的亮度,同时计算LED4的互补亮度。
6. 模拟LED亮度:
   - 通过内部`for`循环和延迟函数`delay_us`来模拟LED的亮度变化。
   - 控制每个LED的亮度,通过快速开关LED实现不同的亮度效果。
7. 平滑过渡:
   - 使用`delay_ms`函数在每个角度计算后延迟一段时间,使亮度变化更加平滑,避免视觉上的突变。


2、程序
  1. #include "at32f402_405_board.h"  // 包含AT32F402/405开发板的头文件,提供LED控制和初始化等功能
  2. #include "at32f402_405_clock.h"  // 包含AT32F402/405的时钟配置头文件
  3. #include <math.h>  // 包含数学库头文件,用于计算正弦函数

  4. #define PI 3.14159265
  5. #define MAX_BRIGHTNESS 255

  6. int main(void)
  7. {
  8.   int i;
  9.   int j;  // 将变量j的声明移到for循环外
  10.   double brightness;
  11.   int led3_brightness, led4_brightness;
  12.   int delay_time = 10;  // 调整此值以控制呼吸灯的速度

  13.   system_clock_config();
  14.   at32_board_init();

  15.   while(1)  // 无限循环
  16.   {
  17.     // 从0到360度变化,相当于一个完整的正弦周期
  18.     for(i = 0; i < 360; i++)
  19.     {
  20.       // 计算正弦波对应的亮度值,范围从0到MAX_BRIGHTNESS
  21.       brightness = (sin(i * PI / 180) + 1) / 2 * MAX_BRIGHTNESS;
  22.       
  23.       led3_brightness = (int)brightness;  // 将计算的亮度值赋给LED3亮度
  24.       led4_brightness = MAX_BRIGHTNESS - led3_brightness;  // LED4亮度与LED3互补

  25.       // 模拟LED3的亮度
  26.       for(j = 0; j < led3_brightness; j++)
  27.       {
  28.         at32_led_on(LED3);  // 打开LED3
  29.         delay_us(10);  // 延迟10微秒,控制亮度
  30.         at32_led_off(LED3);  // 关闭LED3
  31.       }
  32.       
  33.       // 模拟LED4的亮度
  34.       for(j = 0; j < led4_brightness; j++)
  35.       {
  36.         at32_led_on(LED4);  // 打开LED4
  37.         delay_us(10);  // 延迟10微秒,控制亮度
  38.         at32_led_off(LED4);  // 关闭LED4
  39.       }

  40.       delay_ms(delay_time);  // 延迟一段时间,平滑过渡
  41.     }
  42.   }
  43. }



3、效果
dbb16855cb1b74c768a8b0ed219ed6d8
777806663c2f89b6db.png
呐咯密密 发表于 2024-6-11 16:41 | 显示全部楼层
这个不搞个动态图或者视频吗,这拍照看不出来啊
gangong 发表于 2024-10-28 20:07 | 显示全部楼层
牛了不错
micoccd 发表于 2024-11-16 18:42 | 显示全部楼层
我一般都是PWM的方波控制,这个正弦波更平滑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

751

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部