要求:
设计一个简易 PWM 信号发生器,利用两个按键来进行调节 PWM 信号 的占空比,同时使用液晶显示 PWM 信号的目前占空比,并且能够通过 AT24C02 芯片将 当前的 PWM 信号的占空比设置参数保存,以便在掉电之后,下次上电时能够进行读取上次的数据,进行掉电储存的功能。并且之后通过示波器进行 PWM 输出的显示以及占空比的测量。
仿真:
分析:仿真中通过 P1.6 和 P1.7 两个按键来作为调整 PWM 信号的占空比,P2.7 引脚输出 PWM 信号并且通过示波器来显示波形,频率计显示当前 PWM 信号的频率,电压探针来 计算模拟电压的数值。通过液晶来显示当前的占空比,D1 指示灯用来调试程序。
程序设计:
思路:检测按键按下,修改定时器中电平反转的时间,之后AT24C02保存当前翻转时间的参数,定时器移除之后触发中断,电平信号反转,输出PWM波---结果给液晶。
主函数:
#include "reg52.h"
#include "key.h"
#include "timer.h"
#include "lcd.h"
sbit led1=P1^4;
sbit led2=P1^3;
extern u8 t,step;
void main()
{
u8 num_1=0,num_2=0;
InitLcd1602();
Timer1Init();
LcdShowStr(1,0,"KS OF SJF PWM:");
LcdShowStr(1,1,"DR: %");
LcdShowStr(8,1,"STEP: %");
t=At24c02Read(2);
step=At24c02Read(1);
PWM =0;
led1 = 0;
led2 = 0;
while(1)
{
key_scan();
Lcd_numble(4,1,step,2);
- 18 -
Lcd_numble(13,1,t,2);
}
}
按键部分:用来调节占空比的
按键部分(调整占空比部分)
#include "key.h"
u8 t=10,step=1;
extern u16 k;
void delay(u16 x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<333;j++);
}
void key_scan()
{
if(KEY_step==0)
{
delay(10);
if(KEY_step==0)
{
step= step+1;
if(step==11) step=0;
At24c02Write(1,step);
}
while(KEY_step==0);
}
if(KEY_1 ==0)
{
delay(10);
if(KEY_1 ==0)
{
t = t+step;
if(t>=90) t=90;
At24c02Write(2,t);
}
while(KEY_1==0);
}
if(KEY_2 ==0)
{
delay(10);
if(KEY_2 ==0)
{
t= t-step;
if(t<=10) t=10;
At24c02Write(2,t);
}
while(KEY_2==0);
}
}
定时器部分:
#include "timer.h"
#include "lcd.h"
u16 k=0;
extern u8 t;
void Timer1Init()
{
TMOD|=0X20;
TH1=156;
TL1=156;
ET1=1;
EA=1;
TR1=1;
}
void Timer1() interrupt 3
{
k++;
if(k>100) k=0;
if(k<t) PWM =1;
else PWM =0;
}
仿真验证结果:
占空比为90%时:
占空比为50%时
电路图的绘制:
实物和结果展示:
占空比为10%时
占空比为50%时:
占空比为90%时:
误差分析:
当输出为 PWM 信号的时候,通过示波器显示的波形,PWM 波形,上下出现了部分 的过冲和毛刺。占空比显示基本误差很小,但是波形出现了失真和毛刺。推测误差来源为,可能是环境干扰和 BNC 线的不稳定,以及板子制作时过孔之间的电流的影响。以及晶振电路间,12MHz 晶振和 30pf 电容的工艺的误差,以及其他元器件之间的误差,线路之间流向的问题。