我的第一篇博客
最近做了一些题目,想把他们记录下来,同时也作为我的第一篇博客,之后坚持一周发三篇吧
先发一个我做过的SPWM逆变电源吧
(只弄了仿真)
先发原理图
实现效果
可以看到实现了一个DC25V–AC36V的逆变
注意根据不同频率调整L1、C3、C4的值,
不然波形出不来或者产生的正弦波幅值很小
程序部分
#include "reg51.h"
#include <intrins.h>
#define uchar unsigned char
// uchar code spwm[200]={40,41,42,43,45,46,47,48,49,51,52,53,54,55,57,58,
// 59,60,61,62,63,64,65,66,67,68,69,70,70,71,72,73,
// 73,74,75,75,76,76,77,77,78,78,78,79,79,79,79,79,
// 79,79,80,79,79,79,79,79,79,79,79,78,78,77,77,76,
// 76,75,75,74,73,73,72,71,70,70,69,68,67,66,65,64,
// 63,62,61,60,59,58,57,55,54,53,52,51,49,48,47,46,
// 45,43,42,41,40,38,37,36,34,33,32,31,30,28,27,26,
// 25,24,22,21,20,19,18,17,16,15,14,13,12,11,10, 9,
// 9, 8, 7, 6, 6, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
// 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9,10,11,
// 12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,
// 30,31,32,33,34,36,37,38};
uchar code spwm[100]={40 ,43 ,45 ,47 ,50 ,52 ,55 ,57 ,59 ,61 ,
64 ,65 ,67 ,69 ,71 ,72 ,74 ,75 ,76 ,77 ,78 ,79 ,79 ,80 ,80 ,
80 ,80 ,80 ,79 ,79 ,78 ,77 ,76 ,75 ,74 ,72 ,71 ,69 ,67 ,65 ,
64 ,61 ,59 ,57 ,55 ,52 ,50 ,47 ,45 ,43 ,40 ,37 ,35 ,33 ,30 ,
28 ,25 ,23 ,21 ,19 ,16 ,15 ,13 ,11 ,9 ,8 ,6 ,5 ,4 ,3 ,2 ,1 ,
1 ,0 ,0 ,0 ,0 ,0 ,1 ,1 ,2 ,3 ,4 ,5 ,6 ,8 ,9 ,11 ,13 ,15 ,16 ,
19 ,21 ,23 ,25 ,28 ,30 ,33 ,35 ,37};
uchar count,m,i,j;
double c=0.5;
uchar flag;
sbit PWM1=P2^0;
sbit PWM2=P2^1;
void main()
{
m=0;
TMOD=0x02; //定时器0自动定时模式
TH0=256-10;
TL0=256-10; //50us自动定时器
EA=1;
ET0=1;
TR0=1;
count=40;
flag=1;
i=0;
while(1);
}
void time0() interrupt 1
{
m++;
if(count<=spwm[i])
{
PWM2=0;
_nop_();
_nop_(); //死区
PWM1=1;
}
if(count>spwm[i])
{
PWM1=0;
_nop_();
_nop_();
PWM2=1;
}
if(m==2)
{
i++;
if(i==100) i=0;
m=0;
}
if(flag==1)
{
count=count+10; //三角波
if(count==80) flag=0;
}
else
{
count=count-10;
if(count==0) flag=1;
}
}
程序是简单地将三角波与正弦波比较产生SPWM波形,也就是自然采样法,然后通过IR2101驱动MOS管。
大概就这些,一个简单的小项目。我没有实际弄过电路,感兴趣的可以做个电路试试可行性。