利用AT89C52定时器输出可调PWM
知识储备:
PWM即是脉宽冲宽度调制,也称脉宽调制,其意义就是通过微处理器的数字输出来对模拟电路进行调制的一种有效技术。
由于单片机只能输出高电平(1),或者低电平(0),因此对于类似正弦曲波等无法直接输出。因此需要通过控制高低电平的有效时间,用等效面积的方式输出曲波。
PWM:
- 通过改变脉冲列的周期可以调频;
- 改变脉冲的宽度或占空比可以调压
1.定时器:
51单片机中内置定时器有定时器0和定时器1,通过采用定时器中断的方式输出PWM波形,可不必占用CPU的内存。
定时器配置:
- 初始化函数:
//若使用函数方式初始化,记得在主函数中调用一遍
void Time0_Init(void) { TMOD=0x01; //采用方式1进行定时 TH0=(65536-1000)/256; //定时器计数值高位写入 TL0=(65536-1000)%256; //低位写入 ET0=1; //使能定时器0中断允许位 TR0=1; //使能定时器0 EA=1; //使能中断允许位 }
如若是定时器1配置:
只需将其中的:
TH0换为TH1
TL0换为TL1
ET0换为ET1
TR0换为TR1
方式零计数:13位计数器 2^13=8192
方式一计数:16位计数器2^16=65536
写入计数值:
51单片机的晶振是12Mhz,因此机械周期是1us,即是说定时每1us计数一次,因此当我们要写入计数值是可以这样:
定时器(例选用方式一计数)计数到上限值时溢出(65536),因此假设我们要每1ms进入中断一次,则可以:
1ms/1us=1000(次)------计数器要计数1000次
写入定时器的值就为(65536-1000),定时器将会从会从(65536-1000)这个数每1us自加1,累积1000次后刚好溢出65536,从而进入中断。
2.输出PWM波形
要想输入PWM波形要确定两个值:周期和阈值
在固定周期内,低于阈值时间输出高(低电平),高于阈值时间输出低(高)电平,从而形成一定的矩形脉冲
通过调节阈值的大小即可确定高(低)电平的占空比
配置:
unsigned char variable; //时间t变量
unsigned char threshold; //设置的阈值
sbit output=P2^1;
//输出PWM波形的管教
if(variable<threshold) { output=0; } else if(variable>=threshold1) { output=1; }
//将上述步骤通过函数实现
while(variable==100) { variable=0; }
3.定时器中断服务函数的编写
通过2中所述如何实现输出PWM的方式,将其封装进定时器函数
编写定时器中断服务函数前需要知道中断号:
中断号: 定时器0:1
定时器1:3
void Time0(void) interrupt 1 //不用调用 { TH0=(65536-1000)/256; //每次进入定时期中断都会更新定时值 TL0=(65536-1000)%256; if(variable<threshold) { output=0; } else if(variable>=threshold1) { output=1; }
while(variable==100) { variable=0; } }
输出PWM的大体函数编写完毕,具体使用功能请各位自行编写~~