NRF52840学习历程(十一) 幻彩RGB灯WS2812多路(两路)输出

时间在2021年2月6日,寒假放假在家好好学一学nRF52840

 

今天还在感冒,休息一波

 

开发板:初雪的100出头那块 NRF52840 EVAL KIT

下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器诸如STLINK,DAP不建议用)

版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0

参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图)

nRF5_SDK_17.0.2_d674dde(官方例程)

nRF5_SDK_17.0.0_offline_doc(官方文档)

nRF52840_PS_v1.1.pdf(官方数据手册)

ws2812b数据手册

 

代码太长, 先放效果图

 

 

------------------------------------------------------------------------------

------------------------------------------------------------------------------

 

已用IO

0.96OLED / 1.29彩色OLED

D0(CLK) -> 12

D1(SDA) -> 23

RES     -> 7

DC      -> 21

CS      -> 19

 

按键

KEY0 ->11

KEY1 ->24

KEY2 ->20

KEY3->17

 

LED

LED0 ->13

LED1->14

LED2->32+9=41

LED3->16

 

串口

TX ->6

RX ->8

 

ADC

光敏 -> 5

摇杆X -> 28

摇杆Y -> 29

 

IIC_0.96OLED

SDA -> 32

SCL -> 22

 

还没用到(空闲)

P0.0 1 2 3 9 10 15 26 27 30 31

P1.1 2 3 4 5 6 7 8 10 11 12 13 14 15

 

添加WS2812B 幻彩RGB

DAT ->25(1路)

 

DAT->15(第2路)

-------------------------------------------------------------------------------

------------------------------------------------------------------------------

 

先介绍下WS2812B

时序

可以看出,

1码时需要高电平时间为800ns左右

0码 需要400ns左右

 

传输流程是, 第一个灯吃掉24位数据之后,再把剩下的数据(已经少了24个数据了)原封不动的传到下一个灯

 

24位数据为 G R B 排列 ,其中B是最低8位

传输是高位先行(就是先传最高位,再传次高位)

数据手册推荐电路图

 

工作频率是 800Khz ( 就是它的周期,1.25u 要传输一Bit位,跟上面的0,1码相符合)

 

工作电压是3.3V~5.0V都行,我这边测试过3.3V是正常的, 5V更不用说了, 超过5.3V可能就烧,所以别用超过5.3V电源, 可以用5V电压,建议串一个大功率的(比如3A的)肖特基二极管,确保电压低于5V

------------------------------------------------------------------------------

------------------------------------------------------------------------------

------------------------------------------------------------------------------

 

下面直接代码

添加了中断,作为PWM停止之后更新数据用,后面会讲到中断里面

添加了一个播放序列结构体, 以及一个RAM数组存放序列内容(放RGB转换后数据的)

PWM1的代码没有变,但增加了中断事件函数

PWM2变更内容已指出

 

然后我在PWM中断里面 更新RAM数据数组, 做了个流水灯, true是上流,false是往下流

流水灯代码如上, 不理解的我也不需要你理解

此外,增加了指定位置修改颜色, 看不懂也没关系 , 也不需要你理解

主函数添加初始化

1是给PWM2控制器的RAM数据初始化内容

2是测试修改指定位置的颜色

3是运行一次PWM2, 跑完停止, 注意是跑完就停止了

这个基本没有变化

然后在定时器上面, 每隔500ms播放一次PWM序列, 注意,序列内容已经在PWM中断处更新了

 

代码因为个人使用. 就不放了,你们按上一节的单路PWM修改就行                                                  

 

猜你喜欢

转载自blog.csdn.net/jwdeng1995/article/details/113729409