王子權
(合肥工業(yè)大學,安徽 合肥 230009)
燈具伴隨著人們的日常生活,對于燈光亮度的調節(jié)也隨著科技的發(fā)展應運而生。普通的調光電路是將燈具與一個變阻器串聯,通過調節(jié)變阻器的阻值大小,達到對燈具的功率的調節(jié),變阻器會消耗一定的功率,而且隨著變阻器阻值的增大,燈具所具有的有效功率逐漸變小。PWM是脈寬寬度調制的簡稱[1],其控制簡單靈活,損耗小,方便使用[2],憑借它的開關頻率高,低速運行平穩(wěn),動態(tài)性能優(yōu)良[3]等特點,在電機調速方面得到普遍應用。STM32F103ZET6是STM32系列高端單片機的一種,集成了AD轉換與PWM輸出功能,可以直接進行數據采集和PWM輸出。由于STM32單片機需要對其功能進行配置才能正常使用,所以這也成為了其功耗低的一種機制,應用STM32單片機進行控制的場合越來越多。
圖1 典型PWM波形
脈沖寬度(PWM)調制,是一種周期一定而高低電平的占空比可以調制的方波信號[4],其波形如圖1所示。所以PWM的實質是以調節(jié)占空比來改變負載兩端的電壓平均值,電壓變化關系[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發(fā)生程序如下:
#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);/*使能預裝載*/}
圖2 調光器整體結構圖
調光器的整體結構如圖2所示,包括電位器,STM32單片機和負載電路組成。電位器是進行調節(jié)的控制始端,通過旋動電位器使其電阻值發(fā)生改變。STM32單片機對從電位器采集到的數據進行處理,得到Tset,并傳遞給TIM_SetCompare函數,從而得到一定的占空比,使負載端接收到一定占空比的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)進行相應的變化即可。
電位器是旋轉變阻裝置,通過變阻使電阻的兩端電位差產生變化,電路如圖3所示。試驗使用的電位器有三個引腳,其中兩端分別接VCC和GND,中間一端引出作為STM32的AD轉換輸入端,試驗裝置將電位器的輸出端連接到了GPIOA1引腳上。從圖3中可以看出,電位器輸出端輸出的是電壓信號,輸出電壓的取值范圍為0 V到3.3 V,當輸出電壓為0 V時,LED燈滅,LED燈的亮度隨著電位器輸出端的電位值的變化而變化。
STM32F103ZET6單片機是通用性基于ARMR的32位增強型微控制器,其引腳數目144個,具有512 k字節(jié)的閃存存儲器。STM32單片機對從電位器采集到的AD數據進行相應的處理,如比例線性處理以及復雜的非線性處理等,得到PWM的占空比值,通過得到的占空比,進行相應的PWM輸出。
圖4 LED發(fā)光原理
LED是利用半導體PN結或類似結構把電能轉化成光能的固態(tài)器件[6],發(fā)光原理如圖4所示。從圖4可以看出,只有給LED外加正向偏置的電壓,LED才會導通發(fā)光。
發(fā)光二極管的亮度可以通過工作電壓或電流的大小進行調節(jié),在很寬的工作電壓電流范圍內,發(fā)光二極管的發(fā)光亮度與工作電壓電流大小成線性關系。LED燈可通過串聯限流電阻直接與單片的IO引腳相連,試驗裝置將LED與GPIOC的GPIO_Pin_7引腳相連。所以控制GPIOC的GPIO_Pin_7引腳的PWM輸出即可獲得對LED的亮暗調節(jié)。
圖5 調光器程序流程圖
基于Eclipse開發(fā)平臺,設計實現了調光器的C語言代碼。程序流程包括:初始化(系統時鐘初始化、PWM初始化、ADC初始化)、數據處理過程和PWM輸出,如圖5所示。
Eclipse是基于Java的開源代碼可擴展開發(fā)平臺[7],為大型程序的開發(fā)提供了很大的便利,其代碼提示與補全功能深受大型軟件開發(fā)者的喜愛。Eclipse的可擴展功能使得開發(fā)者可以安裝許多外圍插件,也可以開發(fā)新的插件完成更多的功能[8],如基于Eclipse圖形建??蚣艿膱D形化脈沖序列設計軟件[9]。Eclipse的代碼提示功能如圖6所示。
圖6 Eclipse代碼提示功能
STM32時鐘配置:使用外部8 MHz晶振;系統時鐘SYSCLK為72 MHz;外設時鐘HCLK為72 MHz;外圍總線APB1為36 MHz;外圍總線APB2為72 MHz。STM32在系統時鐘為72 MHz下的工作穩(wěn)定可靠,運算速度較快,其時鐘配置函數可直接調用庫函數SystemInit()即可完成上述時鐘配置。
基于STM32F103ZET6開發(fā)板進行調光器的驗證試驗,設置LED燈調光級為1 000,即m=1 000,單片機從電位器采集的AD數據每50個作為一個樣本,設置比例系數k=0.5,1,2,進行3次調光器試驗,如圖7所示。試驗結果表明PWM隨著電位器的調節(jié)而有不同的輸出,在調光級為1 000時,LED燈具有光滑的亮暗變化。
圖7 調光器試驗板
試驗測得數據如表1所示,當比例系數k發(fā)生變化時,電位器的控制電壓范圍和LED電位值也會發(fā)生變化: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 調光器試驗數據
基于STM32的PWM多級調光器,將電位器與LED相對地隔離開來,從而可以保證LED的有效功率,降低串聯電阻的功耗。式(4)表明了調光器的調光級數只與PWM的一個周期值m有關,通過設置m的值可獲得m級調光。試驗程序在Eclipse環(huán)境下進行編寫,在1 000級調光的試驗結果中,表明了LED具有平滑的亮暗變化。該裝置設計思想同樣可應用于電機調速,臺燈、路燈等的調光等,實現弱電控制到強電執(zhí)行的變換。