程文龙 徐瑾 孙智勇
摘要:随着科技水平的提高,ARM的应用越来越广泛。本文针对ARM的进一步学习,探讨STM32定时器产生PWM(脉冲宽度调制)输出能影响LED亮度进行了实验。PWM的应用十分广泛,在测量,通信,功率控制,电动机控制等许多领域。因此研究PWM技术具有十分重要的现实意义。本设计采用STM32定时器产生的PWM,PWM的周期即定时器定时的时间,通过计算方波的频率,占空比,配置定时器和IO口,之后用示波器显示相应通道占空比的方波即可。但本实验存在无法独立的控制很多的LED灯
关键词:STM32;呼吸灯; PWM;定时器;示波器
中图分类号:TP271 文献标识码:A 文章编号:1009-3044(2018)07-0198-02
Abstract:With the develop of technology,ARM is used in various situations.On the intention of study on ARM, time of STM32 produce pulses PWM(width modulation) is studied in this paper PWM is the square wave which has a sure duty-cycle and frequency. application fields include measurement, communication, power control and transform, motor control, Its servo control, even some audio amplifier. Therefore it is important to research PWM technology. It is easy to use the timer of STM32 to produce PWM output. PWM is produced by the timer of STM32. The cycle of PWM is the timer is regular time. By calculating the frequency of square wave, duty-cycle, configuring the timer and IO, then use oscilloscope displayed the PWM.
Key words: STM32;LED indicator;PWM;timer;Oscilloscope
1 STM32的前景和應用
随着科技的发展,在现代化的社会电子产品越来越多,这也就意味着我们新一代的年轻人在享受科技给我们带来的便利的时候,我们也要掌握一定的科学技术和基本技能。单片机与人们的生活已经结为一体。从数字闹钟到电动牙刷和电动剃须刀;从车内应用门锁、停车传感器、ABS,到行车途中交通控制、雷达测速以及交通流量监视器;从家庭和办公应用中的工厂自动化、照明控制(如荧光灯、镇流器控制、应急灯等),到家庭保健中的植入式心律转复除颤器、胃窥镜等,以及手机、火灾控制系统、烟雾报警器等应用,都有单片机在其中发挥着重要作用。 个人觉得STM32在日后的产品应用当中会越来越广泛,其高性能低功耗低价格(相对)都有很大的市场优势。
2 设计方案
①STM呼吸灯设计一:解析呼吸灯,指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,存在一种一起一伏的趋势,就像在呼吸一样。
②本设计是通过STM32控制周期为3s,及吸气时间(亮度上升时间)为1.5;呼气时间(亮度衰减时间)为1.5s的呼吸灯。
③方案论证要通过示波器来显示呼吸灯频率的变化,就是我们通常说的PWM来改变脉冲的宽度和频率。
PWM波的频率是某一个固定的值,但是高低电平所占比例(占空比)会根据用户设定而变化。假设高电平灯点亮,低电平熄灭,那么在PWM波一个周期内灯点亮的时间就等于周期*占空比。调整占空比,就可以控制LED在一个周期内的点亮时间。由于PWM波频率很高,超出人眼分辨速度,那么在人眼中就是连续的灯光,按照渐变占空比变化,在人眼中就可以表现为亮度的变化。
脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
使用定时器来控制I/O口输出PWM波形,从而驱动LED灯出现类似呼吸频率一般的亮灭。
3 实现原理
这是STM32数据手册上对TIM3通用定时器复用功能重映象的描述,假设让PA6作为PWM输出从图中可以看出PA6对应TIM3的通道1, 使能TIM3通道1的函数为TIM_OC1Init();同样的,如果想要使能PA7,它对应的是TIM3的通道2,那么使能通道2的函数便是:TIM_OC2Init()以此类推,需要注意,使能不同相同定时器不同通道的函数是有一点小差别的,以上都是为我们下一步的实验做好的准备。假如我们以LED作为灯光设备,由控制器输出的PWM信号可以直接驱动LED,PWM中的低电平可以点亮LED,由于人眼瞬间看不但LED的闪烁现象,所以我们感觉不到它的差别,因此我们只能调节频率,我们可以以较高频率实现LED的开关,及我们可以调高PWM信号的频率,以此来实现LED的亮度。通过以上的思路,有如下的方法可以实现。
以下是固件函数:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
void RCC_Configuration(void);
void TIM_GPIO_Config(void);
void PWM_Mode_Config(void);
int main(void)
{ u8 led_fx=1;//灯亮的方向,有亮到暗,和暗到亮,呼吸灯就是这样渐变的
u16 led_dt=0;
RCC_Configuration();
TIM_GPIO_Config();
PWM_Mode_Config();
while(1)
{ delay_nms(10);
if(led_fx==1)//
{led_dt++;}
else{led_dt--;}
if(led_dt>100)//下面程序的定时周期是100,所以led_dt加到100就自减到0,也就是pwm输出高/低电平持续时间的长短,
led_fx=0;
if(led_dt==0)
led_fx=1;
TIM_SetCompare1(TIM4,led_dt);//把led_dt的值送到定时器4的CCR寄存器中改变占空比,就是后面提到的跳变值pulse } }
void TIM_GPIO_Config(void)//配置的是PB6端口的复用推挽输出,因为输出PWM波
{ GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO;_InitStructure); }
void RCC_Configuration(void)
{ SystemInit();//初始化系統时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能端口B时钟和复用功能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); } //使能定时器时钟
void PWM_Mode_Config(void)
{ u32 CCR2_Val;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 1; //预分频器为1就是定时器的工作频率为36M,否则(为0或者其他的数时,TIMclock=72M/(pres+1))为72M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_Period =99; //36M/(99+1)=360K
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInit(TIM4,&TIM;_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //允许输出
TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //跳变值,当计数器的值小于此值时,输出电平极性发生跳变,即决定占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //小于设置的跳变值时输出低电平
TIM_OC1Init(TIM4, &TIM;_OCInitStructure);//初始化捕获比较寄存器
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能捕获比较重装载
TIM_ARRPreloadConfig(TIM4, ENABLE);//使能重装载,可以连续输出
TIM_Cmd(TIM4,ENABLE); } //使能定时器
通过上面运行我们就可以实现LED呼吸灯的闪烁。
4 经验总结
通过这次实验是我对STM32有了更深的认识,得出了很多道理,“心动不如行动”。一个看似简单的事情,要动手把它做好设计出来是比较困难的,所以我们要在以后的学习和工作中要有坚2的毅力和坚定的信念。这就要求我们在平时的学习中,把课堂上所学到知识和实践结合起来,只有这样我们才能德才兼备,同时用过这次的实验,使自己巩固了上课老师讲的知识,从而使我把理论与实践真正结合起来。使我明白了做事情之前要有自己的想法,弄明白理论和时间是相结合的,只有把理论的知识学扎实才能实践起来行云流水。这次的实验过程中有许多问题,只有在认真的分析之后知道原因所在才能解决问题的根本,每做完一次实验都要有自己的相关总结,这样才能把实验做得更好。在老师的教导下,这学期的课程设计中,我不仅培养了独立思考,动手操作的能力。知道了解决问题的方法不止一种,让我是受益匪浅。
参考文献:
[1] 廉佐政,王海珍.基于STM32的PWM输出实验设计[J].实验技术与管理,2017,34(8):137-140.
[2] 刘松斌,王海星,李硕恒.基于STM32的直流电机PWM调速系统[J].化工自动化及仪表,2016,43(8):834-837.
[3] 洪俊峰,卜文强,张榕鑫,等.基于STM32 PWM的正弦信号发生器设计[J].合肥工业大学学报:自然科学版,2014,37(2):188-191+224.
[4] Hui-fu Zhang,Wei Kang. Design of the Data Acquisition System Based on STM32[J]. Procedia Computer Science,2013,17:.
[5] 田立东,周继军,秦会斌.PWM调光LED驱动器设计[J].机电工程,2012(4).
[6] 骆祖国,陈渊睿.高效LED照明驱动及智能调光电路设计[J].微处理机,2011(2).
[7] 胡山,段海龙,任淑艳,等.基于ARM的LED自适应调光系统设计[J].现代科学仪器,2010(6).
[8] 王学文. 具有灵感的呼吸灯[N].电子报,2016-01-31(11).