Funpack3-5 基于 BeagleBone® Black 使用PRU控制LED实现呼吸灯
该项目使用了BeagleBone,实现了使用PRU控制LED实现呼吸灯的设计,它的主要功能为:使用PRU控制LED实现呼吸灯。
标签
嵌入式系统
Funpack活动
安先生
更新2025-01-20
40

项目描述

项目介绍

本项目旨在利用BeagleBone® Black开发板实现一个简单的LED呼吸灯控制系统,并通过按键切换LED闪烁的速度。BeagleBone® Black是一款面向开发人员和业余爱好者的低成本、高扩展、并有社区支持的开发平台。其核心处理器选用了TI AM3358芯片,基于ARM Cortex-A8架构处理器。该开发板配备了丰富的扩展资源,包括HDMI接口、以太网、SD卡槽,并预留了足够多的管脚用于AD转换、LCD显示屏、PWM输出、I2C、串口等。板卡可运行完整的Linux系统,且支持多种编程语言。

设计思路

本项目的设计思路主要包括以下几个方面:

  1. 硬件连接:将LED和按键连接到BeagleBone® Black的GPIO引脚。
  2. 软件设计:编写控制程序,通过PRU(Programmable Real-time Unit)实现LED的呼吸灯效果,并通过按键切换闪烁速度。
  3. 功能实现:实现LED的呼吸灯效果,并通过按键切换闪烁速度。

硬件介绍

  1. BeagleBone® Black:核心处理器为TI AM3358芯片,基于ARM Cortex-A8架构,主频1GHz,内置512MB DDR3 RAM,4GB 8-bit eMMC存储,支持MicroSD卡扩展。
  2. LED:用于显示呼吸灯效果。
  3. 按键:用于切换LED闪烁速度。
  4. 连接线:用于连接LED和按键到BeagleBone® Black的GPIO引脚。

软件流程图及各功能对应的主要代码片段及说明

软件流程图

主要代码片段及说明

初始化 GPIO

    uint32_t *gpio1 = (uint32_t *)GPIO1;
uint32_t *gpio1_dir = gpio1 + GPIO_DIR; // GPIO1方向寄存器
uint32_t *gpio1_datain = gpio1 + GPIO_DATAIN; // GPIO1数据输入寄存器

// 设置GPIO1_14为输入模式
*gpio1_dir &= ~BIT(14);

int speed_flag = 0;
const uint32_t DELAY_SLOW = 100000000; // 慢速延时 (~500ms)
const uint32_t DELAY_FAST = 50000000; // 快速延时 (~250ms)
// PWM相关变量
int PWM = 0; // PWM占空比 (0-100)
int Breath = 1; // PWM变化方向 (1:增加, -1:减少)
int T = 20; // PWM调整间隔
int step = 0; // 步进计数器
// 清除SYSCFG[STANDBY_INIT]以启用OCP主端口
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

// Turns off triggers
#pragma DATA_SECTION(init_pins, ".init_pins")
#pragma RETAIN(init_pins)
const char init_pins[] =
"/sys/class/leds/beaglebone:green:usr1/trigger\0none\0" \
"/sys/class/leds/beaglebone:green:usr2/trigger\0none\0" \
"\0\0";

检测按键状态

// 检测按键状态

        // 检测按钮状态 
if (!(*gpio1_datain & BIT(14))) {
// 按键按下
delay(20000); // 去抖动延时 (~100ms)
while(!(*gpio1_datain & BIT(14))); // 等待释放
delay(20000); // 防止再次触发
speed_flag = !speed_flag; // 切换速度标志
}

控制LED PWM呼吸灯效果

        // 更新PWM占空比
if (step % T == 0) {
PWM += Breath;
if (PWM == 100) {
Breath = -1; // 达到最大值后递减
}
if (PWM == 0) {
Breath = 1; // 达到最小值后递增
}
}

// 控制LED亮度 (PWM效果)
gpio1[GPIO_SETDATAOUT] = USR1; // 打开USR1
delay((speed_flag ? DELAY_FAST : DELAY_SLOW) * PWM / 100); // PWM高电平时间
gpio1[GPIO_CLEARDATAOUT] = USR1; // 关闭USR1
delay((speed_flag ? DELAY_FAST : DELAY_SLOW) * (100 - PWM) / 100); // PWM低电平时间

// 控制LED亮度 (PWM效果)
gpio1[GPIO_SETDATAOUT] = USR3; // 打开USR3
delay((speed_flag ? DELAY_FAST : DELAY_SLOW) * PWM / 100); // PWM高电平时间
gpio1[GPIO_CLEARDATAOUT] = USR3; // 关闭USR3
delay((speed_flag ? DELAY_FAST : DELAY_SLOW) * (100 - PWM) / 100); // PWM低电平时间

step++; // 步进计数器增加

心得体会

在本次项目中,我不仅学会了如何使用BeagleBone® Black开发板,还深入理解了嵌入式系统的开发流程。以下是我在项目中的一些具体心得体会:

  1. 硬件调试:在连接LED和按键到BeagleBone® Black的GPIO引脚时,我遇到了一些硬件调试的问题。例如,初次连接时LED没有正常工作,通过检查电路连接和使用万用表测量电压,我发现是接线错误导致的。通过这些调试过程,我学会了如何更好地进行硬件连接和故障排除。
  2. PRU编程:PRU(Programmable Real-time Unit)是BeagleBone® Black的一大特色,它可以实现实时控制。在编写PRU程序时,我遇到了一些困难,例如如何正确配置PRU和如何与主处理器进行通信。通过查阅官方文档和社区资源,我逐步掌握了PRU的编程技巧,并成功实现了LED的呼吸灯效果。
  3. 软件优化:在实现基本功能后,我对代码进行了优化。例如,通过调整延时函数的参数,使LED的亮度变化更加平滑;通过优化按键检测逻辑,减少了误触发的概率。这些优化不仅提高了程序的性能,还增强了用户体验。
  4. 项目管理:在项目开发过程中,我学会了如何更好地管理时间和任务。例如,通过制定详细的项目计划,合理分配时间,确保每个阶段的任务按时完成;通过记录开发过程中的问题和解决方案,积累了宝贵的经验。

意见和建议(续)

  1. 文档和教程:希望官方能够提供更多详细的文档和教程,特别是关于PRU编程和高级功能的部分。这将有助于开发者更快地上手,并充分利用BeagleBone® Black的强大功能。
  2. 社区支持:希望社区能够更加活跃,提供更多的技术支持和交流平台。例如,可以定期举办线上或线下的技术交流会,邀请专家分享经验和技巧;可以建立更加完善的问答平台,方便开发者互相帮助和交流。
  3. 硬件扩展:希望能有更多的硬件扩展模块,方便开发更多有趣的项目。例如,可以提供更多的传感器模块、通信模块和显示模块,丰富开发者的选择,激发更多的创意和灵感。
  4. 开发工具:希望官方能够提供更加完善的开发工具和调试工具。例如,可以提供更加友好的IDE和调试器,简化开发和调试过程;可以提供更多的示例代码和库,方便开发者快速实现各种功能。

通过本次项目,我不仅提升了自己的技术能力,还积累了宝贵的项目经验。希望未来能有更多机会参与类似的项目,继续学习和成长。同时,我也希望BeagleBone® Black能够不断发展和完善,为开发者提供更加优质的开发平台和支持。

附件下载
pru_demo.c
团队介绍
安迪 一枚嵌入式工程师
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号