Funpack3-5 点灯项目——PRU实现呼吸灯与闪烁速度切换
1. 项目简介
大家好,很高兴参加 Funpack 3-5 活动!我是一名电子爱好者,大家可以叫我苏格拉。本次项目任务是利用 BeagleBone Black 自带的 PRU(Programmable Real-time Unit)控制外部 LED 模块实现呼吸灯效果(PRU 的优势是具备实时性,能精确控制延迟时间),同时使用一个按键来切换 LED 闪烁速度。硬件方面选用开源硬件 BeagleBone Black (简称 BBB)作为主控,DFRobot 数字按钮模块 和 DFRobot 食人鱼红色 LED 模块 作为外部设备搭配完成任务。
软件开发直接采用 BeagleBone Black 系统自带的 Cloud9 IDE,可以很边便捷的上传程序到开发板。Cloud9 是 BeagleBone Black 单板计算机上的 IDE 本机。通过 Cloud9 我们可以直接调用 BBB 的 PRU。浏览器地址栏输入:http://192.168.7.2/ide.html 即可进入 Cloud9 IDE,以下是进入 Cloud9 的界面。(点击图片可放大查看)
2
我们可以到 Cloud9 中名为 PRU 的文件夹,里边是有关 PRU 使用的示例程序。我们将修改示例程序来完成按键控制呼吸灯的代码。
2. 硬件介绍
主控板:
使用的主控为 BeagleBone Black,搭载 TI 的 AM335x 系列处理器,具备 PRU 子系统用于实时控制。BeagleBone Black 的 PRU(Programmable Real-Time Unit)子系统 是其强大的一部分,专门设计用于实时任务和快速 I/O 操作。PRU 是独立的微处理器单元,不依赖于主 CPU,其可实现 纳秒级 的实时响应,非常适合需要精准时序控制的应用,例如 PWM 生成、信号处理和高速数据采集。
- 两个 PRU 内核:
BeagleBone Black 的 PRU 子系统包含两个独立的 32 位 RISC 内核 ( PRU0 和 PRU1 ),它们可以独立运行不同的程序,通过共享资源(如内存和寄存器)协同工作。PRU 可以直接控制 BeagleBone Black 的 GPIO 引脚。
|
---|
BeagleBone Black 引脚图 |
外设:
- DFRobot 食人鱼红色 LED 模块:通过 GPIO 控制亮度变化,实现呼吸灯效果。
- DFRobot 数字按钮模块:通过 GPIO 读取按键输入,用于切换闪烁速度。
3. 设计思路
使用 PRU 的 GPIO 引脚驱动 LED,根据占空比调节亮度,模拟 PWM 信号形成呼吸灯效果。
利用循环延迟实现定时,按键输入用于切换延迟时间,从而实现快慢两种呼吸灯模式。
设计方案包括以下模块:
LED 呼吸灯控制:根据设定的占空比模拟 PWM 控制 LED 亮度,逐步实现亮度的渐亮与渐暗循环。
按键控制逻辑:检测按键的状态变化,当检测到按键按下时切换延迟时间,实现闪烁速度的快慢切换。
4. 项目功能演示
- 功能 1:LED 呼吸灯效果:LED 按照一定占空比从暗到亮、再从亮到暗,循环变化。
功能演示详细可见项目视频 - 功能 2:按键控制闪烁速度:通过按下按键,切换 LED 呼吸灯模式的速度(慢速与快速)。
功能演示详细可见项目视频
5. 项目总结报告
5.1 项目描述
本项目目标是通过 PRU 控制 GPIO,实现 LED 的呼吸灯效果,并通过按键控制闪烁速度的切换。主要利用 PRU 高效处理实时任务的特点,实现精确的 LED 占空比控制,并处理按键输入的逻辑。
5.2 软件流程图
5.3 主要代码片段与说明
1. 设置 LED 的占空比: PWM 信号生成(呼吸灯的核心)
基本原理:
- 使用循环逐步调节 LED 的 占空比,实现亮度从低到高再从高到低的变化。
- 占空比控制逻辑:
- 定义
brightness
变量表示当前的占空比百分比。 - 如果当前循环次数
i
小于brightness
,GPIO 输出高电平(点亮 LED)。 - 否则,GPIO 输出低电平(熄灭 LED)
代码片段
for (i = 0; i < MAX_BRIGHTNESS; i++) {
if (i < brightness) {
gpio1[GPIO_SETDATAOUT] = GPIO_PIN; /* 点亮 LED */
} else {
gpio1[GPIO_CLEARDATAOUT] = GPIO_PIN; /* 熄灭 LED */
}
delay_cycles(cycle_delay); /* 控制呼吸灯速度 */
}
2. 按键切换闪烁速度:
按键状态检测:通过读取 GPIO_PIN_BUTTON
引脚的输入状态判断是否按下按键。通过按键输入切换 cycle_delay
,间接改变延迟时间,从而调节亮暗变化速度(快/慢)
button_state = gpio1[GPIO_DATAIN] & GPIO_PIN_BUTTON;
if (button_state && !last_button_state) {
if (cycle_delay == CYCLE_DELAY_SLOW) {
cycle_delay = CYCLE_DELAY_FAST;
} else {
cycle_delay = CYCLE_DELAY_SLOW;
}
}
last_button_state = button_state;
5.4 功能展示与说明
功能演示详细可见项目视频
- LED 呼吸灯效果:
- 通过占空比调节,LED 从暗到亮再到暗,形成类似“呼吸”的动态变化效果。
- 实现方式:使用循环控制占空比,同时设置步长
STEP
调整变化幅度。
- 闪烁速度切换:
- 按键按下后,切换延迟时间,调整 LED 呼吸灯的速度(快速与慢速)。
- 实现方式:检测按键输入,根据状态变化动态调整延迟时间。
6. 心得体会
在本次项目中,我对 PRU 的实时处理能力有了更深入的了解,同时学习了如何使用 GPIO 控制外设。特别是在按键控制逻辑的实现过程中,进一步提升了对嵌入式系统中硬件与软件结合的理解。希望未来活动可以加入更多硬件模块的扩展,例如传感器或通信模块,增加项目的趣味性和挑战性。
更多信息可参考:pru-software-support-package/pru-software-support-package - The PRU Software Support Package
如有疑问,欢迎联系我!