项目介绍
本次活动我使用BeagleBone Black的PRU控制了LED实现呼吸灯
BeagleBone® Black 是一款面向开发人员和业余爱好者的低成本、高扩展、并有社区支持的开发平台。处理器选用了TI AM3358芯片,基于ARM Cortex-A8架构处理器。还配备了丰富的扩展资源,包括HDMI接口、以太网、SD 卡槽、并预留了足够多的管脚用于AD转换、LCD显示屏、PWM输出、I2C、串口等等。板卡可运行完整的 Linux 系统,且支持多种编程语言。
BeagleBone 与 Arduino 和 Raspberry Pi(树莓派)可以说是目前应用最广泛的三大嵌入式开源平台。而 BeagleBone 在一定程度上可视为融合了 Arduino 与树莓派的优点,它有比 Arduino 更多的 GPIO 口,有着比树莓派更高的性能和更好的开源(软件硬件全部开源)。
BeagleBone 可以运行完整的 Linux 系统,程序的编写、编译和调试都可以在板子上进行,而且支持多种编程语言,如常用的 C、C++、Python、perl 都可以在 BeagleBone 内使用。此外,BeagleBone 还自带了基于 Web 的 Cloud9 编辑器以及对应的 BoneScript 语言,可以方便的在电脑浏览器中对 BeagleBone 进行编程
设计思路
本次的编程环境就是基于Web 的 Cloud9 编辑器,开发板连接电脑后会自动弹出使用指南,按照指南的指示访问开发板ip,即可进入Cloud9编辑器。
代码的整体逻辑如下
主循环包括三个部分:按键轮询,若按下则占空比累加的步长增加(改变呼吸灯速率);判断呼吸灯占空比累加步长是否溢出;呼吸灯任务;
void main(void) {
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
gpio1[GPIO_SETDATAOUT]=USR1;
while(1) {
if (key_scan())
{
gpio1[GPIO_SETDATAOUT]=USR1;
if (step_dir ==1){
step=step+4;
}
} else gpio1[GPIO_CLEARDATAOUT] = USR1;
if (step>20){
step=4;
}
Breath(step);
}
__halt();
}
代码最主要的部分是呼吸灯的实现,相比传统的基于单片机定时器实现呼吸灯,或arduino里直接模拟输出,这次用了相对复杂一点的方式
如图可以看到,呼吸灯主要由两个函数组成,breath和blink,blink负责单周期内的led亮灭。
void Blink(uint16_t T, uint16_t Ht)
{
__R30=P9_30;
delay_us(Ht);
__R30=0;
delay_us(T-Ht);
}
breath负责修改占空比
void Breath(uint16_t step)
{
uint16_t T=2000;
Ht=Ht+step*dir;
if(Ht<=step){
Ht=step;
dir=1;
}
else if (Ht>=T){
Ht=T;
dir=-1;
}
Blink(T,Ht);
}
因为是呼吸灯,占空比增加是有方向的,所以增加了方向变量dir,此变量仅为1和-1变化,每次增加时与增加步长step相乘(Ht=Ht+step*dir;),实现增加或减少。
感谢eetree和得捷电子举办这次活动,让我复习了呼吸灯的实现方式,习惯了arduino里使用analogout和单片机的定时器实现,一下子让我直接写呼吸灯还是有点生疏。期待下次更有意思的活动。