单片机产生PWM波形波形的方法:
主要是采用软件控制,控制2个时间。
具体就是由单片机的引脚输出PWM波形;单片机引脚 如P1.7 控制其输出高电平的时间T1 和输出低电平的时间T2。
PWM波形的周期T=T1+T2
PWM波形的占空比=(100T1/T)%
PWM波形实现的算法:
1 根据PWM波形的频率f,计算出PWM波形的周期T=1/f;
2 根据PWM波形的占空比 计算出高电平时间 T1=占空比×T
3 计算出低电平时间 T2=T-T1
4 按上述时间去控制 单片机引脚高低电平的时间就可以了。
呵呵 赶快自己写程序吧 别忘了给俺加分呀
有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:
#includereg51.h
unsigned char pwhh,pwhl,pwlh,pwll;
bit flag;
sbit pwm=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=pwhh;
TL0=pwhl;
}
else
{
TH0=pwlh;
TL0=pwll;
}
pwm=~pwm;
}
main()
{
TMOD=0x01;
pwhh=(65536-1000)/256;
pwhl=(65536-1000)%256;
pwlh=(65536-500)/256;
pwll=(65536-500)%256;
TH0=pwhh;
L0=pwhl;
TR0=1;
ET0=1;
EA=1;
while(1);
}
3路PWM波,频率100HZ,周期为10ms,这个应该很简单吧,用定时器进行定时0.1ms中断一次,100次为一循环,这样周期为10ms。相位差和为360,最简单的是,第1个方波比第2个差120,第2个比第3个差120,第3个比第1个差120。也就是说在第0ms第1个方波启动,第3.3333...ms第2个方波启动,6.66666ms第3个方波启动,而到10ms第1个方波第二个周期又开始启动。这只是最简单的,其实只要满足a b c三个方波启动时间刚好加起来等于10ms就可以。
回到定时器,程序你设定3个变量,a b c,其中a b c的初值分别用来表示第1 2 3方波的相位差,判断a b c的范围来确认三个方波的占空比。设置0.1ms中断,变量初值a=0 b=33 c=66每次中断a b c 分别++,当a=100 b=100 c =100,a=0 b=0 c=0。
主函数,设置3个IO口,PWM1 PWM2 PWM3,if(0a50);(PWM1==1);else;PWM1==0; if(0b50);(PWM2==1);else;PWM2==0; if(0c50);(PWM3==1);else;PWM3==0;其中a b c的取值范围就是占空比的值(1~99)。
注:1、因为a b c初值不同,所以相位差在初值就体现出来了。2、也可不用中断,判断定时器溢出位也可。3、想要更精确可以定时0.01ms,变量设定1000个。
以上也是我自己凭空想的,没实际实验,你可以试试!
一个定时器就能搞定
#includereg51.h
#includeINTRINS.h
#define u16 unsigned int
#define u8 unsigned char
sbit pwm1=P1^0;
sbit pwm2=P1^1;
sbit pwm3=P1^2;
u8 jsflag;
u8 pwm[3]={0,100,200};//三路pwm的值,范围为0-200
void init() //初始化函数
{ TMOD|=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()//主函数
{
init();
while(1);
}
void timer0() interrupt 1//定时器,100us
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(++jsflag=200)jsflag=0;
pwm1=(jsflag=pwm[0]?0:1);
pwm2=(jsflag=pwm[1]?0:1);
pwm3=(jsflag=pwm[2]?0:1);
}
1、程序实现上应该不难,假设用3个8位变量来调节这三个灯,理想上可以得到256单色灰度效果。但通常能做到16等级灰度,也能看到一定效果。
2、这三个PWM周期相同,占空比不同,亮度就各有不同。
3、确保单片机管脚输出1时(100%,或单独调节满刻度),三个LED灯的驱动电流均达到饱和。并且合成色为白色。且根据最佳观测距离,选择相应视角的灯管。并考虑其安装位置。
4、若为256等级灰度,总共有2^24个组合渐变。且渐变过程还有更多组合。建议16等级实现先。
5、三个for循环,逐个调节PWMR、PWMG、PWMB参量。在定时器的最小定时管理单元中逐个判断,是否达到翻转调节。并控制各LED的亮灭。
【以上纯属理论分析,程序及效果自行完成】
PWM EQU 7FH ;PWM赋初始值 OUT EQU P0 ;8个LED灯的接口
INCKEY EQU P3.2 ;K1,PWM值增加键。 DECKEY EQU P3.4 ;K2,PWM值减小键。
BEEP EQU P2.2
;----------------------------
ORG 0000H
SJMP START
ORG 000BH
SJMP INTT0
ORG 001BH
SJMP INTT1
ORG 0030H
;----------------------------
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;----------------------------
START:
MOV SP,#30H
MOV TMOD,#21H
MOV TH1,PWM ;脉宽调节
MOV TL1,#00H
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
clr p1.4
SETB EA
SETB ET0
SETB ET1
SETB TR0
LOOP: MOV A,PWM ;
JB INCKEY,LOOP1 ;增加键是否按下?
CALL DELAY ;延时去抖动
JB INCKEY,LOOP1
CJNE A,#0FFH,PWMINC ;是否到最大值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMINC:
INC PWM ;调节脉宽(脉宽减小)
SJMP LOOP
LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?
CALL DELAY ;延时去抖动
JB DECKEY,LOOP2
CJNE A,#02H,PWMDEC ;是否到最小值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMDEC:
DEC PWM ;调节脉宽(脉宽增加)
LOOP2: SJMP LOOP
;------------------------------
;T0中断服务子程序 (频率)
;控制定时器1中断
;------------------------------
INTT0:
CLR TR1
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
MOV TH1,PWM
SETB TR1
MOV OUT,#07fH ;启动输出
RETI
;------------------------------
;T1中断服务子程序 (脉宽)
;控制PWM脉冲宽度
;------------------------------
INTT1:
CLR TR1 ;脉宽调节结束
MOV OUT,#0FFH ;结束输出
RETI
;------------------------------
;10ms延时子程序
;------------------------------
DELAY:
MOV R6,#50
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
RET
;-----------------------------------------------
;蜂鸣器响一声子程序
;-----------------------------------------------
BEEP_BL:
MOV R6,#100
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
DELAY2: ;延时R5×10MS
MOV R6,#50
BL4: MOV R7,#100
BL5: DJNZ R7,BL5
DJNZ R6,BL4
DJNZ R5,DELAY2
RET
;---------------------------------------------------
END
你可以参考这个程序自己写写
单片机如何去写3种pwm的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机如何去写3种pwm