ImageVerifierCode 换一换
格式:DOC , 页数:16 ,大小:583.50KB ,
资源ID:2601893      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/2601893.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(本科毕业论文---基于stm32的呼吸灯时间.doc)为本站上传会员【可****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

本科毕业论文---基于stm32的呼吸灯时间.doc

1、湖北师范学院电工电子实验教学省级示范中心电子版实验报告 STM32课程设计 呼吸灯 仿真与实践 2012112020335 乔智慧 电子信息科学与技术 物理与电子科学学院 2015年6月03日 电工电子中心2015年6月绘制 第16页,共16页 STM32呼吸灯设计 一.任务解析 呼吸灯,指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样。本设计要求通过STM32,实现呼吸周期为3秒,即吸气时间(亮度上升时间)1.5秒,呼气时间(亮度衰减时间)1.5秒的呼吸灯。 二.方案论证 要使用数

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

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

4、亮 因此,比较上述两个函数图像我们可以发现,下凹函数曲线灯光处于暗的状态更长,所以指数函数的曲线更符合我们呼吸灯的亮度变化要求。 STEP2 配置工程环境 在实验中我们用到了GPIO,RCC,TIM外设,还使用了中断,所以我们先要把以下库文件添加到工程:stm32f10x_gpio.c, stm32f10x_rcc.c, stm32f10x_tim.c,misc.c,新建pwm_output.c及pwm_output.h文件,并在stm32f10x_conf.h中把使用到的ST库的头文件注释去掉。代码如下: #include "stm32f10x_gpio.h" #incl

5、ude "stm32f10x_rcc.h" #include "stm32f10x_tim.h" #include "misc.h" STEP3 main文件 本工程的main函数十分简单,仅仅调用了一个初始化呼吸灯的函数TIM3_Breathing_Init( ),代码如下: int main(void) { TIM3_Breathing_Init(); while(1); } STEP4 配置定时器输出PWM 初始化呼吸灯的函数TIM3_Breathing_Init按步骤调用为GPIO初始化函数TIM3_GPIO_Config和定时器模

6、式初始化函数TIM3_Mode_Config,代码如下: void TIM3_Breathing_Init(void) { TIM3_GPIO_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,

7、255,255,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1}; 把这个表中的数据画成图,如下图所示: 这个表有40个数字,从上图中可以看到这些数据呈指数上升再衰减,正好是呼吸灯的一个控制周期,数字的范围是0-255,即把LED的亮度分为0—255个等级。 假如我们把定时器的脉冲计数器TIMx_CNT上限设置为255,把这个表的数据一个一个的赋到定时器的比较寄存器TIMx_CCR中,那么在每个PWM周期中,当TIMx_CNT的计数值小于比较寄存器TIMx_CCR值时,就会在通道中输出低电平,点亮LED。而随着TIMx_CC

8、R的值由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 , dow

9、n] dlmwrite('index_wave.c',val); plot(line,val,'.'); STEP6 初始化GPIO 本设计使用PB0作为定时器PWM输出通道,先对它初始化。作PWM输出通道的引脚需要被配置为复用推挽输出模式。 static void TIM3_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC

10、APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } STEP7 配置定时器的模式 在TIM3_Mode_Config函数中,完成了呼吸灯所需要的定时器PWM输出模式配置,代码

11、如下: static void TIM3_Mode_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 255; TIM_TimeBaseStructure.TIM_Pres

12、caler = 1999; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //时基初始化 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_O

13、utputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE);

14、 TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE); NVIC_Config_PWM(); } 定时器的模式配置主要分为三个部分,分别为时基初始化,输出模式初始化和中断配置。 STEP8 时基初始化 这部分主要负责配置定时器的定时周期,时钟频率,计数方式等。它使用到库函数TIM_TimeBaseInit,使用结构体TIM_TimeBaseInitTypeDef进行配置,该结构体有以下成员: 1)TIM_Period

15、 定时周期,实质是存储到重载寄存器TIM_ARR的数值,脉冲计数器从0累计到这个值上溢或从这个值自减至0下溢。这个数值加然后乘以时钟源周期就是实质定时器周期。 本设计向该成员赋值255,既定时器周期为(255+1)*T,T为定时器的时钟周期。 2)TIM_Precaler 对定时器时钟TIMxCLK的预分频值,分频后作为脉冲计数器TIMx_CNT的驱动时钟,的到脉冲计数器的时钟频率为:Fck_cnt=Ftimx_cnt/(N+1),其中N为既为赋给本成员的时钟分频值。 本设计给TIM_Precaler成员赋值为1999,既对时钟2000分频,所以定时器的时钟周期T为2000/7200

16、0000 3)TIM_ClockDivision 时钟分频因子。要注意这个TIM_ClockDivision和上面的TIM_Precaler是不一样的。TIM_Precaler预分频配置是对TIMxCLK进行分频,分频后的时钟被输入到脉冲计数器TIM_CNT,而TIM_ClockDivision虽然是对TIMxCLK进行分频。但它的分频后的时钟频率为Fdts,是被输出到定时器ETRP数字滤波器部分,会影响滤波器的采样速率。TIM_ClockDivision可被配置为1分频、2分频及4分频。ETRP数字滤波器的作用是对外部时钟TIM_ETR进行滤波。 本设计中是使用内部时钟TIM_C

17、LK作为定时器时钟源,没有进行滤波所以配 置TIM_ClockDivision为任何数值都没有影响。 4) TIM_CounterMode 本成员配置的为脉冲计数器TIMx_CNT的计数模式,分别为向上计数,向下计数,及中央对齐模式,向上计数既TIMx_CNT从0向上累加到TIM_Period的值,(重载寄存器TIMx_ARR),产生上溢事件。向下计数既TIMx_CNT从TIM_Period的值累减至0,(重载寄存器TIMx_ARR),产生下溢事件。而中央对齐模式向上向下计数的合体,TIMx_CNT从0累加到TIM_Period的值减1时,产生一个上溢事件,然后向下计数到1时,产生一个计

18、时器下溢事件,再从0开始重新计数。 本设计中TIM_CounterMode成员被赋值为TIM_CounterMode_up(向上计数模式)。 填充完配置参数后,调用库函数TIM_TimeBaseInit()把这些控制参数写到寄存器中,定时器的时基就配置完成了。 STEP9 输出模式配置 通用寄存器的输出模式由TIM_OCLinitTypeDef类型结构体的以下几个成员来设置: 1)TIM_OCMode 输出模式配置,主要使用的为PWM1和PWM2模式。 PWM模式是:向上计数时,当TIMx_CNT

19、通道n输出为有效电平,否则为无效电平;向下计数时,当TIMx_CNT>TIMx_CCRn时,通道n输出为无效电平,否则为无效电平。PWM2模式跟PWM1模式相反。 其中的有效电平和无效电平并不是对应地对应高电平和低电平,也是需要配置的,由下面介绍的TIM_OCPolarity成员配置。 本设计使用PWM1输出模式。 2)TIM_OutputState 配置输出模式状态使能或关闭或输出。 本设计想该成员赋值为TIM_OutputState_Enable(使能输出) 3)TIM_OCPolairty 有效电平的极性,把PWM模式中的有效电平设置为高电平或低电平。 本设计中向

20、该成员赋值为TIM_OCPolairty_low,因为在上面吧输出配置为PWM1模式,向上计数,所以在TIMx_CNT

21、中断及其他配置 本函数剩下的代码用TIM_OCxPreloadConfig()配置了各通道的比较寄存器TIM_CCR与装载使能:使用TIM_ARRPreloadConfig()把重载寄存器TIMx_ARR使能,调用了TIM_ITConfig()配置定时器更新中断,每个定时器周期结束后触发一次。该中断的优先级有函数NVIC_Config_PWM()配置,代码如下: static void NVIC_Config_PWM(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption

22、 priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置TIM3_IRQ中断为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = E

23、NABLE; NVIC_Init(&NVIC_InitStructure); } 配置好中断,然后编写中断服务代码如下: /* 呼吸灯中断服务函数 */ void TIM3_IRQHandler(void) { static uint8_t pwm_index = 0; //用于PWM查表 static uint8_t period_cnt = 0; //用于计算周期数 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //TIM_IT_Update { period_cnt++;

24、 if(period_cnt >= 10) { TIM3->CCR3 = indexWave[pwm_index]; pwm_index++; //标志PWM表的下一个元素 if( pwm_index >= 40) { pwm_index=0; } period_cnt=0; //重置周期计数标志 } TIM_ClearITPendingBit (TIM3, TIM_IT_Update);//必须要清除中断标志位 } } 本中断服务函数

25、在每次定时器更新事件发生时执行一次(即256个定时器时钟周期)。本代码的目的是每10次定时器中断更新一次PWM表中的数据到比较寄存器TIMx_CCR中,当遍历完PWM表的40个元素时,再重头开始遍历PWM表,周而复始,重复LED的呼吸过程。 四、 实验现象 现展示三组呼吸过程如下图所示: 低亮度 中等亮度 高亮度 五. 经验总结 1、初次写完该实验代码后,自己的呼吸灯呼吸的过程是带有微弱的闪烁的,并不是想象中一般的连贯,而找了各种原因也无法找出,后来经过自己不懈的努力(就是每10次定时器中断更新一次P

26、WM表中的数据到比较寄存器TIMx_CCR中)问题才得以解决,但具体为什么这样改就可以,自己目前还不是彻底明白,不过自己从中得出,在实验中遇到困难,不要轻易放弃,要学会根据实验现象来一步步地调试。 2、通过这次综合实验让我对STM32有了更进一步的熟悉和了解,一个看似很简单的东西,要动手把它设计出来就比较困难了,所以在以后的学习中我们要注意这一点,要把课堂上所学到的知识和实际联系起来,同时通过这次设计,自己不但巩固了上课所学知识,也把理论与实践从真正意义上结合起来了。 3、当我们拿到一个题目时,一定要先仔细分析要求,然后做出总体设计方案,再进一步细化各单元,最后将整个单元组合在一起,得出最

27、佳的方案。 4、通过这次综合设计,让我真正理解了书本上知识,也让我知道了我们课本上的知识在实际中怎么应用,同时自己也掌握了在理论中遇到问题时,应该怎样去解决,在实际中遇到迷团应该怎样去检查调试。 5、通过此次设计,让自己明白到任何实验都是基于理论的,理论知识学扎实了,我们才能快速准确地完成实验,以此实验警示自己在后期的学习中一定要注意理论知识的学习。 6、对实验中出现的问题,一定要认真分析其原因之所在,然后通过各种方法解决试验中出现的问题,做完实验之后要做好相关总结,这样才能把一个实验做完美。 7、这学期的课程设计中,自己查阅和收集了大量的资料,与数据的制作,并在程序编写的过程中提供一定的思路和方向,参加了调试工作,提高了课程设计的进程,在这学期的课程设计中,我不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,同时学会了很多学习的方法,而这是日后最实用的,真的是受益匪浅。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服