基于STM32的呼吸灯
基于f28335呼吸灯c语言代码

基于f28335呼吸灯c语言代码呼吸灯的原理和应用呼吸灯的原理呼吸灯是一种通过改变灯光亮度的效果来呈现灯光闪烁的效果。
它是通过改变灯光亮度的幅值和频率来实现的。
基本原理是在一定的时间内,逐渐增加灯光亮度,然后逐渐减小灯光亮度,以达到灯光像呼吸一样变化的效果。
呼吸灯的应用呼吸灯通常被用于装饰、照明等领域。
例如,它可以用于室内装饰灯、舞台灯光设计等。
同时,呼吸灯也经常被使用在一些电子产品中,如路由器、手机等,用来表示设备工作状态。
TI TMS320F28335简介TI TMS320F28335是一款基于C28x内核的高性能数字信号处理器(DSP)。
它具有高速运算能力和丰富的外设接口,广泛应用于工业控制、电力电子、通信等领域。
该芯片支持大部分C语言编程,并配有专业的开发工具链,如Code Composer Studio,方便开发人员进行软件开发和调试。
基于TI TMS320F28335的呼吸灯实现硬件设计在开始编写呼吸灯的C语言代码之前,我们首先需要设计硬件电路。
以下是所需的硬件组成:•TI TMS320F28335开发板•LED灯•电阻和电容器具体的电路设计如下:1.将LED灯的一个引脚连接到TMS320F28335的GPIO引脚,作为控制信号输出。
2.将LED灯的另一个引脚连接到电源正极。
3.使用电阻和电容器构建一个RC电路,将电阻连接到LED灯的另一端,电容器连接到电源负极。
软件实现在完成硬件设计后,我们可以开始编写C语言代码来实现呼吸灯效果。
以下是所需的步骤:1.配置TMS320F28335的GPIO引脚为输出模式。
2.在无限循环中,逐渐增加LED灯的亮度,在经过一定时间后,逐渐减小LED灯的亮度。
这一过程可以通过改变控制引脚的电平来实现。
3.使用定时器来创建呼吸灯的频率效果。
通过定时器中断,我们可以准确地控制灯光的变化频率。
下面是基于TI TMS320F28335的呼吸灯C语言代码的主要实现部分:#include "DSP2833x_Device.h"// 定义LED灯控制引脚#define LED_GPIO_PIN GPIO0// 初始化GPIO引脚void GPIO_init(){// 将GPIO引脚配置为输出模式EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;EDIS;}// 初始化定时器void Timer_init(){// 配置定时器参数CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器CpuTimer0Regs.TCR.bit.TRB = 1; // 重载定时器CpuTimer0Regs.PRD.all = 0x1234; // 设置定时周期}// 延时函数void delay(unsigned long count){unsigned long i;for(i = 0; i < count; i++);}// 主函数int main(void){// 系统初始化// 初始化GPIO引脚GPIO_init();// 初始化定时器Timer_init();// 主循环while(1){// 呼吸灯效果for(int i = 0; i < 100; i++){// 增加LED亮度for(int j = 0; j < 100; j++){// 设置引脚为高电平GpioDataRegs.GPASET.bit.LED_GPIO_PIN = 1; delay(100000);}// 减小LED亮度for(int j = 0; j < 100; j++){// 设置引脚为低电平GpioDataRegs.GPACLEAR.bit.LED_GPIO_PIN = 1; delay(100000);}}}}总结本文介绍了基于TI TMS320F28335的呼吸灯的实现过程。
32单片机控制呼吸灯改进措施

32单片机控制呼吸灯改进措施单片机控制呼吸灯是一种较为简单和常见的电子控制技术,通过改变LED的亮度,实现灯光的呼吸效果。
以下是具体的改进措施,以提升呼吸灯的性能和功能。
1.使用PWM调光技术:PWM(脉冲宽度调制)技术是一种通过调节信号的占空比来改变输出电平的技术。
在控制呼吸灯时,可以使用单片机的PWM模块,通过改变PWM的占空比来调节LED的亮度。
相比于简单的开关控制,PWM调光技术可以实现更精细的亮度控制,更加平滑的呼吸效果。
2.添加多种呼吸效果模式:除了常见的线性变化呼吸效果外,可以添加多种不同的呼吸效果模式,如快速呼吸、缓慢呼吸、渐进呼吸等。
通过在程序中改变PWM占空比的变化速度和幅度,可以实现不同的呼吸效果,增加灯光的多样性和艺术感。
3.增加灯光颜色的可调性:传统的呼吸灯通常只使用单色LED,而现在市面上有很多多彩LED可供选择。
可以通过使用RGB(红绿蓝)LED或者RGBW(红绿蓝白)LED,来实现不同颜色的灯光呼吸效果。
在程序中通过控制不同颜色的PWM占空比,可以实现变换的彩色呼吸灯效果。
4.渐变过渡效果:在传统的呼吸灯中,灯光的亮度变化通常是线性的,没有过渡效果。
可以通过使用渐变函数或者数学曲线,使得灯光的亮度变化更加柔和和自然。
在程序中使用渐变函数控制PWM的占空比,可以实现从低亮度到高亮度的平滑过渡效果,使灯光呼吸更加舒缓。
5.外部触发控制:除了自动呼吸控制外,可以增加外部触发控制的功能。
比如,可以添加一个按键来控制呼吸灯的开启和关闭,或者通过外部传感器来感知环境的变化并自动调整亮度。
这样可以增加呼吸灯的交互性和实用性。
6.音乐节奏控制:结合声音传感器,可以实现呼吸灯灯光随着音乐节奏变化的效果。
通过分析声音传感器接收到的声音信号,在程序中根据音量大小和频率来改变PWM的占空比,从而实现灯光的跳动效果。
这种呼吸灯可以用于舞台演出、音乐会等场合,增加氛围效果。
总结:通过以上的改进措施,单片机控制的呼吸灯可以实现更加多样性和灵活性的效果。
23. PWM呼吸灯实验

uint16_t TIM_OCNIdleState; //空闲状态下比较输出状态
} TIM_OCInitTypeDef;
普中STM32开发板带您进入ARM世界
如果我们要配置TIM3的CH1为PWM1模式,输出极性为低电平,并且使能 PWM输出,可以如下配置: TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OC1Init(TIM3,&TIM_OCInitStructure); //输出比较通道1初始化
普中STM32我们以ARR=8,CCRx=4为例进行介绍。第一阶段计数器CNT工作在递增 计数方式,从0开始计数,当TIMx_CNT < TIMx_CCRx时,PWM 参考信号 OCxREF为高电平,当TIMx_CNT >= TIMx_CCRx时,PWM 参考信号 OCxREF 为低电平。第二阶段计数器CNT工作在递减计数方式,从ARR开始递减计 数,当TIMx_CNT > TIMx_CCRx时,PWM 参考信号 OCxREF为低电平,当 TIMx_CNT <= TIMx_CCRx时,PWM 参考信号 OCxREF为高电平。
TIM_OCPreload); 第一个参数用于选择定时器,第二个参数用于选择使能还是失能输出比
较预装载寄存器,可选择为TIM_OCPreload_Enable、 TIM_OCPreload_Disable。 (7)使能 TIMx 在 ARR 上的预装载寄存器允许位 使能 TIMx 在 ARR 上的预装载寄存器允许位库函数是: void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); 第一个参数用于选择定时器,第二个参数用于选择使能还是失能。
stm32单片机呼吸灯的原理

stm32单片机呼吸灯的原理1.引言呼吸灯是一种流行的L ED效果,在各种电子产品中得到广泛应用。
本文将介绍使用ST M32单片机实现呼吸灯效果的原理。
2. st m32单片机介绍S T M32是一款由意法半导体(ST Mi cr oe le c tr on ic s)公司推出的32位A RM Co rt ex-M系列单片机。
它具有高性能、低功耗和丰富的外设以及灵活的软件开发环境,被广泛应用于嵌入式系统中。
3.呼吸灯的工作原理呼吸灯效果的实现原理是通过改变LE D的亮度来模拟人类的呼吸过程,以此带来流畅而柔和的灯光变化。
3.1P W M控制S T M32单片机使用脉冲宽度调制(PW M)技术控制LE D的亮度。
PW M是一种周期性的信号,通过改变其占空比(高电平持续时间与周期之比)来调节输出电平。
3.2呼吸灯的算法呼吸灯算法的基本思想是,通过逐渐改变P WM的占空比,使L ED的亮度恢复到初始状态。
具体步骤如下:1.设置一个呼吸周期,将其分成若干小步长。
2.逐步增加PW M的占空比,使L ED逐渐变亮。
3.当P WM的占空比达到最大值时,开始逐步减小占空比,使L ED逐渐变暗。
4.当P WM的占空比减小到最小值时,重新开始呼吸周期。
3.3呼吸灯实现的关键函数在S TM32的开发环境中,可以使用以下关键函数来实现呼吸灯效果:v o id TI M_PW M_Co nfi g ur at io n(vo id){T I M_Ti me Ba se In itT y pe De fT IM_T im eBa s eS tr uc tu re;T I M_OC In it Ty pe Def T IM_O CI ni tS tr uct u re;//配置定时器基本参数T I M_Ti me Ba se St ruc t ur e.TI M_Pr es cal e r=72-1;//设置分频系数,定时器时钟为72MH zT I M_Ti me Ba se St r uc t ur e.TI M_Pe ri od=999;//设置周期为1000个单位T I M_Ti me Ba se St ruc t ur e.TI M_Co un ter M od e=TI M_Co un ter M od e_U p;//向上计数模式T I M_Ti me Ba se St ruc t ur e.TI M_Cl oc kDi v is io n=TI M_CK D_D I V1;T I M_Ti me Ba se St ruc t ur e.TI M_Re pe tit i on Co un te r=0;T I M_Ti me Ba se In it(T IM2,&T IM_T im eBa s eS tr uc tu re);//配置定时器输出比较参数T I M_OC In it St ru ctu r e.TI M_OC Mo de=TI M_O CM od e_PW M1;T I M_OC In it St ru ctu r e.TI M_Ou tp ut Sta t e=TI M_Ou tp ut Sta t e_En ab l e;T I M_OC In it St ru ctu r e.TI M_Ou tp ut NSt a te=T IM_O ut pu tNS t at e_Di s ab le;T I M_OC In it St ru ctu r e.TI M_Pu ls e=0;//初始占空比为0T I M_OC In it St ru ctu r e.TI M_OC Po l a rit y=T IM_O CP ol ar ity_Lo w;T I M_OC In it St ru ctu r e.TI M_OC NP ol ari t y=TI M_OC NP ol ari t y_Hi g h;T I M_OC In it St ru ctu r e.TI M_OC Id le Sta t e=TI M_OC Id le Sta t e_Se t;T I M_OC In it St ru ctu r e.TI M_OC NI dl eSt a te=T IM_O CI dl eSt a te_R e s e t;T I M_OC1I ni t(TI M2,&TI M_OC In it St ruc t ur e);//启动TI M2定时器T I M_Cm d(TI M2,E NAB L E);}4.程序代码实现以下为基于S TM32单片机的呼吸灯程序代码实现示例,使用标准外设库(St dP er ip hL ibr a ry):#i nc lu de"s tm32f10x.h"v o id de la y(ui nt32_t ms){m s*=1000;w h il e(ms--){a s m("n op");}}i n tm ai n(vo id){G P IO_I ni tT yp eD efG P IO_I ni tS tr uc tur e;//启用GP IO C的时钟R C C_AP B2Pe ri ph Clo c kC md(R CC_A PB2Pe r ip h_GP IO C,EN ABL E);//配置GP IO C的Pin13为推挽输出G P IO_I ni tS tr uc tur e.G PI O_Pi n=GP IO_P in_13;G P IO_I ni tS tr uc tur e.G PI O_Mo de=G PIO_Mo de_O ut_P P;G P IO_I ni tS tr uc tur e.G PI O_Sp ee d=GPI O_S pe ed_50M Hz;G P IO_I ni t(GP IO C,&G PI O_In it St ru ctu r e);//配置PW MT I M_PW M_Co nf ig ura t io n();w h il e(1){//呼吸灯效果f o r(in ti=0;i<1000;i++){T I M_Se tC om pa re1(T I M2,i);d e la y(10);}f o r(in ti=1000;i>=0;i--){T I M_Se tC om pa re1(T I M2,i);d e la y(10);}}}5.结论通过PW M技术和呼吸灯算法,我们可以使用ST M32单片机轻松实现呼吸灯效果。
单片机呼吸灯实训设计报告

一、项目背景随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
为了让学生更好地了解单片机的工作原理和编程方法,提高学生的动手能力和实际应用能力,我们选择了单片机呼吸灯实训项目。
本项目旨在通过单片机控制LED灯的亮度,模拟人类呼吸的过程,使灯光看起来更加柔和和自然。
二、设计目标1. 熟悉单片机的基本原理和编程方法。
2. 掌握PWM(脉宽调制)技术在单片机中的应用。
3. 学会使用定时器实现呼吸灯效果。
4. 培养学生的创新能力和团队合作精神。
三、设计原理呼吸灯效果是通过控制LED灯的亮度实现的。
当LED灯亮度逐渐增加时,灯光看起来像是在“呼气”,而当LED灯亮度逐渐降低时,灯光看起来像是在“吸气”。
这种效果是通过PWM技术实现的。
PWM技术是一种通过改变脉冲宽度来控制电路输出的一种技术。
在PWM信号中,高电平的持续时间(即脉宽)决定了输出信号的亮度。
通过调整脉宽,可以实现对LED灯亮度的控制。
在单片机中,我们可以通过定时器产生PWM信号。
定时器是一个可以产生周期性中断的计数器,通过设置定时器的初值和重载值,可以控制PWM信号的周期和脉宽。
四、硬件设计1. 单片机:选用AT89C51单片机作为主控制器。
2. LED灯:选用8个LED灯,模拟人类呼吸的过程。
3. 电阻:选用8个1K电阻,用于限流保护LED灯。
4. 1nf电容:选用2个1nf电容,用于滤波。
5. 晶振:选用1个晶振,为单片机提供时钟信号。
五、软件设计1. 主程序:初始化定时器,设置PWM信号的周期和脉宽,进入主循环,读取按键输入,根据按键输入控制LED灯的亮度。
2. 定时器中断服务程序:在定时器中断服务程序中,调整PWM信号的脉宽,实现LED灯的亮度控制。
3. 按键扫描程序:读取按键输入,根据按键输入控制LED灯的亮度。
六、实验步骤1. 硬件连接:将AT89C51单片机、LED灯、电阻、电容、晶振等元件按照电路图连接好。
2. 编写程序:使用C语言编写单片机程序,实现呼吸灯效果。
stm32单片机设计实现呼吸灯效果知识应用

我们来探讨一下“STM32单片机设计实现呼吸灯效果”这一主题。
呼吸灯效果是指LED灯逐渐由暗到亮再由亮到暗的渐变效果,仿佛在呼吸一样,因此得名“呼吸灯”。
在嵌入式系统和物联网设备中,呼吸灯是一种常见的人机交互界面,其设计实现涉及到PWM调光技术和定时器中断控制等内容。
在STM32单片机中,实现呼吸灯效果最常用的方法是利用定时器和PWM模块。
我们需要配置定时器的计数周期和预分频系数,以确定呼吸灯的周期和频率。
利用PWM模块控制LED的亮度,根据呼吸灯的状态变化不断更新PWM占空比,从而实现呼吸灯的效果。
在具体的程序设计中,我们可以使用STM32提供的HAL库函数或者直接操作寄存器的方法来实现呼吸灯效果。
在HAL库函数的调用中,需要先初始化定时器和PWM模块,然后在定时器中断中更新PWM的占空比,从而实现呼吸灯效果。
而如果选择直接操作寄存器的方法,需要对寄存器进行设置和操作,相对更加灵活和高效。
除了硬件设计和软件编程,实现呼吸灯效果还需要考虑功耗和灯光效果的优化。
在实际应用中,我们可以通过调节呼吸灯的周期和频率,以及优化PWM输出的方式来达到节能和良好的视觉效果。
还可以考虑使用多个LED灯和不同颜色的混合,设计出更加丰富多彩的呼吸灯效果。
STM32单片机设计实现呼吸灯效果是一个涉及硬件设计和软件编程的综合应用,需要结合定时器、PWM模块和中断控制等知识,并注重功耗和灯光效果的优化。
通过深入理解和实践,我们可以设计出满足用户需求的呼吸灯效果,为嵌入式系统和物联网设备增添更加灵动的人机交互界面。
我的个人观点是,在实际应用中,呼吸灯效果是一种简洁而又美观的人机交互设计,能够为产品增添更加智能和生动的氛围。
掌握STM32单片机设计实现呼吸灯效果的知识和应用技巧对于嵌入式系统工程师和物联网设备开发者来说是非常重要的。
希望通过本文的介绍,读者能对这一主题有更加全面、深刻和灵活的理解。
我们来探讨一下“STM32单片机设计实现呼吸灯效果”这一主题。
基于STM32的智能台灯系统的设计与实现-任务书

(指导教师用表)
系(部):物理系专业:电子信息工程班级:
学生姓名
指导教师姓名
论文(设计)题目
基于STM32的智能台灯系统的设计与实现
下达任务日期
2016.9
任务起止日期
2016.9-2017.6
主要研究内容及方法
基于STM32的智能台灯系统是一款具有智能模式和手动模式两种模式的新型台灯。当夜晚到来时,人们抹黑去去开灯,非常不方便,在智能模式下台灯可以根据光照强度进行关灯或开灯的操作,台灯的亮度可以调节,此外台灯还应该具有呼吸灯或播放播放摇篮曲等功能,有助于用户较快的进入睡眠。
完善设计,撰写论文,整理论文,毕业答辩
2017.5-2017.6
任务下达人签名
任务接收人
签名
教研室指导小组组长签名
系部领导小组组长签名
注:1、本表可根据内容续页;2、本表一式两份,学生、系部存档各一份;3、签名需手写,其他内容电子版填写。
主要参考文献
进度安排
各阶段工作任务
起止日期
资料收集整理,了解系统的原理和构成,初步设计
2016.9-2016.11
确定设计方案,给出设计详细实现方法,进行开题报告
2016.11-2016.12
系统搭建,编写代码,实现要求的功能
2016.12-2017.2
系统调试,进行中期报告
2017.2-2017.5
主要任务及目标
本设计是以STM32作为主控制器,通过光照传感器、人体红外传感器等传感器实时采集外部环境信息,通过输
1.通过光照等传感器实时采集外部信息并显示
2.可通过键盘或其他输入设备进行各种设置
3.智能模式下可以根据光照,是否有人等条件自动关灯开灯
STM32G431RB实现灯带WS2812的跑马灯,流水灯,呼吸灯特效

STM32G431RB实现灯带WS2812的跑马灯,流⽔灯,呼吸灯特
效
在前⾯的⽂章中实现了使⽤Circular模式控制WS2812灯带,利⽤Freertos的Task的管理实现了跑马灯,流⽔灯和呼吸灯的灯效。
在实现中碰到⼀个较⼤的⿇烦,灯带上有168颗灯,利⽤Circular模式后内存是降下来了,但是由于频繁的产⽣DMA中断,导致其他Task被Block了。
最后的解决⽅法是调低DMA中断的优先级从5降到6,同时增加DMA Buffer的⼤⼩减少DMA中断的发⽣。
代码中通过四个函数可以控制灯效的切换。
int pwm_led_effect_set(uint32_t dma_id,uint8_t effection, uint32_t eff_interval,uint8_t grp_leds, uint32_t led_color );
这函数⽤来设置特效的类型。
void pwm_led_effect_start(uint32_t dma_id);
这个函数⽤来启动特效
int pwm_led_effect_stop(uint32_t dma_id,uint8_t b_block,uint32_t timeout);
这个函数⽤来停⽌特效
void pwm_led_run();
这个函数应该放到Task中的循环中执⾏,这个函数的⽬的就是扫描特效数组,检查间隔时间,执⾏每次DMA的发送。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画3)毕业论文须用A4单面打印,论文50页以上的双面打印4)图表应绘制于无格子的页面上5)软件工程类课题应有程序清单,并提供电子文档5.装订顺序1)设计(论文)2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订3)其它STM32呼吸灯设计一.任务解析呼吸灯,指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样。
本设计要求通过STM32,实现呼吸周期为3秒,即吸气时间(亮度上升时间)1.5秒,呼气时间(亮度衰减时间)1.5秒的呼吸灯。
二.方案论证要使用数字器件控制灯光的强弱,我们很自然就想到PWM (脉冲宽度调制)技术。
假如以LED作为灯光设备,且由控制器输出的PWM信号可以直接驱动LED,PWM信号中的低电平可点亮LED灯。
由于视觉暂留效应,人眼可以看不到LED灯的闪烁现象,反映到人眼中的是亮度的差别,因此我们需要LED以较高的频率进行开关(亮灭)切换。
因此,我们可以使用高频率的PWM信号,通过调制信号的占空比,控制LED灯的亮度。
根据以上思路,提出如下两个方案。
方案一:用常见的数学函数来表示亮度随着实践逐渐变强再衰弱,把函数值赋值到数组中,用调制的方法,每个循环给闪烁的熄灭时间加一,灯就会慢慢变暗,在设置熄灭时间加到一定程度就开始减一,就会渐渐变亮了,如此循环。
方案二:把函数值赋值到数组中,对数组中的每一个值进行重复而快速的扫描,当遍历完PWM表中的元素时,再重头开始遍历PWM表。
即以一定的时间长度为周期,LED灯亮的平均时间越长,亮度就越高,反之越暗。
利用STM32定时器的PWM输出功能,实现呼吸灯。
经分析比较与初步测试,方案二更能很好地实现呼吸灯效果,因此选择方案二。
三.方案实施STEP1 生成表示亮度的数学函数亮度随着时间逐渐变强再衰减,可以用两种常见的数学函数表示,分别是半个周期的正弦函数与指数上升曲线基期对称得到的下降曲线。
如图示:正点原子STM32开发板上的LED灯是低电平点亮因此,比较上述两个函数图像我们可以发现,下凹函数曲线灯光处于暗的状态更长,所以指数函数的曲线更符合我们呼吸灯的亮度变化要求。
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"#include "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和定时器模式初始化函数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,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_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]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 = 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_OCInitTypeDef 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_TimeBaseInit(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_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE);TIM_Cmd(TIM3, ENABLE);TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);NVIC_Config_PWM();}定时器的模式配置主要分为三个部分,分别为时基初始化,输出模式初始化和中断配置。