基于STM32的PWM调光器

2018-12-12 07:35王子权
电气自动化 2018年6期
关键词:电位器调光时钟

王子权

(合肥工业大学,安徽 合肥 230009)

0 引 言

灯具伴随着人们的日常生活,对于灯光亮度的调节也随着科技的发展应运而生。普通的调光电路是将灯具与一个变阻器串联,通过调节变阻器的阻值大小,达到对灯具的功率的调节,变阻器会消耗一定的功率,而且随着变阻器阻值的增大,灯具所具有的有效功率逐渐变小。PWM是脉宽宽度调制的简称[1],其控制简单灵活,损耗小,方便使用[2],凭借它的开关频率高,低速运行平稳,动态性能优良[3]等特点,在电机调速方面得到普遍应用。STM32F103ZET6是STM32系列高端单片机的一种,集成了AD转换与PWM输出功能,可以直接进行数据采集和PWM输出。由于STM32单片机需要对其功能进行配置才能正常使用,所以这也成为了其功耗低的一种机制,应用STM32单片机进行控制的场合越来越多。

1 调光原理

1.1 STM32的PWM调节原理

图1 典型PWM波形

脉冲宽度(PWM)调制,是一种周期一定而高低电平的占空比可以调制的方波信号[4],其波形如图1所示。所以PWM的实质是以调节占空比来改变负载两端的电压平均值,电压变化关系[5]见式(2)。

根据图1可得PWM波形的分段函数为:

(1)

式中:Tper为PWM的周期;Tset为PWM高电平时间;UH为PWM高电平电压值;UL为PWM低电平电压值;k为PWM谐波次数。

Uavr=α(UH-UL)+UL,(0≤α≤1)

(2)

式中:Uavr为负载两端平均电压;α为PWM占空比。由试验测得PWM的低电平时的电压值约为0 V,故可将式(2)化简为:

Uavr=αUH

(3)

在STM32中,定时器可以用来产生PWM输出,其中定时器1和定时器8可以产生最多7路PWM输出,除了定时器6和7不能产生PWM输出以外,STM32最多可以产生30路PWM输出,通过STM32的库函数即可配置产生PWM输出。

在STM32固件库的库函数中,TIM_Period为TIM_TimeBaseInitTypeDef结构体成员,表示为自动重装寄存器值,也就是PWM的一个周期值,TIM_SetCompare函数是选定定时器和设置占空比值的函数,根据式(3)可推算出STM32的PWM输出电压变化关系。

(4)

式中:n为TIM_SetCompare装载值;m为PWM一个周期值;T为单片机计数脉冲基本周期。试验使用定时器3产生PWM输出,PWM的一个周期值m在试验程序中直接就可以进行配置,其PWM发生程序如下:

#include "pwm.h"/*PWM初始化函数*/

void pwmInit(){

pwmTIM3Init();//TIM3初始化

pwmLEDInit();//LED初始化

pwmTIM3OCInit();//TIM3参数设置}

/*定时器3配置初始化函数*/

void pwmTIM3Init(){

TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;/*初始化TIMx的时间基数单位*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);/*使能定时器3时钟*/

TIM_TimeBaseInitStructure.TIM_Period=1 000;/*PWM在一个周期内的震荡次数周期*/

TIM_TimeBaseInitStructure.TIM_Prescaler=0;/*TIMx时钟频率除数的预分频值*/

TIM_TimeBaseInitStructure.TIM_ClockDivision=0;/*不进行时钟分割*/

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;/*定时器向上计数*/

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);/*初始化定时器3*/

TIM_Cmd(TIM3,ENABLE);/*必须使能定时器*/}

/*LED配置初始化函数*/

void pwmLEDInit(){

GPIO_InitTypeDefGPIO_InitStructure;/*初始化外设GPIOx寄存器*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*开启LED连接引脚的时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/*必须开启复用*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;/*定义LED连接引脚*/

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;/*设置GPIO推挽输出*/

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;/*设置选中管脚的速率*/

GPIO_Init(GPIOC,&GPIO_InitStructure);/*GPIO初始化

GPIO_SetBits(GPIOC,GPIO_Pin_7);/*设置LED引脚为高电平*/

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);/*必须完成完全映射*/}

/*定时器3的PWM配置初始化函数*/

void pwmTIM3OCInit(){

TIM_OCInitTypeDefTIM_OCInitStructure;/*初始化外设TIMx*/

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;/*选择定时器模式为TIM脉冲宽度调制模式1*/

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;/*使能输出比较*/

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;/*设置输出极性为低*/

TIM_OC2Init(TIM3,&TIM_OCInitStructure);/*2表示使用第二通道TIM_Channel_2*/

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);/*使能预装载*/}

1.2 系统整体结构

图2 调光器整体结构图

调光器的整体结构如图2所示,包括电位器,STM32单片机和负载电路组成。电位器是进行调节的控制始端,通过旋动电位器使其电阻值发生改变。STM32单片机对从电位器采集到的数据进行处理,得到Tset,并传递给TIM_SetCompare函数,从而得到一定的占空比,使负载端接收到一定占空比的PWM输出。

1.3 AD转换到PWM输出的映射

从电位器得到的AD数据与最终的PWM输出存在着映射关系,STM32就是完成映射的处理核心。根据映射关系的不同,有线性关系和非线性关系,PWM的输出也有线性输出和非线性输出。

以线性输出为例,对AD数据进行算数平均值处理,建立比例线性模型,可得线性映射关系为:

(5)

式中:k为比例系数;n为从AD采样的数据个数;xi为从电位器采样的数据值。

从式(4)可以看出调光器的级数只与PWM的一个周期Tper有关,即只与m有关,试验设置m=1 000,即设置LED灯具有1 000级的亮暗变化。根据式(4)和式(5)可得电压变化关系:

(6)

图3 电位器电路

如果要对采集到的AD数据进行适当的处理,如减去最大值和最小值以及减去数据跳变值或进行非线性处理等,只要对式(5)进行相应的变化即可。

2 调光器硬件设计

2.1 电位器

电位器是旋转变阻装置,通过变阻使电阻的两端电位差产生变化,电路如图3所示。试验使用的电位器有三个引脚,其中两端分别接VCC和GND,中间一端引出作为STM32的AD转换输入端,试验装置将电位器的输出端连接到了GPIOA1引脚上。从图3中可以看出,电位器输出端输出的是电压信号,输出电压的取值范围为0 V到3.3 V,当输出电压为0 V时,LED灯灭,LED灯的亮度随着电位器输出端的电位值的变化而变化。

2.2 STM32F103ZET6单片机与LED

STM32F103ZET6单片机是通用性基于ARMR的32位增强型微控制器,其引脚数目144个,具有512 k字节的闪存存储器。STM32单片机对从电位器采集到的AD数据进行相应的处理,如比例线性处理以及复杂的非线性处理等,得到PWM的占空比值,通过得到的占空比,进行相应的PWM输出。

图4 LED发光原理

LED是利用半导体PN结或类似结构把电能转化成光能的固态器件[6],发光原理如图4所示。从图4可以看出,只有给LED外加正向偏置的电压,LED才会导通发光。

发光二极管的亮度可以通过工作电压或电流的大小进行调节,在很宽的工作电压电流范围内,发光二极管的发光亮度与工作电压电流大小成线性关系。LED灯可通过串联限流电阻直接与单片的IO引脚相连,试验装置将LED与GPIOC的GPIO_Pin_7引脚相连。所以控制GPIOC的GPIO_Pin_7引脚的PWM输出即可获得对LED的亮暗调节。

3 调光器软件设计与试验

3.1 调光器软件设计

图5 调光器程序流程图

基于Eclipse开发平台,设计实现了调光器的C语言代码。程序流程包括:初始化(系统时钟初始化、PWM初始化、ADC初始化)、数据处理过程和PWM输出,如图5所示。

Eclipse是基于Java的开源代码可扩展开发平台[7],为大型程序的开发提供了很大的便利,其代码提示与补全功能深受大型软件开发者的喜爱。Eclipse的可扩展功能使得开发者可以安装许多外围插件,也可以开发新的插件完成更多的功能[8],如基于Eclipse图形建模框架的图形化脉冲序列设计软件[9]。Eclipse的代码提示功能如图6所示。

图6 Eclipse代码提示功能

3.2 STM32时钟配置

STM32时钟配置:使用外部8 MHz晶振;系统时钟SYSCLK为72 MHz;外设时钟HCLK为72 MHz;外围总线APB1为36 MHz;外围总线APB2为72 MHz。STM32在系统时钟为72 MHz下的工作稳定可靠,运算速度较快,其时钟配置函数可直接调用库函数SystemInit()即可完成上述时钟配置。

3.3 调光器装置试验

基于STM32F103ZET6开发板进行调光器的验证试验,设置LED灯调光级为1 000,即m=1 000,单片机从电位器采集的AD数据每50个作为一个样本,设置比例系数k=0.5,1,2,进行3次调光器试验,如图7所示。试验结果表明PWM随着电位器的调节而有不同的输出,在调光级为1 000时,LED灯具有光滑的亮暗变化。

图7 调光器试验板

试验测得数据如表1所示,当比例系数k发生变化时,电位器的控制电压范围和LED电位值也会发生变化:k=0.5时,电位器控制电压为0~3.3 V,LED电位值为0~1.5 V;k=1时,电位器控制电压为0~3.3 V,LED电位值为0~3.3 V;k=2时,电位器控制电压为0~1.5 V,LED电位值为0~3.3 V。这与式(5)、式(6)建立的比例线性模型是吻合的。

表1 调光器试验数据

4 结束语

基于STM32的PWM多级调光器,将电位器与LED相对地隔离开来,从而可以保证LED的有效功率,降低串联电阻的功耗。式(4)表明了调光器的调光级数只与PWM的一个周期值m有关,通过设置m的值可获得m级调光。试验程序在Eclipse环境下进行编写,在1 000级调光的试验结果中,表明了LED具有平滑的亮暗变化。该装置设计思想同样可应用于电机调速,台灯、路灯等的调光等,实现弱电控制到强电执行的变换。

猜你喜欢
电位器调光时钟
别样的“时钟”
服务区LED照明调光算法探究
古代的时钟
Hepatitis C virus antigens enzyme immunoassay for one-step diagnosis of hepatitis C virus coinfection in human immunodeficiency virus infected individuals
全海深ARV水下LED调光驱动电路设计
浅谈公路隧道照明调光方案比选
基于单片机的大棚自动调光设计
有趣的时钟
Mixly开源项目设计10:用自制多量程欧姆表测量电位器的电阻
时钟会开“花”