单片机应用于舞台灯光、民用照明的调光、转速、温度控制等众多领域时需要用到PWM占空比进行调节。市场上,集成了硬件PWM模块的单片机型号如PIC16F628A、C12C2052等。使用硬件PWM时仅需进行一些特殊功能寄存器的设置,使用方便。但硬件PWM输出路数往往较少,如果要增PWM的输出路数则会使产品成本上升,较难适应于价格敏感的产品上。如:PIC16F628A、STC12C2052仅具有两路PWM输出。舞台光通常要到用三路PWM信号调光(三路分别控制红、绿、蓝三基色进行组合搭配出不同色彩)。因此软件实现PWM是较为合理的选择。
在舞台灯光厂做了这么久,虽然明白软件PWM的原理,但就是弄不清它们的关系,一直写不出比较好的软件PWM程序。近日,一偶然的机会得到启发,写下这个程序和单片机爱好者分享。
程序如下:
AUXR EQU 8EH PWM1DATA EQU 60H PWM2DATA EQU 61H PWM3DATA EQU 62H PWM1DATA1 EQU 63H PWM2DATA1 EQU 64H PWM3DATA1 EQU 65H PWM1 EQU P0.5 PWM2 EQU P0.6 PWM3 EQU P0.7 ORG 0000H AJMP MAIN ORG 000BH AJMP MER0 ORG 0030H MAIN: CLR PWM1 MOV P0,#11H MOV ,#30H MOV AUXR,#01H CLR RS1 CLR RS0 MOV TMOD,#02H MOV TH0,#00H
MOV TL0,#00H MOV R2,#0F;R2用作PWM周期寄存器 MOV PWM1DATA,#0 MOV PWM2DATA,#85 MOV PWM3DATA,#170 MOV PWM1DATA1,PWM1DATA MOV PWM2DATA1,PWM2DATA MOV PWM3DATA1,PWM3DATA SETB EA ;开中断总控制 SETB ET0;开TO中断控制 SETB TR0 ;开始 计数
MAIN1: ACALL DEL INC PWM1DATA INC PWM2DATA INC PWM3DATA AJMP MAIN1 DEL: MOV R4,#05H D1: MOV R5,#0FFH D2: MOV R6,#0FFH DJNZ R6,$ DJNZ R5,D2 DJNZ R4,D1 RET
TIMER0: ;定时器中断 PUSH ACC TIMER001: MOV A,PWM1DATA1 JZ TIMER0011 SETB PWM1 DEC PWM1DATA1 AJMP TIMER002 TIMER0011: CLR PWM1 TIMER002: MOV A,PWM2DATA1 JZ TIMER0021 SETB PWM2 DEC PWM2DATA1 AJMP TIMER003 TIMER0021: CLR PWM2 TIMER003: MOV A,PWM3DATA1 JZ TIMER0031 SETB PWM3 DEC PWM3DATA1 AJMP TIMER004 TIMER0031: CLR PWM3 TIMER004: DJNZ R2,TIMER005 MOV R2,#0FFH MOV PWM1DATA1,PWM1DATA MOV PWM2DATA1,PWM2DATA MOV PWM3DATA1,PWM3DATA TIMER005: POP ACC R END
这个程序是基于STC89C52实现的。因为PWM的频率较低,所以当PWM控制的是LED时会有较大的闪动。如果要解决这个问题,则可以提高时钟频率。或使用工作速度更快的单片机,如STC12C2052可以设置为1时钟1机器周期,工作频率最高可达420MHZ。尽量不要改变定时器T0的初值(初值越小越好,最好为00H),因为如果单片机此时还要执行其它的任务(如串行通讯)时,T0的中断频率过高对软件PWM是致命的。
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。