|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。1 `9 l. y8 o" @. R Q% Z- ]
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
; D# D0 ~" d! t下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。
2 ?# H, b" |4 E3 d' u6 k0 k) h" Z! B因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:
0 {' c! h8 F7 |, L' S1 H* Q% x
) D) e+ f4 @5 b& x! `3 l I* e9 J1、当time>=100时,time清零(此语句保证频率为1kHZ);
% z. m/ Q7 f" M% I2 t5 t
; Q) D# D6 C& C c! _8 g5 w8 X8 F* a; X# u; J( n% m
2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;
( y! I! R4 T+ t2 O" w: {! I& h; ~# n2 F
3 b# A6 H# i" R4 ~) P- P8 ~1 G3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。
' G1 W9 X0 ^6 ]0 w3 W, w9 S
: { }5 }7 f2 r; ^7 l5 C3 ^
. r; r: M, V: Y2 p% L) p! \下面程序产生30%占空比的pwm:
0 X0 L4 m1 u8 k3 N6 l2 x
$ l4 R7 A: N% J; E$ p9 x) K) x- O4 |% ^, ^* d; r
. n9 L; r# [4 Y+ d9 A( c- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
-
- sbit PWM=P2^0;// P2.0输出pwm
- uchar time; // 定义占空比的变量
-
- void main()
- {
- TMOD=0x01;//定时器0工作方式1
- TH0=0xff;//(65536-10)/256;//赋初值定时
- TL0=0xf7;//(65536-10)%256;//0.01ms
- EA=1;//开总中断
- ET0=1;//开定时器0中断
- TR0=1;//启动定时器0
- while(1)
- {
- }
- }
-
- void tim0() interrupt 1
- {
- TR0=0;//赋初值时,关闭定时器
- TH0=0xff;//(65536-10)/256;//赋初值定时
- TL0=0xf7;//(65536-10)%256;//0.01ms
- TR0=1;//打开定时器
-
- time++;
- if(time>=100) //1khz
- time=0;
- if(time<=30) //占空比%30,可改
- PWM=1;
- else PWM=0;
- }
5 Y- S4 M8 ?. K) u
1 ?, R! V3 C& C, w# a$ o, J[color=rgb(51, 102, 153) !important]复制代码
# h/ t! M6 l' z, l& J: R6 K. }, r[color=rgb(51, 102, 153) !important]
, V( s, J4 W0 ^& d4 X4 l
- Q4 z P( }6 E8 |: D' a" K* B4 z |
1 ]! H) ]4 z" k* N& Y3 c9 ? |
|