基于STM32的呼吸灯_第1页
基于STM32的呼吸灯_第2页
基于STM32的呼吸灯_第3页
基于STM32的呼吸灯_第4页
基于STM32的呼吸灯_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 word格式. 课程名称 选题名称 选题性质 学号姓名 专业名称 所在院系 完成时间 HUBEI NORMAL UNIVERSITY 电工电子实验报告 STM32课程设计 呼吸灯 仿真与实践 35乔智慧 电子信息科学与技术 物理与电子科学学院 2015年6月03日 电工电子中心2015年6月绘制 word格式. STM32呼吸灯设计 一 任务解析 呼吸灯,指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗 逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样。本设计要求通过 STM32,实现呼吸周期为3秒,即吸气时间(亮度上升时间)1.5秒,呼气 时间(亮度衰减时间)1.5秒的呼吸灯。 二方案

2、论证 要使用数字器件控制灯光的强弱,我们很自然就想到PWM (脉冲宽度 调制)技术。假如以LED作为灯光设备,且由控制器输出的PWM信号可以直 接驱动LED,PWM信号中的低电平可点亮LED灯。由于视觉暂留效应,人眼 可以看不到LED灯的闪烁现象,反映到人眼中的是亮度的差别,因此我们需 要LED以较高的频率进行开关(亮灭)切换。因此,我们可以使用高频率的 PWM信号,通过调制信号的占空比,控制LED灯的亮度。根据以上思路,提 出如下两个方案O 方案一:用常见的数学函数来表示亮度随着实践逐渐变强再衰弱,把 函数值赋值到数组中,用调制的方法,每个循环给闪烁的熄灭时间加一,灯 就会慢慢变暗,在设置熄

3、灭时间加到一定程度就开始减一,就会渐渐变亮了, 如此循环。 方案二:把函数值赋值到数组中,对数组中的每一个值进行重复而快 速的扫描,当遍历完PWM表中的元素时,再重头开始遍历PWM表。即以一定 的时间长度为周期,LED灯亮的平均时间越长,亮度就越高,反之越暗。利 word格式. 用STM32定时器的PWM输出功能,实现呼吸灯。 经分析比较与初步测试,方案二更能很好地实现呼吸灯效果,因此选 择方案二。 三方案实施 STEP1生成表示亮度的数学函数 亮度随着时间逐渐变强再衰减,可以用两种常见的数学函数表示,分别是半个 周期的正弦函数与指数上升曲线基期对称得到的下降曲线。如图示: 正点原子STM32

4、开发板上的LED灯是低电平点亮 因此,比较上述两个函数图像我们可以发现,下凹函数曲线灯光处于暗的状态 更长,所以指数函数的曲线更符合我们呼吸灯的亮度变化要求。 STEP2配置工程环境 在实验中我们用到了 GPIO, RCC,TIM外设,还使用了中斷,所以我们先要把 以下库文件添加到工程:stm32fl0 x_gpio. c, stm32f 10 x_rcc. c, stm32fl0 x_tim. c, mi sc. c,新建 pwm_output. c 及 pwm_output. h 文件并在 stm32fl0 x_conf.h中把使用到的ST库的头文件注释去掉。代码如下: #include

5、Mstm32fl0 x_gpio. h #include stm32f1Ox_rcc. h #include stm32fl0 x_tim. h #include Hmisc. h STEP3 main 文件 本工程的main函数十分简单,仅仅调用了 一个初始化呼吸灯的函数 TIM3_Breathing_Init(),代码如下: int main(void) TIM3_Breath i ng_In i t(); while(l); STEP4 配置定时器输出PWM 初始化呼吸灯的函数TIM3_Breathing_Init按步骤调用为GPIO初始化函数 TIM3_GP10_Config和定时器模

6、式初始化函数TIM3_Mode_Config,代码如下: void TIM3_Breathing_Init(void) TIM3_GPI0_Config(); TIM3_Mode_Config(); STEP5生成指数曲线PWM数据 要实现LED亮度随着指数曲线变化,我们需要使用占空比呈指数曲线变化 的PWM信号,而这样的信号由定时器经过查表产生。这个表的数据存储在程序 中的数组indexWave中,代码如下: uint8_t indexWave = 1,1,2, 2, 3,4, 6,8,10,14,19, 25, 33,44, 59,80, 107,143,191,255, 255,191,

7、143,107, 80, 59,44, 33, 25,19,14,10, 8, 6, 4, 3, 2, 2,1,1; 把这个表中的数据画成图,如下图所示: I II11 250 - 200 150 100 4 50 - 0 2* 1 1 1 1 1*1- 1L 亠一,亠一 ( )24 6810121416 这个表有40个数字,从上图中可以看到这些数据呈指数上升再衰减,正好 是呼吸灯的一个控制周期,数字的围是0-255,即把LED的亮度分为0255个 等级。 假如我们把定时器的脉冲计数器TIMx.CNT 限设置为255,把这个表的数据 一个一个的赋到定时器的比较寄存器TIMx.CCR中,那么在每

8、个PWM周期中,当 TIMx.CNT的计数值小于比较寄存器TIMx.CCR值时,就会在通道中输出低电平, 点亮LED。而随着TIMx_CCR的值由LED亮度表得来,所以LED点亮的时间就会 呈图中的曲线变化,实现呼吸灯的功能。 用于生成LED亮度表的MATLAB函数如下: clear; x = 0 : 8/19 : 8; up 二 2. x ; up = uint8(up); y = 8: -8/19 :0; down = 2/y ; down = uint8(down); line = 0:8/19:8,8:8/19:16 val = up , down dlmwriteC index_wa

9、ve. c, val); plotdine, val,. STEP6初始化GPIO 本设计使用PBO作为定时器PWM输出通道,先对它初始化。作PWM输出通道的 引脚需要被配置为复用推挽输出模式。 static void TIM3_GPI0_Config(void) GPI0_lnitTypeDef GPI0_InitStructure; /* GPIOB clock enable */ RCC_APB2PeriphC1ockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPI0_InitStructure. GP10_Pin = GPIO_Pin_0 ; GPI0_In

10、itStructure. GPI0_Mode = GP10_Mode_AF_PP; GP10_InitStructure. GPIO_Speed = GPIO_Speed_50MHz; GPI0_Init(GPI0B, STEP7配置定时器的棋式 在TIM3_Mode_Config函数中,完成了呼吸灯所需要的定时器PWM输出模式配 置,代码如下: static void TIM3_Mode_Config(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; / RC

11、C.APB1PeriphC1ockCmd(RCC.APB1Periph_TIM3, ENABLE); TIM_T i meBaseSt rue ture. TIM_Per i od = 255; TIM_TimeBaseStructure. TIM_Presca1er = 1999; TIM_TimeBaseStrueture. TIM_C1ockDivision 二 TIM_CKD_DIV1 ; TIM_TimeBaseStructure. TIM_CounterMode = TIM_CounterMode_Up; /时基初始化 TIM_TimeBaseInit(TIM3, TIM_OCIn

12、itStructure. TIM.OCMode 二 TIM_OCMode_PWMl; TIM_OCIn i tStructure. TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure. TIM_Pulse = 0; TIM_OCIn i tStructure. TIM_OCPo1ar i ty = TIM_OCPo1ar i ty_Low; TIM_OC3Init(TIM3, TIM_OC3Pre1oadConf ig(TIM3, TIM_OCPreload_Enable); TIM.ARRPreloadConfig(TI

13、M3, ENABLE); TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3,TIMT.Update, ENABLE); NVIC_Config_PW(); 定时器的模式配置主要分为三个部分,分别为时基初始化,输出模式初始化和 中斷配置。 STEP8时基初始化 这部分主要负责配置定时器的定时周期,时钟频率,计数方式等。它使用 到库函数 TIM_TimeBaseInit,使用结构体 TIM_TimeBaseInitTypeDef 进行配置 该结构体有以下成员: 1) TIM.Period 定时周期,实质是存储到重载寄存器TIM.ARR的数值,脉冲计数器从0累计 到这

14、个值上溢或从这个值自减至0下溢。这个数值加然后乘以时钟源周期就是 实质定时器周期。 本设计向该成员赋值255 5既定时器周期为(255+1 ) *T,T为定时器的时钟 周期。 2) TIM_Precaler 对定时器时钟TIMxCLK的预分频值,分频后作为脉冲计数器TIMx.CNT的驱 动时钟的到脉冲计数器的时钟频率为:Fck_cnt=Ftimx_cnt/(N+l),其中N为 既为赋给本成员的时钟分频值。 本设计给TIM_Preca 1 er成员赋值为1999,既对时钟2000分频,所以定时器 的时钟周期T为2000/72000000 3) TIM_ClockDivision 时钟分频因子。要

15、注意这个TlM_ClockDivision和上面的TIM_Precaler是 不一样的。TIM_Precaler预分频配置是对TIMxCLK进行分频,分频后的时钟被 输入到脉冲计数器TIM.CNTTIM.ClockDivision虽然是对TIMxCLK进行分频。 但它的分频后的时钟频率为Fdts,是被输出到定时器ETRP数字滤波器部分,会 影响滤波器的采样速率。TIALClockDivision可被配置为1分频、2分频及4分 频。ETRP数字滤波器的作用是对外部时钟TIM.ETR进行滤波。 本设计中是使用部时钟TIM.CLK作为定时器时钟源,没有进行滤波所以配 置TIM.ClockDivisi

16、on为任何数值都没有影响。 4) TIM_CounterMode 本成员配置的为脉冲计数器TIMx_CNT的计数模式,分别为向上计数,向下 计数,及中央对齐模式,向上计数既TIMx_CNT从0向上累加到TIM_Period的 值(重载寄存器TIMx_ARR),产生上溢事件。向下计数既TIMx.CNT从TIM_PeCod 的值累减至0,(重载寄存器TIMx.ARR),产生下溢事件。而中央对齐模式向 上向下计数的合体*TIMx_CNT从0累加到TIM_Period的值减1时,产生一个上 溢事件,然后向下计数到1时,产生一个计时器下溢事件,再从0开始重新计 数。 本设计中TIM_CounterMod

17、e成员被赋值为TIM_CounterMode_up(向上计数模 式)。 填充完配置参数后,调用库函数TIM_TimeBaseInit()把这些控制参数写到寄 存器中,定时器的时基就配置完成了。 STEP9输出棋式配置 通用寄存器的输出模式由TIM_OCLinitTypeDef类型结构体的以下几个成员 来设置: 1)TlM_OCMode 输出模式配置,主要使用的为PWM1和PWM2模式。 PWM模式是:向上计数时,当TIMx_CNTTIMx_CCRn时,通道n输出为无效电平,否则为无效电平。 PWM2模式跟PWM1模式相反。 其中的有效电平和无效电平并不是对应地对应高电平和低电平,也是需要配 置

18、的,由下面介绍的TIM_OCPolai*ity成员配置。 本设计使用PWM1输出模式。 2) TIM_OutputState 配置输出模式状态使能或关闭或输出。 本设计想该成员赋值为TIM_OutputState_Enable (使能输出) 3) TIM.OCPolairty 有效电平的极性,把PWM模式中的有效电平设置为高电平或低电平。 本设计中向该成员赋值为TIM_OCPolairty_ 1 ow 因为在上面吧输出配置为PWM1 模式,向上计数,所以在TIMx_CNT= 10) TIM3-CCR3 = i ndexWavepwm_ i ndex; pwm_i ndex+;/标志PWM表的下

19、一个元素 if( putd_index = 40) pwm_index=0; period_cnt=0; 重置周期计数标志 TIM.ClearlTPendingBit (TIM3, TIM_IT_Update);/必须要清 除中斷标志位 本中斷服务函数在每次定时器更新事件发生时执行一次(即256个定时器时 钟周期)。本代码的目的是每10次定时器中斷更新一次PWM表中的数据到比较 寄存器TIMx_CCR中,当遍历完PWM表的40个元素时,再重头开始遍历PWM表, 周而复始,重复LED的呼吸过程。 四 实验现象 现展示三组呼吸过程如下图所示: 低亮度 高亮度 中等亮度 五经验总结 1、初次写完该实验代码后,自己的呼吸灯呼吸的过程是带有微弱的闪烁的,并 不是想象中一般的连贯,而找了各种原因也无法找出,后来经过自己不懈的努 力(就是每10次定时器中斷更新一次PWM表中的数据到比较寄存器TIMx.CCR 中)问题才得以解决,但具体为什么这样改就可以,自己目前还不是彻底明白, 不过自己从中得出,在实验中遇到困难,不要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论