当前位置: 幻彩灯珠>>灯珠资讯>> 51单片机控制rgb灯带 51单片机控制32个led灯

51单片机控制rgb灯带 51单片机控制32个led灯

51单片机控制rgb灯带 51单片机控制32个led灯

51单片机控制rgb灯带(51单片机控制32led灯)

在前一章中,对基本计时器的中断的使用方法进行了说明,但在本章中,首先说明在线模拟调试器的方法,对STM 32的比特带操作进行说明,最后学习通用计时器的输出比较功能,生成pWM通过实用程序进一步强化实际产品开发能力。

4.1 Keil在线模拟调试

51单片机程序比较简单,在调试程序时,依靠程序员根据实验现象进行分析,以更改程序进行逻辑验证的方式寻找程序逻辑错误。随着实现的功能越来越复杂,所选择的单片机从51单片机变更为STM 32,为了制作的代码量也倍增,调试工具也用鸟枪变更,采用ST-Link在线调试程序。

在线模拟调试是指在将程序下载到系统中执行后,慢慢跟踪程序,观察数据的变化。通过在线模拟调试功能,程序员可以测试各行的源代码,确定程序错误。在这个过程中,程序员可以通过各种方法找到错误的根源,例如设置断点、控制存储器内容、寄存器内容、输入输出等。

在线仿真调试可以实现Keil软件和目标板的调整,更直观地理解单芯片机器的运行过程,有效地快速地调查问题,提高产品和项目开发的效率。

4.1.1软件配置

构建的工程模板的系统stm32f10x.图4的腐蚀为c文件?如1所示,用户将哪个时钟作为图4?对于系统时钟有两个宏定义,用于选择在一个左侧段中解注释哪个时钟,所有其他时钟都被注释,其中系统默认使用的是72MHz。

图4-1系统时钟宏定义

在线调试模拟中,Keil软件的构成信息需要与实际目标板的执行时钟一致,因此在Debug标签中选择ST-Link模拟器,如图4-2所示单击Settings按钮。

图4-2 debug窗口

打开跟踪标签,如图4-3所示,在Core Clock中输入系统时钟72.00000MHz。

图4-3硬件模拟时钟频率的设置

通过程序的编译,显示0错误0的警告后,选择菜单项目Debug-gt。单击Start/stop Debug Session或图4-4的红色框内的按钮,进入在线模拟调试页面。

图4-4模拟调试按钮的启动/结束

用鼠标左键单击程序窗口中显示代码行编号的左侧灰色区域,设置断点(红色标记)。如图4-5所示

1,Reset:程序复位;

2,Run:全速运转;

3,Step:为了一步一步地执行,每一句地执行。函数时,将继续执行单个步骤。

4,Step Over:虽然也在单步中执行,但遇到函数时不进入函数内部,而是直接执行整个函数。

5,Step Out:单步在函数内执行时,在step out中执行函数的剩余部分,可以返回到上一层的函数。

如果以全速执行,程序将循环执行,如果设置了断点,则在断点执行时停止。此时,单击view菜单打开watch窗口,设置要观察的变量和寄存器,在断点或单步执行时可观察寄存器状态。

图4-5 Keil模拟接口

在实际的项目和产品开发过程中,调试功能往往是程序员最重要的工作,在线仿真调试功能非常重要,体现了程序员能够迅速搜索定位问题,帮助解决问题。由于这个重要功能主要是针对逻辑错误搜索,所以很难举例证明,这个功能的重要性需要在开发中逐渐体会。

4.2位带操作

4.2.1位带、位带识别区

在之前操作STM 32的GpIO的情况下,采用了一次操作寄存器的方式,即16位的方式,该方式的编程复杂,单片机的执行效率也低。在创建程序代码的情况下,通常操作GpIO的组中的任意一个,在不需要操作其他比特的情况下,希望能够用更简单的方法来操作所有16个端口,而不需要在STM 32的比特带上操作。

如果之前学过51单片机的话,对准皮带就不太有名了。51单片机具有寄存器的一部分,能够直接读写寄存器的某一个。例如sbit LED=p1^0;LED = 0;例如TR0=1;这些都是位带操作。此外,从51码片机的存储器地址20H到2FH的16字节128位的存储器可以位操作,其他的存储器地址只能字节操作。当以C语言编程时,存储器的位操作一般不直接使用,但是可以直观地感觉到寄存器的位操作。

STM 32的位带在《Cortex-M3权威指南》资料中详细介绍,能够进行位带操作的是SRAM区的最低1MB范围和片内外设置区的最低1MB范围这两个部分。SRAM区域1MB的存储器一般不用于编程,相对较多使用的是片内外设置区域的最低1MB,即存在外置寄存器的地址空间。

在编程操作时,直接访问外置寄存器中的任一个是不方便的,因此在片内外的设置区另外打开32MB大小的地址空间,命名为位带别名区。在该地址空间中,每4个字节对应一个比特带区域。由于这种关系,对于具有比特带别名区域的四个字节的操作等同于对具有与该地址对应的比特带区域的比特的操作。

Cortex-M3的地址空间是4GB,芯片内外设置的地址是从0x4000000到0x5FFFFFFF 512MB。这里,从0x4000000到0x4000000的地址空间是图4的?如6所示,是设置在片内和外的1MB的比特带区域,并且从0x420000到0x43 FFFFFFFF是对应的32MB的比特带别名区域。

图4-6片内外设置地址

通常,为了重写某个寄存器的某个位的值,如果不采用位带操作,则分为3个步骤,第1步骤读出寄存器的值,第2步骤变更需要变更的位,第3步骤将变更后的值写入寄存器。采用位带运营商代码的话,会更简单,代码的执行效率也会提高。

4.2.2位带和位带别名区域

在记述代码时,操作某个寄存器的某位,例如GpIO的某个IO端口。那个是程序直接操作的32位对应的比特带别名区域的地址。首先,确定要操作的寄存器的地址,即,他的比特带地址,然后确定要操作的比特是哪个比特,并且最终基于映射关系计算要操作的比特被映射的比特带别名区域的地址。

统一一个工作表上的外置区域和SRAM区域的比特带和比特带别名区域的映射式。

在1,addr表示外置寄存器的地址,bitnum表示所操作的位是该寄存器的第几位。

2,(addr amp;0xF亿日元)+0x20000000,区分工作表上的外置区域和SRAM区域的比特带,工作表上的外置区域的比特带地址从0x40000000到0x4000000,SRAM区域的比特带地址从0x20000000到0x2010万,多数情况下,只操作外置。

3,(addr amp;0x00FFFFFF)lt;lt;5)表示与存在该位的寄存器的第0位对应的位带别名区域地址。由于位带区域中的寄存器之一为32位,所以映射到位带别名区域的是32字节,左移5相当于乘以32。

4,bitnumlt;lt;2是用于确定与第0位寄存器对应的位带别名区域地址的偏移地址。当相对于寄存器的第0位偏移1位时,比特带别名区域偏移4字节,因此需要将相当于乘以4的2位向左移位。

0x4001080C~0x4001080F表示GpIO端口A上的“端口输出数据寄存器(ODR)”的4字节的地址空间。该寄存器的0~15位对应于端口A上的16针。以0x4001080C地址空间中的第0比特(0比特)为例,表示pA0引脚,由于膨胀关系,在比特带别名区域中有4字节(32比特)大小的区域,图4的串行63?如7所示,表示pA0引脚。以前在ODR寄存器的第0位的“设置1”中控制了pA0引脚输出的高电平,但是通过将与pA0对应的比特带别名区域的地址空间直接设定为1,实现了相同的功能,操作简单,效率也提高了。

图4-7位带区域和位带别名区域的膨胀对应关系图

在实际开发中,位带主要应用于GpIO端口操作。在config中保存代码,该代码将GpIO端口的输入输出数据寄存器的数据位通过公式找到对应的位带别名区域地址。在h文件中,需要添加以下代码来使用比特带操作,并且在随后的实例中,config是默认的。在h中添加代码。具体的代码如下。

通过上述的比特带设定程序,在向IO端口赋予值时,不需要使用“比特设定”或“比特清除”函数,可以操作STM 32的GpIO销来操作51码片机的IO端口。例如,以pA1引脚为例,设定为输出模式。

首先,宏被用来定义与pA1相对应的比特带地址,即define pA1 pAout(1)。这里,pA1是宏定义的引脚名,这可以任意设定,pAout(1)是键,pA是GpIO端口A,out是输出模式,in是输入模式。(1)表示引脚号码。

通过这样的操作,可以使用pA1=1。替代GpIOSetBits(GpIOA, GpIO_pin_1);

4.2.3练习

2.6、3.6.3、3.9节的程序变更为位带方式,重新编辑,在此不粘贴代码,具体代码可在“Kingst-32F1开发板盘”、“ARM嵌入编程与实战应用–STM 32F1系列”例程Lesson4”文件夹下查询。

4.3 RGB色

在音乐广场、KTV、酒吧等场所,有热情的舞台灯光,效果绚烂。在这一小节中,通过开发简易舞台灯的控制系统,提高读者的实际产品开发能力。

4.3.1 RGB配色原理

虽然之前已经介绍了RGB灯的发光原理,但是理论上三原色可以相互组合,如图4-8所示可以生成七种颜色。如果有7种颜色,可以通过编程实现单色显示、单色渐变、渐变切换、单色闪烁、闪烁切换等复杂功能,通过简单的RGB灯程序可以发挥强大的功能。

图4-8RGB颜色

4.3.2 pWM脉冲宽度调制

pWM是pulse Width Modulation的缩写,中文名字是脉冲宽度调制,据说是利用微处理器的数字输出来控制模拟电路的有效技术,实际上是使用数字信号来实现模拟信号的效果。

首先从名称开始,脉冲宽度调制是通过改变脉冲宽度来实现不同的效果。首先,图4?如9所示,让我们来看看3组不同的脉冲信号吧。

图4-9pWM波形

虽然周期是10ms,即频率是100Hz的波形,但是pWM的本质是每个周期的高电平脉冲宽度都不同。在这里,请记住“占空比”这个概念。占空比是指高水平的时间占整个周期的比例。例如,pWM的解释是,第一周期的占空比为40%,第二周期的占空比为60%,第三周期的占空比为80%。

如果我们以100Hz的信号熄灭4-9所示的高电平小灯,以低电平点亮小灯,则第一部分波形熄灭4ms,点亮6ms,亮度最高,第二部分熄灭6ms,点亮4ms,亮度之后第三部分熄灭8ms,点亮2ms,亮度最低。通过计时器的输出比较功能,可实现pWM的脉冲宽度调制,调整灯的亮度。

4.4通用计时器调制pWM

4.4.1通用计时器输出比较功能

STM32F 103ZE包括TIM2、TIM3、TIM4、TIM5四个通用计时器。这四个计时器除了基本计时器的上计数功能之外,还可以进行倒计时、上下计数。此外,还包括独立信道,其实现输入捕获、输出比较、pWM输出、单脉冲输出等功能,输出比较模式表示控制输出波形或测量了预定时间,在此设定与计数器中的计数值比较的比较值表示在计数值等于设定的比较值时设定的时间。例如,将定时器的预分离值7199作为预加载值99进行计数,启动定时器后计数器从0到99共计开始10ms计数,溢出后再进行计数。通过输出比较功能设定比较值49,当计数器计数值为49时发生捕获/比较事件,当将比较值计数到单片机时,能够控制IO端口输出的低电平,计数器在99继续计数计数器溢出时设定IO端口输出的高电平。计数器在从0到49的时段中输出高电平,在50到99之间输出低电平,并且以10ms为单位循环。这相当于输出循环10ms、占空比50%的pWM信号。通过改变比较值的大小,可以设定pWM的占空比。

STM 32所具备的pWM输出功能是输出比较模式设定占空比信号,进而控制硬件控制信道销的电平状态。由于RGB光引脚没有连接到计时器的外部信道,所以不能使用硬件pWM输出功能,但是可以利用计时器的输出比较功能来生成pWM,这比使用计时器控制IO端口模拟来生成pWM更准确。

已知每个通用计时器具有四个捕获/比较信道,其具有用于加载比较值的捕获/比较寄存器(TIMx CCRx)。该寄存器包括用户可操作以写入比较值的寄存器和用于与计数器进行比较的当前捕获/比较寄存器。在设定了俘获/比较模式寄存器x(TIMx CCMRx)的输出比较前置使能位(OCxpE)的情况下,TIMxCCRx寄存器的比较值在更新事件到来时会传送到当前抓取/比较寄存器。否则,比较值将立即写入当前抓取/比较寄存器。也就是说,写入的比较值立即生效。通常,默认情况下,如图4-10所示,输出比较预安装位。

图4-10通用计时器抓取/比较信道结构图

如果计数器与捕获/比较寄存器(TIMx CCRx)的内容相同,则当设置事件生成寄存器(TIMx EGR)的CCxG比特时,在信道上生成捕获/比较事件,并且当设置相应的中断使能比特(TIMx DIER寄存器的CCxIE比特)时发生抓取/比较中断。

要构成通用计时器的输出比较功能,请按照以下步骤进行。

1,公共计时器的基本定时功能的构成(参照3.6节基本计时器的配合方法)

2,设定TIMx捕获/比较寄存器(CCRx)的预加载使能(x表示1、2、3、4)

3,设定TIMx捕获比较寄存器(CCRx)的值

4,NVIC中断优先度的设定

5.清除TIMx更新中断和获取/比较x中断标志位

6,TIMx更新可插值和x的读取/比较的中断源

7,使能TIMx计时器

设置TIMx捕获/比较寄存器的预加载使能的库函数如下所示。

上述四个库函数分别对应于设定能够选择TIMx:x为2、3、4、5的TIM外围设备的捕获/比较寄存器1、2、3、4的预加载使能。TIM_OCpreload:输出比较预加载状态、参数在表4-1中表示。

用于设置获取比较寄存器(CCRx)的值的库函数如下所示。

这里,TIMx:x是2、3、4、5,可以选择由TIM外围设备CompoareX(X表示1、2、3、4)设置的捕获/比较X寄存器的新值。

关于捕获/比较中断源的设置,请参考教程3.6.3汇总表3-5。这里不重复说明。

4.4.2 RGB七色渐变实验

由于人眼的视觉暂时效果,当灯的闪烁频率在100Hz以上时,人眼几乎分辨不出灯在闪烁,因此pWM的频率达到100Hz以上,假设pWM的频率是100Hz,其周期是1/100Hz=10ms假设调节级别被设置为256级,则每个级别的时间大约为39us,因此需要将定时器的最小计数周期设置为39us。在本节中,通过定时器TIM5的捕获/比较信道1、2、3分别控制R、G、B三个引脚的输出电平状态,生成3个WapWM信号来控制RGB刷新。虽然在前一章中介绍了计时器TIM6的配置定时1s进入中断,但是在本节中,基于前一章,设定计时器TIM5的自动重载值255,设为预分离值72*39-1,即计数周期39us。设置TIM5抓取/比较通道1、2、3的预加载启用,以支持中断。捕获/比较1、2、3寄存器的值范围为0~255,对应于256级调整亮度,当对计时器TIM5设定的捕获/比较x寄存器的数值进行计数时,触发捕获/比较x中断,在中断期间设定RGB对应销输出高电平,熄灭灯。计数为255时,发生计时器更新中断,设定RGB引脚输出低电平,点亮灯。同时,TIM6定时50ms刷新抓取/比较1、2、3寄存器中设定的比较值,控制RGB的亮度,实现7色渐变效果。

具体的代码如下。

4.5简易台灯控制系统

生活中经常可以在屏幕或舞台现场看到绚丽的舞台灯光,本节对实际舞台灯光效果进行分割,通过Kingst-32F1开发板带来的一个RGB小灯实现舞台灯光的各种显示效果。

4.5.1舞台照明控制程序

一、首先设计舞台灯光控制器的功能要求,如下所示。

1、单色闪烁显示模式amp;mdash;amp;mdash;实现红、绿、蓝、黄、紫、蓝、白7种颜色的单独闪烁显示类型。

3,多色闪烁显示模式amp;mdash;amp;mdash;实现红绿、绿蓝、红蓝、红绿蓝间隔闪烁型。

4、多色渐变显示模式amp;mdash;amp;mdash;实现红绿蓝三色渐变,红、绿、蓝、白三色渐变显示类型;

5、按下按钮来实现显示模式的调整。

6、按钮实现闪烁和渐变速度的调整。

7,数字软管显示当前的RGB显示模式。

二、设置舞台灯光控制器的整体程序框架

1、功能分类

键1:RGB模式选择键;

范围1~13:1-红色闪烁、2-绿色闪烁、3-蓝色闪烁、4-黄色闪烁、5-紫色闪烁、

6-蓝光闪烁、7-白光闪烁、8-红绿色交替闪烁、9-绿蓝色交替闪烁、

10-红、蓝交替闪烁,11-红、绿、蓝交替闪烁,12-红、绿、蓝三种颜色渐变

13-红、黄、绿、紫、青七色渐变

键2:逐渐加快闪烁或渐变速度

键3:逐渐减缓闪烁或渐变速度

数字管:显示当前的RGB光模式,数字1~13表示

三、编程程序代码

在本节中,您需要创建一个新的两个文本文件来保存在光刻中。h和灯c用于存储级光控制程序。

具体的代码如下。

长期关注

知识共享|梦想支持