【报告】基于单片机的PWM波形发生器_第1页
【报告】基于单片机的PWM波形发生器_第2页
【报告】基于单片机的PWM波形发生器_第3页
【报告】基于单片机的PWM波形发生器_第4页
【报告】基于单片机的PWM波形发生器_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.唐 刚 2130401281 电气310张明洁 2130401266 电气310基于单片机的PWM波发生器(双路)目录1.题目理解 11.1.技术要求11.2.工作要求11.3.调压11.4.变流12.整体框图 13.工作原理 13.1.PWM原理23.2.系统主要构成24.工作过程 35.程序流程简图 36.主要模块说明 56.1.ADC0809 56.2.74HC138 56.3.ULN2803 66.4.74HC573 76.5.Digitron 86.6.晶振和复位86.7.AT89C52 97.原理图108.PCB图119.系统程序129.1.逐点比较法129.2.面积等效法179

2、.3.两个子函数 2310.总结26:基于单片机的PWM波形发生器(双路)1. 题目理解1.1. 技术要求(1)输出两路波;(2)波参数可以通过按键调整; (3)交互界面友好,布局合理大方;(4)五个功能按键。1.2. 工作要求(1)总体结构框图;(2)通过理论分析和计算选择电路参数;(3)根据功能要求,确定键盘控制功能;(4)根据原理图焊接电路板;(5)用Altium Desinger Winter 09画电路图与PCB图;(6)采用语言编写检测程序和应用程序并通过调试;(7)撰写设计报告和答辩PPT。PWM广泛应用于各行各业,两种典型代表分化出两种理解:1.3. 调压。通过调节占空q比调压

3、,占空比为q=0,输出电压U=0;占空比为q=100%,输出电压U=Umax。如直流斩波构成的直流脉宽调速系统。1.4. 变流。其中,逆变是PWM最先应用的领域。如用正弦信号调制出来的SPWM加在惯性环节上等效于正弦波,通俗来讲,就是调制一个正弦波。本组实现变流调制。2. 整体框图3. 工作原理3.1.PWM原理3.1.1. PWM最基本的理论基础:冲量相等而形状不同的窄脉冲加在惯性环节上,其效果基本相同。设采样后序列为x(n),一个正弦半波被分成若干份,每份脉宽Ns,则输出PWM脉冲宽度为:=x(Ns2)Ns所以,只要采出x(Ns2),然后让脉冲持续即可。3.1.2.PWM调制基础:用等腰三

4、角形波或锯齿波作为载波信号,对信号波进行调制。原理:信号波幅值大于载波输出高电平,直至信号波幅值小于载波。3.2.系统主要构成3.2.1. 信号发生器:产生信号波,如正弦波送入AD。设定为xt=2.2sin2ft+2.2电路板提供的参考电压约为4.6V,因为AD,且要求xt最大值必须小于PWM幅值。3.2.2. ADC:将送入的信号波采样,转换为单片机可以处理的离散序列xn。3.2.3. 单片机:处理序列、控制时序、协调芯片等。3.2.4. 示波器:将产生的PWM波输出观察。4. 工作过程信号发生器产生信号波,送入AD。单片机启动AD工作,选通到等,开始采集信号,输出离散序列至单片机。单片机接

5、收AD转换的离散序列,进行调制。调制方法有等效面积法、载波调制法两种。通过单片机处理之后调制出来脉冲序列,即PWM波。又经过74573锁存之后输出接示波器观察波形。5. 程序流程简图PWMYesWaitingHigh voltageLow voltageYesNoSW>=CW?NoAD converts over?InitializeStartSW: signal waveCW: carrier wave6. 主要模块说明6.1.ADC0809ADC0809主要信号引脚的功能:Ø IN7IN0模拟量输入通道 Ø ALE地址锁存允许信号。对应ALE上跳沿,A、

6、B、C地址状态送入地址锁存器中。 Ø START转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。Ø A、B、C地址线。 通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。 Ø EOC转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。 Ø D7D0数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相

7、连。D0为最低位,D7为最高  Ø OE输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。Ø Vref参考电源参考电压用来与输入的模拟信号进行比较。本项目信号波分两路输入:IN3、IN4。对应选通地址位分别为0x1ffb、0x1ffc而数据位则是0x03、0x04。D0D7挂总线输出,由单片机读取转换后的结果,输出范围0255。本项目由于接线原因,写入选通道地址和读出转换结果地址不一样,而且,总线的分时复用比较复杂,对本项目造成了极大的挑战。6.2. 74HC138本项目中38译码器

8、的功能是实现地址译码,由单片机P2口输出地址高八位,经38译码器译码输出。6.3.ULN2803ULN2803低电平驱动电流大,驱动蜂鸣器、数码管。逻辑上为集成非门。6.4. 74HC573八进制三态非反转透明锁存器。实验中多次用到74HC573锁存器,其作用是将D0D7逻辑锁存,Q0Q7输出。原理图中,U10为数码管段码寄存器,决定显示什么数字;U11为数码管位码寄存器,决定哪个数码管亮;两路PWM波由U14的Q0、Q1分别输出,分别接示波器观察。Ø LE:Latch Enable Input 锁存使能输入。Ø OE:3 State

9、 output Enable Input (Active LOW)3态输出使能输入。6.5. Digitron或Nixie tube,用于显示数字。本项目使用6位共阳极数码管,段码由U10驱动;位码由U11驱动。等效面积法中用于显示信号波被分割为若干份后每份间隔点数Ns;逐点比较法中用于显示锯齿波STW的周期点数。6.6.晶振和复位振荡电路是每个具有时序逻辑电路必不可少的重要角色。本项目采用晶振振荡电路,一般有并联式和串联式两种接法。显然本项目中使用的是并联式,振荡周期为11.0592MHz。本项目中有上电复位和手动复位。6.7. AT89C5

10、2核心器件,“中央处理”单元,芯片控制、数据处理等。 本程序原理图P0/P2口构成地址总线,P0口为双向数据总线。地址总线选通芯片,数据总线选通AD通道,接收AD转换数据以及PWM输出等等。晶振频率为11.0592MHz。INT0/INT1分别为外部中断信号,连接键盘,实现键盘的输入,对应T0/T1为高电平则为下降沿触发,反之为低电平触发。7. 原理图8. PCB图9. 程序代码两个共用Subfunctions: serial_initial.c、bDisplay.c。每种方法各一个主函数文件。9.1.比较调制法逐点比较法.c/*-Main body-*/*-Head files-*/#inc

11、lude<reg52.h>#include<stdio.h>#include<intrins.h>#include<absacc.h>/*-This is ending line-*/*-macro definitions-*/#define unchar unsigned char#define unint unsigned int#define unlong unsigned long/*-This is ending line-*/*-Chips and ports definitions-*/#define pwm XBYTE0xffff

12、/74573unsigned char xdata *ADC0809;/ADC0809/unsigned char xdata *HC_573;/控制蜂鸣器的74HC573地址sbit EOC=P16;sbit it_0=P34; /实际上it_0对应的按键S3类似电脑键盘shift键sbit it_1=P35; /同上/*-This is ending line-*/*-Variables definitions-*/unchar result=0;/outputs of ADunchar preResult=0;/outputs of ADunchar channel=0x03; /Cha

13、nnel #3;unlong Ns=20;/points of sawtooth wave(STW)unlong preNs=20;/previous Nsunlong i=0; /both i and j are used as indexunint j=0;unlong p=0;unlong temp=1;unchar pwmTemp=0;/store pwm for a while unchar pwm_4=0; /pwm of #3unchar pwm_3=0; /pwm of #4/*-This is ending line-*/*-Subfunctions-*/void selec

14、tChannel(unchar channel);void read(unchar readSignal);extern serial_initial();/extern getNs(unlong N);extern bDisplay(unlong x);/*-This is ending line-*/*-Main Function-*/void main() /*-preparations-*/ serial_initial(); bDisplay(preNs);/Activate all nixie tube(数码管) pwm=0xff;/set pwm high voltage /改1

15、 EX0=EX1=1;/允许外部中断0、1申请中断。 EA=1; /允许中断总开关 PX0=1; /higher priority PX1=0; /lower priority i=1;/*-This is ending line-*/ while(1) /*用于判断S3是否按下*/ if(it_0=0) IT0=0; /低电平触发else IT0=1; /下降沿触发/*用于判断S4是否按下*/if(it_1=0) IT1=0; /低电平触发else IT1=1; /下降沿触发/*-This is ending line-*/while(j<2)/*-converting-*/if(ch

16、annel=0x03)ADC0809=0x1ffb; /activate ADC0809;/*ADC0809=0x03; selectChannel(channel); /Select channel #3.C52 send a message of writing elseADC0809=0x1ffC; /activate ADC0809; selectChannel(channel); while(!EOC);/Waiting for EOC=1,conversion overADC0809=0X3FFF; read(0x04);/*-This is ending line-*/HC_57

17、3=0xBfff;/*if(Ns>55|Ns<10)*HC_573=0Xff;while(1);*/*HC_573=0X04;/Ns=getNs(Ns);/*-essence-*/if(Ns<2|Ns>80) Ns=15;if(Ns!=preNs)bDisplay(Ns);/display NspreNs=Ns;/printf("Ns:%Ldn",Ns);if(i>Ns) i=0;pwmTemp=0x01;/set pwm high voltage;elseif(result<=i*255/Ns)pwmTemp=0x00;/*else p

18、wmTemp=0x01;*/if(channel=0x03)pwm_3=pwmTemp;else pwm_4=pwmTemp;/printf("j:%Xn",j);channel=channel; /#3:011 #4:100/*if(channel=0x03)channel=0x04;elsechannel=0x03;*/j+;/*-This is ending line-*/j=0; /reset j=0pwm=(pwm_3<<1)+pwm_4; /pwm:0x00;0x01;0x02;0x03/*printf("pwm3:%Xn",pw

19、m_3);printf("pwm4:%Xn",pwm_4); printf("pwm:%Xn",pwm);*/i+; /next point/*-This is ending line-*/ /*-This is ending line-*/*-definitions of subfunctions-*/void selectChannel(unchar channel) *ADC0809=channel;/printf("Channel:%Xn",channel);void read(unchar readSignal) *ADC0

20、809=readSignal; result=*ADC0809; /0255/*-This is ending line-*/*-interrupt operating-*/void external_0(void)interrupt 0Ns+;/printf("i=%dn",i);void external_1(void)interrupt 2 /中断1居然不是interrupt 1,真是误导人呐!Ns+=-1;/printf("i=%dn",i);/*-all over-*/9.2.面积等效法PWM面积等效原理.c/*-Main body-*/*-H

21、ead files-*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include<absacc.h>/*-This is ending line-*/*-Macro definitions-*/#define unchar unsigned char#define unint unsigned int#define unlong unsigned long/*-This is ending line-*/*-Chips and ports definitions-*/#define

22、 pwm XBYTE0xffff /74573unsigned char xdata *ADC0809; /ADC0809/unsigned char xdata *HC_573; /控制蜂鸣器的74HC573地址sbit EOC=P16;sbit it_0=P34; /实际上it_0对应的按键S3类似电脑键盘shift键sbit it_1=P35; /同上/*-This is ending line-*/*-Variables definitions-*/unchar result=0;/outputs of ADunchar channel=0x03; /Channel #3;unlong

23、 Ns=20; /width of each pulseunlong preNs=20; /previous Nsunlong S=0; /area of each pulseunlong i=1; /both i and j are used as indexunint j=0;unint k_3=0; /indexunint k_4=0; /another indexunint delta=0; /width of pluseunint delta_3=0; /width of pluse of #3unint delta_4=0; /width of pluse #4/unchar pw

24、mTemp=0;/store pwm for a while unchar pwm_4=0; /pwm of #3unchar pwm_3=0; /pwm of #4/*-This is ending line-*/*-Subfunctions declaring-*/void selectChannel(unchar channel);void read(unchar readSignal);extern serial_initial();/extern getNs(unlong N);extern bDisplay(unlong x);/*-This is ending line-*/*-

25、Main Function-*/void main() /*-preparation-*/ serial_initial(); bDisplay(preNs); /Activate nixie tube(数码管) pwm_3=0x00; /set pwm low voltage pwm_4=0x00;/set pwm low voltage EX0=EX1=1; /允许外部中断0、1申请中断。 EA=1; /允许中断总开关 PX0=1; /higher priority PX1=0; /lower priority/*-This is ending line-*/ /*-do the task

26、 continuously-*/ while(1) /*用于判断S3是否按下*/ if(it_0=0) IT0=0; /低电平触发else IT0=1; /下降沿触发/*用于判断S4是否按下*/if(it_1=0) IT1=0; /低电平触发else IT1=1; /下降沿触发/*-This is ending line-*/while(j<2)/*-start sampling-*/if(j=0) /j=0<=>ADC0809=0x1ffb;/activate ADC0809;/*ADC0809=0x03; selectChannel(channel); /Select c

27、hannel #3.C52 send a message of writing else ADC0809=0x1ffc;selectChannel(channel); while(!EOC);/Waiting for EOC=1,conversion overADC0809=0X3FFF; /force AD to spit outputs read(0x04); /unnecessary and any number is welcome/i+=1;/*-This is ending line-*/if(Ns!=preNs) bDisplay(Ns); /display Ns on nixi

28、e tubepreNs=Ns;/store previous Ns/*-This is ending line-*/*-essence part-*/if(i=Ns/2) /if i=Ns/2,it means that C52 should creat a pluse/k_3=k_4=0; /S=result*Ns; /calculate areadelta=S/255; /and the pulse lasts deltaif(channel=0x03)pwm_3=0x01;delta_3=delta;k_3=0;/if k_3 increases to delta, the pluse

29、overelsepwm_4=0x01;delta_4=delta;k_4=0;/the same as k_3/*-This is ending line-*/*if(j=0)pwm_3=pwmTemp;else pwm_4=pwmTemp;*/printf("j:%Xn",j);channel=channel; /#3:011 #4:100/*if(channel=0x03)channel=0x04;elsechannel=0x03;*/ j+;/*-This is ending line-*/j=0; /reset j=0/*-This is ending line-*

30、/*-export pwm-*/if(k_3=delta_3)pwm_3=0x00;if(k_4=delta_4)pwm_4=0x00;pwm=(pwm_3<<1)+pwm_4; /pwm:0x00;0x01;0x02;0x03/*-This is ending line-*/if(i>=Ns) i=0;/*printf("pwm3:%Xn",pwm_3);printf("pwm4:%Xn",pwm_4); printf("pwm:%Xn",pwm);*/i+; /next pointk_3+;/increases

31、until delta_3k_4+; /increases until delta_4/*-This is ending line-*/ /*-This is ending line-*/*-definitions of subfunctions-*/void selectChannel(unchar channel) *ADC0809=channel;/printf("Channel:%Xn",channel);void read(unchar readSignal) *ADC0809=readSignal; result=*ADC0809; /0255/*-This i

32、s ending line-*/*-interrupt operating-*/void external_0(void)interrupt 0Ns+;/printf("i=%dn",i);void external_1(void)interrupt 2 /中断1居然不是interrupt 1,真是误导人呐!Ns+=-1;/printf("i=%dn",i);/*-all over-*/9.3.两个子函数serial_initial.c#include<reg52.h>#include<stdio.h>#include<ab

33、sacc.h>#define HC_573 XBYTE0xBfff/控制蜂鸣器的74HC573地址void serial_initial(void) SCON=0X52;TMOD=0X20;TH1=0XF3;TR1=1;HC_573=0X04;/Make beer silentbDisplay.c/*-A display function for farther use-*/*-this code originates from textbook-*/#include <reg52.h>#include <stdio.h>#include <absacc.h

34、>#include <intrins.h>#define SEGMENT XBYTE0x8000/段码寄存器地址#define BIT_LED XBYTE0xbfff/位码寄存器地址#define fosc 11.0592/晶振频率#define time02500/定时2500uSunsigned char data display_bit,display_buffer6;unsigned char data time0_h,time0_l;unsigned int data time0_times;unsigned long y;unsigned long a,b;uns

35、igned char get_code(unsigned char i);void display(void);/*Main body of function*/void bDisplay (unsigned long x) BIT_LED=0; /全灭(各位送0,经2803反向成1)TMOD=0x21;/定时器/计数器0定时方式1time0_times=65536-time0*fosc/12; /计算定时初值time0_h =(time0_times/256 );time0_l =(time0_times%256);TH0=time0_h; TL0=time0_l; /高8位和低8位时间常数

36、TR0=1;/启动定时器0EA=ET0=1;/允许中断display_bit=0x01; /从第一个数码管开始显示y=x;a=y/100000; /分离各位b=y%100000;display_buffer0=a;a=b/10000;b=b%10000;display_buffer1=a;a=b/1000;b=b%1000;display_buffer2=a;a=b/100;b=b%100;display_buffer3=a;a=b/10;b=b%10;display_buffer4=a;display_buffer5=b;/*while(1)PCON=0x01;*/void time0_int(void) interrupt 1/中断服务子程序TH0=time0_h; TL0=time0_l;display();/共需40m秒void display(void)unsigned char i;switch (display_bit) /根据亮哪一位,决定取哪个显示数 /即:display_bit?display_buffericase 1: i=0;break;case 2: i=1;bre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论