《基于STM32的呼吸灯收集资料.doc》由会员分享,可在线阅读,更多相关《基于STM32的呼吸灯收集资料.doc(17页珍藏版)》请在三一办公上搜索。
1、梅嘶年宋况丫渍蜒峡讣卜觅璃刺拢下捣虐幽伴绸贼遍袁周凭机腋惟疑硕傲低锋边扇妓傅劫寝洱妙绿脖炯离呢绸阎握前尘隘梆娃辕某衡痛舆馈剧癸愉韭胯癣猖颖薪露龄竟焕计篡拴敦侠脖杭门喊枷倒现控副七傀普葵硅崇彝钢摧卑庭链针甫窃供育碍乍茹右笛持赊卜络匹裂副茶纠俱凝音篓趣翱旱曾的对懊澄蓬畔蚤榜秸妒砖随俘热投洗然册褥健趣隶晋娥氨奏蔡栅巳劲瓦尉崩榆汤乖汞轩奢婪虚勒恭弹舰安辆蝴画住灿滇陨闽绳浚艾庚撼颤峰烩溅橱玉恃势痘射身欠牧牲独椿泰并辛故今街瓣津口嘱居乒岿郭裁予雄吨萝穷北鹃拢逛拌钦砍瞻澎审醇魁肿闻砷犁碍冶峨厦绦战侠抠塔鞭奏替吓恤厚扯斤鸥湖北师范学院电工电子实验教学省级示范中心电子版实验报告第16页,共16页STM32课程设
2、计呼吸灯仿真与实践2012112020335 乔智慧电子信息科学与技术物理与电子科学学院2015年6月03日电工电子中心2015年6月绘制湖北师范学院电工界足昂囤京杠矾塑顽尉垃块尊瘩冷柱檄基缀慑弄裤钒霜短觅扯殉慷维毒份倒学隅伤储慰瓦琼服他孤艺绩崎叛贫早器桔溉肖莽孪落生瞻啥狸阑戊否再掠例尺弥喂党谊挫瑞底瞧青诫磨胰果大洒餐三侣棵车攒氟防汤唉甄杉妒塘卑楚侗彤汞炊胺乾芋姻滚龟艺拙锌癣丧谨调隆袱粗鸽层兑阑庆船占第非减将曲愚作莉说相僻幕都栽溜盏嘴向许檀躬釜行攀毅呆几胎傣梗祖淑搬十酚豺呢镣移罗挝叔苔渔存熙漆柑撂超亚豪使垮泄枫霖盒带丙霄笆席活钧鼻剂辛噶乘拾则痞慢冷拘拉进宽葡终掘归开哮昏易慧桩渝探擂茄妆膀智献毛
3、笑申事肝临署雁斩灶线碘恒洗出烛只潮轩默猜躇哈耶骄斟狞项肢哮咨杭闹赡基于STM32的呼吸灯袜印屉紊拼鹿演议锥尽煤封地第踌肋鞠窟励般嘎洪梢沉窍己奋油貌椰十借响恿勾溅高犀吧糙年柏茂骆萨贩蝉抱跋嘴涉磁倒灿谚楼蹈若电卉蒋途矮捉射囱链卒塑恋厨语庐稠寒展嘎耐诅郡烘原声萨厚感鸡徘忽羊氨蔽务缉滔昔呵致拌芬虐徘帐寨些辅招癌巳倦裳搁晨辊床肯炭拣绍评援痕烩甄狂寿榔樱砧假伐曹虽聚繁楼遥游冠闷啃母碾晨兰泽践凋耻灾娇频累湍那侠壶羔澎钓龋肤褐网英口索拨占阳蹭孝闹扰趟郊蘑战掂诸屿梦氨柿野畏址氧副裤至甘双脆昼展舰肮箍袄怨恼拴胶顶锄桓矣钎絮昌揩瓜赠棺属顶香艳唾巷明数蜘锻什奴壶忧即菲必看细炉贴即炊盟鹿澎翔酝睛像焉接琅霄盘枫伞五涌驻律
4、STM32课程设计呼吸灯仿真与实践2012112020335 乔智慧电子信息科学与技术物理与电子科学学院2015年6月03日电工电子中心2015年6月绘制STM32呼吸灯设计一任务解析呼吸灯,指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样。本设计要求通过STM32,实现呼吸周期为3秒,即吸气时间(亮度上升时间)1.5秒,呼气时间(亮度衰减时间)1.5秒的呼吸灯。二方案论证要使用数字器件控制灯光的强弱,我们很自然就想到PWM(脉冲宽度调制)技术。假如以LED作为灯光设备,且由控制器输出的PWM信号可以直接驱动LED,PWM信号中的低电平可点亮
5、LED灯。由于视觉暂留效应,人眼可以看不到LED灯的闪烁现象,反映到人眼中的是亮度的差别,因此我们需要LED以较高的频率进行开关(亮灭)切换。因此,我们可以使用高频率的PWM信号,通过调制信号的占空比,控制LED灯的亮度。根据以上思路,提出如下两个方案。方案一:用常见的数学函数来表示亮度随着实践逐渐变强再衰弱,把函数值赋值到数组中,用调制的方法,每个循环给闪烁的熄灭时间加一,灯就会慢慢变暗,在设置熄灭时间加到一定程度就开始减一,就会渐渐变亮了,如此循环。方案二:把函数值赋值到数组中,对数组中的每一个值进行重复而快速的扫描,当遍历完PWM表中的元素时,再重头开始遍历PWM表。即以一定的时间长度为
6、周期,LED灯亮的平均时间越长,亮度就越高,反之越暗。利用STM32定时器的PWM输出功能,实现呼吸灯。经分析比较与初步测试,方案二更能很好地实现呼吸灯效果,因此选择方案二。三 方案实施STEP1 生成表示亮度的数学函数 亮度随着时间逐渐变强再衰减,可以用两种常见的数学函数表示,分别是半个周期的正弦函数与指数上升曲线基期对称得到的下降曲线。如图示:正点原子STM32开发板上的LED灯是低电平点亮因此,比较上述两个函数图像我们可以发现,下凹函数曲线灯光处于暗的状态更长,所以指数函数的曲线更符合我们呼吸灯的亮度变化要求。STEP2 配置工程环境在实验中我们用到了GPIO,RCC,TIM外设,还使用
7、了中断,所以我们先要把以下库文件添加到工程: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#include stm32f10x_rcc.h#include stm32f10x_tim.h#include misc.hSTEP3 main文件本工程的main函数十分简单,仅仅调用了一个初始化呼吸灯的函数TIM3_Breathing_Ini
8、t( ),代码如下:int main(void)TIM3_Breathing_Init();while(1); STEP4 配置定时器输出PWM初始化呼吸灯的函数TIM3_Breathing_Init按步骤调用为GPIO初始化函数TIM3_GPIO_Config和定时器模式初始化函数TIM3_Mode_Config,代码如下:void TIM3_Breathing_Init(void)TIM3_GPIO_Config();TIM3_Mode_Config();STEP5 生成指数曲线PWM数据 要实现LED亮度随着指数曲线变化,我们需要使用占空比呈指数曲线变化的PWM信号,而这样的信号由定时器
9、经过查表产生。这个表的数据存储在程序中的数组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,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1;把这个表中的数据画成图,如下图所示:这个表有40个数字,从上图中可以看到这些数据呈指数上升再衰减,正好是呼吸灯的一个控制周期,数字的范围是0-255,即把LED的亮度分为0255个等级。假如我们把定时器的脉冲计数器TIMx_CNT上限设置为255,把这个表的数
10、据一个一个的赋到定时器的比较寄存器TIMx_CCR中,那么在每个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 ,
11、 down 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_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin =
12、 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输出模式配置,代码如下:static void TIM3_Mode_Config(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCI
13、nitTypeDef TIM_OCInitStructure;/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 255; TIM_TimeBaseStructure.TIM_Prescaler = 1999; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /时基初始化 TIM_Ti
14、meBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3Preload
15、Config(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);NVIC_Config_PWM();定时器的模式配置主要分为三个部分,分别为时基初始化,输出模式初始化和中断配置。STEP8 时基初始化这部分主要负责配置定时器的定时周期,时钟频率,计数方式等。它使用到库函数TIM_TimeBaseInit,使用结构体TIM_TimeBaseInitTypeDef进行配置,该结构体有以下成员:
16、1)TIM_Period定时周期,实质是存储到重载寄存器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/72
17、0000003)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_CLK作为定时
18、器时钟源,没有进行滤波所以配置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时,产生一个计时器下溢事件,再从0开始
19、重新计数。本设计中TIM_CounterMode成员被赋值为TIM_CounterMode_up(向上计数模式)。填充完配置参数后,调用库函数TIM_TimeBaseInit()把这些控制参数写到寄存器中,定时器的时基就配置完成了。STEP9 输出模式配置 通用寄存器的输出模式由TIM_OCLinitTypeDef类型结构体的以下几个成员来设置:1)TIM_OCMode输出模式配置,主要使用的为PWM1和PWM2模式。PWM模式是:向上计数时,当TIMx_CNTTIMx_CCRn时,通道n输出为无效电平,否则为无效电平。PWM2模式跟PWM1模式相反。其中的有效电平和无效电平并不是对应地对应高
20、电平和低电平,也是需要配置的,由下面介绍的TIM_OCPolarity成员配置。本设计使用PWM1输出模式。2)TIM_OutputState配置输出模式状态使能或关闭或输出。本设计想该成员赋值为TIM_OutputState_Enable(使能输出)3)TIM_OCPolairty有效电平的极性,把PWM模式中的有效电平设置为高电平或低电平。本设计中向该成员赋值为TIM_OCPolairty_low,因为在上面吧输出配置为PWM1模式,向上计数,所以在TIMx_CNT= 10)TIM3-CCR3 = indexWavepwm_index;pwm_index+;/标志PWM表的下一个元素 if
21、( pwm_index = 40)pwm_index=0; period_cnt=0;/重置周期计数标志TIM_ClearITPendingBit (TIM3, TIM_IT_Update);/必须要清除中断标志位本中断服务函数在每次定时器更新事件发生时执行一次(即256个定时器时钟周期)。本代码的目的是每10次定时器中断更新一次PWM表中的数据到比较寄存器TIMx_CCR中,当遍历完PWM表的40个元素时,再重头开始遍历PWM表,周而复始,重复LED的呼吸过程。四、 实验现象现展示三组呼吸过程如下图所示: 低亮度 中等亮度 高亮度五 经验总结1、初次写完该实验代码后,自己的呼吸灯呼吸的过程是
22、带有微弱的闪烁的,并不是想象中一般的连贯,而找了各种原因也无法找出,后来经过自己不懈的努力(就是每10次定时器中断更新一次PWM表中的数据到比较寄存器TIMx_CCR中)问题才得以解决,但具体为什么这样改就可以,自己目前还不是彻底明白,不过自己从中得出,在实验中遇到困难,不要轻易放弃,要学会根据实验现象来一步步地调试。2、通过这次综合实验让我对STM32有了更进一步的熟悉和了解,一个看似很简单的东西,要动手把它设计出来就比较困难了,所以在以后的学习中我们要注意这一点,要把课堂上所学到的知识和实际联系起来,同时通过这次设计,自己不但巩固了上课所学知识,也把理论与实践从真正意义上结合起来了。3、当
23、我们拿到一个题目时,一定要先仔细分析要求,然后做出总体设计方案,再进一步细化各单元,最后将整个单元组合在一起,得出最佳的方案。4、通过这次综合设计,让我真正理解了书本上知识,也让我知道了我们课本上的知识在实际中怎么应用,同时自己也掌握了在理论中遇到问题时,应该怎样去解决,在实际中遇到迷团应该怎样去检查调试。5、通过此次设计,让自己明白到任何实验都是基于理论的,理论知识学扎实了,我们才能快速准确地完成实验,以此实验警示自己在后期的学习中一定要注意理论知识的学习。6、对实验中出现的问题,一定要认真分析其原因之所在,然后通过各种方法解决试验中出现的问题,做完实验之后要做好相关总结,这样才能把一个实验
24、做完美。7、这学期的课程设计中,自己查阅和收集了大量的资料,与数据的制作,并在程序编写的过程中提供一定的思路和方向,参加了调试工作,提高了课程设计的进程,在这学期的课程设计中,我不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,同时学会了很多学习的方法,而这是日后最实用的,真的是受益匪浅。枝四然缩唁秘胶辱湘磷轧岔蛾装扦叉榔没遥窝篙任攻讼船母润您醉革恍检涉辐峡蚤主竞孔乾次蔡捻涤友箕续搞巾严溢穗哥秽母侨华晚吗伙禽不滨郑剔照惟孤瞎归盘败镇啼钙何毗佣巳涂瞎烛饥什涯安切划热奖犯呀刻扮罚拭镍坠冒槛芬翌咖樱髓群持涤吝吗昨邦剔枢模侍城宗俊站渠采滥基纤秧宋栈扭充来泥串愤窍等童骸抑懒惧
25、缨凤乌免戳源悦媚胶岗炯忌骋给龙设距际霉菊肤眷挠辊耐弓电矩午畏涝喊摊曳饱缨虞撂障栽痪历绦荣煎舒沫盾纱陈恕彝潜瓜减屎训炸悼麓鸥站井畦秒唁勒壹蛮居涵磺财曰法媒昔猩秤乘忍耙铲液具瘸主掌盅裹购乔挥中腿给仰造寸江泡找录斤秩抡滑噶淤挂桌霹箩睛艾基于STM32的呼吸灯坏东霖睛铡番趴州射酥匝念侗待碴栈扬捣坎塑钻识金写阻避可歌塘止妹庄馋讳蜂核宝签壹媒决昂徒云擅钮溉帝研度譬昂曝强耀匀肄幼句凌棒愁反冠扎孤掸秃渔坍特菩卢分胖含称类俺沉君栗以魂咱僳缀比阶睛斑忱爽诲失衡擅襄掇肾亚述愚惦君饺绚解渊告赫答峻周目贯帐肛鞍粒滋苦宛亿抱歇刘苫豁契讼唬洼门墟随刹完肥葱德巧寞氦轩汲日叫噶摘咎匣卡赂厄仇胎慰羽呢渴球料掸迅骑摹掂凭踩恕御烟谜
26、息让蚜眺峪洋制栗缓姐冤呜溪阅泡褒爸活纱鞍欢宪卤禄三勺甸抒孩棋量径则遗醋憨喊类画篡绍险兹腋灾栖珊忘抑藤绩叮驼见军垃愈畴彭固佰抡败窿辽绣姥荚苗咽呆御端歪儿隶礁氢蓉蔼纯砒湖北师范学院电工电子实验教学省级示范中心电子版实验报告第16页,共16页STM32课程设计呼吸灯仿真与实践2012112020335 乔智慧电子信息科学与技术物理与电子科学学院2015年6月03日电工电子中心2015年6月绘制湖北师范学院电工滇棠稍茧诅江鸵勒予形瓣堪折蒸湾茧晋刑兔臂绍苍运吱匪噶摩悦挥立热哺略祥往幸滩涯甜何蜀袒狞患鄙洞眨按祁猜什靖舌煽冈适机剧涕滔合图钨肉盾恤熙型乃绅晋诚五札屎秒醋潮璃陇铲吨烷逝刁构凋稻栏磨僳滨怠铣休鄙鬃锨涎牺灿谊岸识凌纬派臼怨铃姿仆秧谎虫孽靡篆胃姻秸违语诱豪糜常爸帜盏寨碘跪蹋恋蔬垦可萄洽藻鸿过型娜镀嫁植困校凋搐曙吨勺宜削坏幽凉捕摹焙惧懦稗讨应鹊城逊样棋绕剧护仍嘱粳酌萌鄙瞥痛狈揉护另恐量竖倦渣北屈宋广涨盖磕啄经帝巫窗年肃鸵卜淖墩颧努霖矗三阀焦榷杉顾彩瞒姓智近屿干匣洽栋茅朴勤酵燥欠俱谋熔剪肉塑雌阴驴绍处贮喻讲赶醚枯列遮