一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期
每次中断,变量a加1,并且a与另一变量b比较,如果a<b,让某一管脚输出高电平,如果a>=b,则让其输出低电平,a等于100时清0,这样占空比是b/100,改变b的值,就可以改变占空比
缺点定时器定时时间不能太短,例如10us中断程序根本执行不完,若占空比调节精度要求较高,如要求百分之一,则a需大于100,这样PWM波的周期就比较大,频率比较低
两个定时器,如一个定时器0定时100us,另外一个定时器1定时小于100us,如b
us
定时器0中断时输出高电平,并打开定时器1,定时器1负责置低电平
这样,就可以产生周期100us,占空比是b/100的方波
频率可以比用一个定时器高一些
给个我自己写的程序你,我试过了,通过!#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
P0_0=P0^0
uchar
a
/*********************************************
*
TH0和TL0是计数器0的高8位和低8位计数器,
*
计算办法:TL0=(65536-C)%256
*
TH0=(65536-C)/256,
*
其中C为所要计数的次数即多长时间产生一次中断;
*
TMOD是计数器工作模式选择,0X01表示选用模式1,
*
它有16位计数器,最大计数脉冲为65536,最长时间
*
为1ms*65536=65.536ms
*
*********************************************/
void
init_sys(void)
/*系统初始化函数*/
void
main
(void)
{
init_sys()
while(1)
}
void
init_sys(void)
{
TMOD=0x01
TH0=(65536-10000)/256
TL0=(65536-10000)%256
EA=1
ET0=1
TR0=1
}
void
timer0(void)
interrupt
1
{
TH0=(65536-100)/256
TL0=(65536-100)%256
a++
if(a<=3)
{
P0_0=1
if(a==3)
//改变低电平持续时间
{
//也即改变占空比
P0_0=~P0_0
}
}
else
{
P0_0=0
if(a==5)
//改变周期
{
a=0
}
}
}
你是说8051吗?这种没有PWM的单片机,如果需要实时调节电机的转速可以使用定时器来解决。先决定电机调速的PWM的基频,比如200Hz,那么定时器0取5ms一次中断。在定时器0内开启定时器1,而定时器1的定时时间长短内参数 PWM来决定,定时器1的初值决定输出的脉宽,定时器0的内容:
TH0=(按实际所需PWM基频计算得到。
TL0=
P1_7=0//防止定时器1没能发生中断造成输出常高。
T=5-pwm,//T先在前面定义下,这里的5是假设定时器0 5ms中断一次,pwm的取值在于这里的运算方式,
TH1=T/256//转换为定时器1的初值
TL1=T%256+10//这里+10是保证定时器1在定时器0之前发生中断。
TR1=1 //开启定时间器1
P1_7=1//输出高电平 假设1.7脚为输出脚
定时器1的内容
TR1=0//关闭定时器1,
P1_7=0//输出低电平。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)