时间在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

WS2812B -> 25

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

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

先介绍下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

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

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

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

下面直接代码

全局变量

static nrf_pwm_values_common_t ws2812b[24*64]={0,0,0}; //序列1数组

PWM初始化


void MY_PWM_INIT_04(void)
{nrfx_pwm_config_t  p_config; //定义结构体p_config.base_clock = NRF_PWM_CLK_8MHz ; // PWM基本时钟:8Mp_config.count_mode = NRF_PWM_MODE_UP  ; //计数模式: 向上计数p_config.irq_priority = _PRIO_APP_HIGH ; //中断优先级p_config.load_mode =  NRF_PWM_LOAD_COMMON; // 加载模式: 公用模式p_config.output_pins[0] = 25; //PWM通道0的引脚输出绑定p_config.output_pins[1] = NRF_DRV_PWM_PIN_NOT_USED; p_config.output_pins[2] = NRF_DRV_PWM_PIN_NOT_USED; p_config.output_pins[3] = NRF_DRV_PWM_PIN_NOT_USED;    //不使用p_config.step_mode = NRF_PWM_STEP_AUTO ;// 重复计数输出p_config.top_value = 10;//脉冲计数的顶点值 8MHz/10=800Khz  // 使用         PWM控制器0, 初始化内容写入寄存器, 事件中断函数nrf_drv_pwm_init(&my_pwm0,&p_config,NULL);//    ws2812b = 8; //大概250ns
//  ws2812b = 3; //大概812nsp_sequence0.end_delay = 0 ; p_sequence0.length = NRF_PWM_VALUES_LENGTH(ws2812b) ; // 序列长度p_sequence0.repeats =  0 ;  p_sequence0.values.p_common = ws2812b;
//  p_sequence0.values.p_common = &ws2812b;//  // 单序列输出PWM   使用PWM0 ,把序列1内容写入结构体,播放次数,播完继续播
//  nrf_drv_pwm_simple_playback(&my_pwm0, &p_sequence0,1,NRF_DRV_PWM_FLAG_LOOP);}

主函数


//  MY_PWM_INIT();
//  MY_PWM_INIT_02();
//  MY_PWM_INIT_03();nrf_gpio_cfg_output(25);nrf_gpio_pin_clear(25);MY_PWM_INIT_04();uint32_t ws2812_buf[64]=
//{0};
// B        G      R
{0xff,0,0xff00,0,0xff0000,0,0,0xffffff,
0,0xffffff,0,0,0,0,0,0,
0,0,0,0xff33,0xff00,0,0,0,
0,0,0,0,0,0,0xffffff,0,
0,0xff0000,0,0,0,0,0,0,
0,0,0,0,0xffffff,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0 };int i = 0,j=0;for(j =0; j<64; j++){for(i =0; i< 24 ; i++){if(ws2812_buf[j] & (0x800000>>i))ws2812b[(j*24)+i] = 3; // 800ns高电平 1码(他PWM高低电平是相反的)elsews2812b[(j*24)+i] = 7; // 400ns高电平 0码}}// 就播放一次, 播放完收工nrf_drv_pwm_simple_playback(&my_pwm0, &p_sequence0,1,NRF_DRV_PWM_FLAG_STOP);

其他都没怎么动了

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

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

代码讲解

定义RAM数组, 为64个WS2812灯, 又每个灯需要24位数据, 所以有24*64个

后面的{0,0,0}是让数据上电时为0

  1. 使用8M时钟, 因为WS2812B的速率为800Khz, 所以要分出来800K, 拿8M /10就很好的分出来800Khz
  2. 模式为公用模式,这个是非常容易拿数组序列驱动,其他模式的数组不是一维数组,而是二维数组,因此非常不方便

  1. 引脚为25输出, 注意, 没有用

p_config.output_pins[0] = 25 |NRF_DRV_PWM_PIN_INVERTED;

是因为NRF_DRV_PWM_PIN_INVERTED 在停止之后是为高电平的, 所以不需要他

  1. 计数最大值为10, 这样就可以分出来800K了

这三个注释是我抓取数据用的, 只是测试用, 后面修改了具体数值了

其中

ws2812b = 8 他反而输出了大概250ns

ws2812b = 3; //大概812ns

可以得出, PWM输出的极性跟我们日常的是相反的

随便定义了64个灯的颜色

  • 因为WS2812是高位先行的,所以用先传高位, 那么我就用 RGB的数据 按位与 (2^24 >> i)即可
  • 当数据为1时,那么就是1码,输出800ns高电平即可,注意是 纳秒(ns)

  • 同理 数据为0时, 输出0码, 为400ns高电平, 之前是8的,但输出不稳定,改为7变为400ns就稳定了

之后就是播放序列即可, 注意是播放1次, 播放完毕之后就停止了

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

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

链接:https://pan.baidu.com/s/1aFWzBB1Yp3rxoYn57v7QVg

提取码:chpo

复制这段内容后打开百度网盘手机App,操作更方便哦

NRF52840学习历程(十一)幻彩RGB灯之WS2812B相关推荐

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

    时间在2021年2月6日,寒假放假在家好好学一学nRF52840 今天还在感冒,休息一波 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLIN ...

  2. FPGA驱动RGB灯带WS2812B

    记录一下短学期做的东西 -- FPGA驱动RGB灯带WS2812B 设计目标 1.有多种模式,按键调节模式等参数: 2.模式1:红绿蓝白四色循环显示,速度.亮度可调: 3.模式2:7彩虹+白色,闪烁, ...

  3. NRF52840学习历程(四)定时器

    时间在2021年1月26日,寒假放假在家好好学一学 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB ...

  4. NRF52840学习历程(三)串口中断

    时间在2021年1月26日,寒假放假在家好好学一学 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB ...

  5. NRF52840学习历程(八)IIC协议0.96OLED屏幕

    时间在2021年2月3日,寒假放假在家好好学一学nRF52840 昨天喉咙就不舒服,今天就感冒了,休息一波 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V1 ...

  6. NRF52840学习历程(九)SPI协议0.96OLED屏幕

    时间在2021年2月4日,寒假放假在家好好学一学nRF52840 今天还在感冒,休息一波 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLIN ...

  7. Arduino控制RGB灯(WS2812B)

    Arduino控制RGB灯 RGB灯.WS2812B介绍 软件准备 程序代码 功能演示 后续 RGB灯.WS2812B介绍 RGB灯是以三原色共同交集成像,此外,也有蓝光LED配合黄色荧光 粉,以及紫 ...

  8. [MM32生态]【MM32+模块】系列:03、RGB灯控制

    在上一篇中我们介绍了LED灯,它是一个单色的灯,比如红色.蓝色.黄色.或者绿色等等:而本篇中的RGB灯是一个彩色灯,一个RGB灯包含了红.绿.蓝这三元色,可以通过对红绿蓝亮度的比例调节来实现显示彩色的 ...

  9. SpringBoot学习历程(十一):SpringBoot2.X集成mail发送邮件

    SpringBoot学习历程(十一):SpringBoot2.X集成mail发送邮件 前言 1. 引入依赖 2. 设置邮件配置信息 3. 发送邮件 3.1 发送普通文本邮件 3.2 发送HTML格式内 ...

  10. 《STM32从零开始学习历程》——USART串口通讯实验篇2——指令控制LED灯实验

    <STM32从零开始学习历程>@EnzoReventon USART串口通讯实验篇2--指令控制LED灯实验 本实验是在<USART串口通讯实验篇1--中断接收与发送>的基础上 ...

最新文章

  1. Java项目:慢病报销管理信息系统(java+MySQL+Jdbc+Servlet+Jsp)
  2. java-在应用中获取spring定义的bean
  3. matlab调用python函数未定义函数类_从零学习Python—调用函数def用法(下)
  4. 配置 SQL Server 2008 Email 发送以及 Job 的 Notification通知功能
  5. Javascript设计模式之中介者模式
  6. 使用Guava对并发应用程序进行基于对象的微锁定
  7. 【Java】计算1+1/2+1/3+1/4....前20项
  8. 面试官:Spring创建好的单例对象存在线程安全问题吗?
  9. w7电脑蓝屏怎么解决_电脑蓝屏Win32k.sys怎么办
  10. android开发图片格式,Android程序开发如何处理图像格式类及图像转换
  11. WKWebView刷新URL
  12. 系统配置 计算机管理,计算机系统安全配置管理方案
  13. HTML基础,大三老学姐在线总结
  14. 【算法设计与分析】C++回溯法求全排列
  15. 一条命令轻松调节mac鼠标移动速度
  16. Windows平台搭建Spark开发环境(Intellij idea 2020.1社区版+Maven 3.6.3+Scala 2.11.8)
  17. JDK版本不兼容问题
  18. 使用kolla部署stine版本的OpenStack-allinone私有云
  19. HylaFAX LINUX传真服务器心得
  20. 数据库之文件管理--SimpleDB

热门文章

  1. 安装torch 时,bash install-deps错误
  2. Hibernate——缓存
  3. 安卓逆向_2 --- Androidkiller,apktool、dex2jar、jd-gui、jadx反编译工具 的 安装、设置及使用教程...
  4. [知乎]这可能是最全面的龙芯3A3000处理器评测
  5. 云计算学习笔记3——分布式通信
  6. 如何准确获取地点位置的经纬度?
  7. 六步学会github入门使用
  8. Github学生认证指北
  9. 华为电脑Linux进pe,华为笔记本(HuaWei)如何进入BIOS设置U盘启动?
  10. html 调高德地图 导航,在H5页面内通过地址调起高德地图实现导航