|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
: b4 y& f; `7 S5 I6 ^用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
) V z: D- A5 k下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。1 K" V4 c! N; w( L
因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:
4 _5 e: g+ M. S4 P" N: K3 z0 S
. ^% z: Y. T9 y- z2 b& v# t2 V' N1、当time>=100时,time清零(此语句保证频率为1kHZ);
4 _( n/ k# P' l* N p& a+ ?0 n" A# m9 L
, ?- j& a: b3 W0 ~
2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;
6 L9 r! O: I; |) {# g8 s4 G( Q' O1 X
7 [, f! @/ L/ P. X8 o1 |3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。
6 |# l; ~9 C. y; q
( A Y2 `% I% B( X! R+ `* y. b# {1 }- _
下面程序产生30%占空比的pwm:# J+ L' t9 {2 h0 F
9 _5 z9 V/ c9 Y" o5 c* b; h
% v' U4 i" \4 R4 l: z
8 Q& I* K) U. b2 @# I7 u; f% i& Y- #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;
- }
# w0 ]' }( e; Q3 {. ]7 d$ W8 ~' i # N7 [3 h0 O1 S, ~* T6 J
[color=rgb(51, 102, 153) !important]复制代码
' U! |8 _! w7 |# S[color=rgb(51, 102, 153) !important]. t- m- M9 @& Z& @" Z: P4 X
3 p! o$ e# F. G" [
| 4 H3 Y+ x; {' \' z! [8 M' E3 Z
|
|