单片机产生SPWM课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计
基于89C52单片机SPWM波形发生器
摘要
本系统由89C52单片机控制模块、滤波和稳压模块组成。

利用Matlab计算SPWM脉冲序列占空比,采用查表方式,控制双极性SPWM控制脉冲序列的输出。

关键字:单片机Matlab 查表SPWM
1设计目的和要求
设计并制作一套单相SPWM触发脉冲电路,掌握SPWM算法和硬件实现方法,理解驱动电路功能。

①采用双极调制算法,产生一个7脉冲SPWM触发脉冲,并用单片机数字化近似实现;
②完成拓展硬件电路,软件编程和调试;
③具有2ms死区设计;
④低次谐波较少;
2设计方案
本系统以89C52单片机为控制核心,由查表法通过定时器产生SPWM波,系统设计框图如下:
输出
图1 设计框图
3 理论分析和计算
SPWM采用频率数倍于正弦波的三角波调制正弦波,可得到近似于正弦波的输出。

三角波的频率越高,即载波比越高,谐波的频率就越高,输出端滤波器就更容易去除谐波。

查表就是通过计算得到脉冲序列中每一个矩形脉冲周期内高低电平持续时间,c语言编程时用数组来表示,通过编写对应程序来查表进而控制输出端口高低电平时间及转换,从而产生SPWM波。

图2 SPWM原理图
利用Matlab计算SPWM脉冲序列占空比
MATLAB是一个高级的数学分析与运算软件,具有强大的计算功能。

SPWM控制通过MATLAB进行分析和设计,可取得事半功倍的效果。

采用MATLAB可方便地得到正弦波与三角波的交点。

在判断交点时,可通过交点的数学定义来判断。

所谓交点,就是在交点附近时刻两函数之差值的绝对值趋于0或许某一精度,而在交点附近的极小区域,离交点越远,差值的绝对值逐渐增大。

3Matlab计算程序
以下子程序为计算交点的MATLAB程序。

基波数据L2 =4*sin(2*pi*f*x)/5,载波数据L1=sawtooth(2*pi*9*f*(x+1/1800),0.5),t(j)为交点时刻数据。

% 设置
clc;
prec = 0.00001; %精度
f=50;
step = 0.00000001;
start = 0;
;
% plot
x=start:step:stop;
L1=sawtooth(2*pi*9*f*(x+1/1800),0.5);
L2 =4*sin(2*pi*f*x)/5;
plot(x,L1,'red',x,L2,'blue');
legend({'L1','L2'},'location','NorthWest');
title({'曲线交点图',
'L1=sawtooth(2*pi*9*f*(x+1/1800),0.5)','L2=4*sin(2*pi*f*x)/5'});
xlabel('x');
ylabel('y');
%找交点
jCount = 0;
t=0;
j=0;
for i=1:length(x)
if(abs(L1(i)-L2(i)) <prec)
jCount = jCount + 1;
j=j+1;
t(j)=x(i);
display(strcat('第',num2str(jCount),'交点是:'));
if jCount==1
display(strcat('(',num2str(x(i)),',',num2str(L1(i)),')')) else
X=2^16-(t(j)-t(j-1))*10^6;%计算定时器初值
HEX=dec2hex(round(X),4);%将初值化为十六进制
display(strcat('(',num2str(x(i)),',',num2str(L1(i)),'),第
',num2str(jCount),'与',num2str(jCount-1),'交点电平持续时间:
',num2str(t(j)-t(j-1)),'ms,','定时器初始值:',num2str(HEX)));
end
lh = line([x(i) x(i)],[min(min(L1),min(L2)) L1(i)]); %横坐标
set(lh,'color','green');
set(lh,'LineStyle','--');
text(x(i),L1(i),strcat('P_',num2str(jCount),'(',num2str(x(i)),',',num 2str(L1(i)),')'));
end
end
3Matlab运行结果
>>第1交点是:
(0,0)
第2交点是:
(0.00097685,0.24167),第2与1点电平持续时间0.00097685ms,定时器初值:FC2F
第3交点是:
(0.0025405,0.57283),第3与2点电平持续时间0.0015636ms,定时器初值:F9E4
第4交点是:
(0.0029758,0.64361),第4与3点电平持续时间0.00043531ms,定时器初值:FE4D
第5交点是:
(0.0048886,0.79952),第5与4点电平持续时间0.0019128ms,定时器初值:F887
第6交点是:
(0.0051114,0.79952),第6与5点电平持续时间0.00022276ms,定时器初值:FF21
第7交点是:
(0.0070242,0.64361),第7与6点电平持续时间0.0019128ms,定时器初值:F887
第8交点是:
(0.0074595,0.57283),第8与7点电平持续时间0.00043531ms,定时器初值:FE4D
第9交点是:
(0.0090232,0.24167),第9与8点电平持续时间0.0015636ms,定时器初值:F9E4
第10交点是:
(0.01,0),第10与9点电平持续时间0.00097685ms,定时器初值:FC2F
第11交点是:
(0.010977,-0.24167),第11与10点电平持续时间0.00097685ms,定时器初值:FC2F 第12交点是:
(0.01254,-0.57283),第12与11点电平持续时间0.0015636ms,定时器初值:F9E4 第13交点是:
(0.012976,-0.64361),第13与12点电平持续时间0.00043531ms,定时器初值:FE4D 第14交点是:
(0.014889,-0.79952),第14与13点电平持续时间0.0019128ms,定时器初值:F887 第15交点是:
(0.015111,-0.79952),第15与14点电平持续时间0.00022276ms,定时器初值:FF21 第16交点是:
(0.017024,-0.64361),第16与15点电平持续时间0.0019129ms,定时器初值:F887 第17交点是:
(0.01746,-0.57283),第17与16点电平持续时间0.00043531ms,定时器初值:FE4D 第18交点是:
(0.019023,-0.24167),第18与17点电平持续时间0.0015636ms,定时器初值:F9E4 第19交点是:
(0.02,0),第19与18点电平持续时间0.00097685ms,定时器初值:FC2F
图3 Matlab运行结果图
3.3单片机电平时间间隔表
由MATLAB计算结果可以得出下表:
十进制电平时间间隔表:
976 1563 435 1912 222 1912 435 1563 976
976 1563 435 1912 222 1912 435 1563 976
十六进制定时器初值表:
FC2F F9E4 FE4D F887 FF21 F887 FE4D F9E4 FC2F
FC2F F9E4 FE4D F887 FF21 F887 FE4D F9E4 FC2F
4单片机程序设计
4.1程序设计流程图
图4 程序流程图
4.2C语言实现程序
4主程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
int i=0;
char flag=0;
sbit P10=P1^0;
sbit P17=P1^7;
sbit P20=P2^0;
//近似
int
a[]={1000,1000,1900,200,1900,500,1500,1000,1000,1500,500,1900,200,1900,500,1500 ,2000};
//精确
int a1[]={976 1563 435 1912 222 1912 435 1563 976 976 1563 435 1912 222 1912 435 1563 976};
void main()
{
P10=0;
P17=0;
IE=0x82;
TMOD=0x01;
TH0=(65536-a[i])/256;
TL0=(65536-a[i])%256;
TR0=1;
while(1)
{
if(flag==1)
{
flag=0;
P17=~P17;
P20=~P20;
}
}
}
4中断程序
void timer0() interrupt 1
{
i++;
if(i==18) i=0;
TH0=(65536-a[i])/256;
TL0=(65536-a[i])%256;
flag=1;
}
5电路设计
图5 单片机主控电路
图6 电源模块
图7 双极性pwm转换电路
6测试和结果
测试过程
使用直流稳压电源,示波器,万用表以及低通滤波器进行测试
图8 测试环境
使用低通滤波器对输出电压进行处理
图9 滤波过程正负12V直流电源供电
图10 供电电源
低通滤波的截止频率较低时的输出波形
图11 实验波形Ⅰ含有少量杂波的输出波形
图12 实验波形Ⅱ
截止频率较大时的输出波形
图13 实验波形Ⅲ含有少量杂波的输出波形
图14 实验波形Ⅳ
黄色为使用较低截止频率的滤波器后的输出波形
图15 实验波形Ⅴ
使用较高截止频率的滤波器测试结果
蓝色为SPWM波形,黄色为使用较高截止频率的滤波器后的输出波形
图16 实验波形Ⅵ
使用非常高的截止频率的滤波器测试结果
蓝色为SPWM波形,黄色为使用非常高的截止频率的滤波器后的输出波形
图17 实验波形Ⅶ
图18 实验波形Ⅷ
7测试结果分析
偏差原因:在定时器中断服务程序中查表赋定时的初值,占用时间较多,导致定时不准确;另外,测试仪器本身存在测量误差。

8体会和收获
经过两周的课程设计,我们对SPWM波形产生的原理有了深入的了解,通过查找课本及其它资料,我们都对知识有了一个很好的复习和整合,并且了解到各种元器件使用方法,在理论实践方面增加了更多的经验。

虽然在整个设计的过程中我们曾遇到不少的困难,但是小小挫折等于鼓励,我们小组通过查阅资料和讨论一点一点地把问题给解决掉。

另外通过这次设计,我们更加认识到团队合作的重要性。

我们小组四人分工合作,密切配合,很好地发挥了团队合作精神,最终完成了课程设计。

当然,我们的设计肯定有不足之处,希望老师批评指正,下次一定会做得更好。

这次课程设计让我们获益良多。

相关文档
最新文档