• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

PIC16F73做的逆变器程序及原理图,文件以上传

我给别人做的逆变器,功率50~4000w,实地作过样机,波形良好纯正弦波,带冰箱,洗衣机彩电没任何问题.具有过电流保护,稳压反馈,全单片机控制.希望大家能多提意见,共同学习.源程序为C语言,程序量大约1.5k.qq:382370905重新上传附件内有原理图,C源程序,PIC16F73文档,PROTEUS仿真文件.1158297630.rar

时隔这么多年,都忘记了这件事情了,今天看qq空间,才发现还发表了这个帖子。我是做仪表的,不是专业做电源的。对电源的理解很粗糙。而且我不是专业电源厂家,做这个程序和电源的目的也是给朋友帮忙,朋友也不是做电源的,也是个爱好者。看过了好多的回复。程序能不能用呢?肯定能用,但是要熟悉单片机的开发才可以,这么多年过去了,现在看以前的程序确实很粗糙。正如有网友所说,我走火入魔了,呵呵,其实只是第一次接触这个而已。就连PIC也是第一次使用,所以理解力是不够的,再说开发程序的时候连个仿真器都没有,完全都是自己凭着自己的想象力构建的,所以有错误或者理解偏差很正常。所以谈不上走火入魔,另外这个直接做产品问题很多,根本就是一个爱好者的处女做而已。希望大家多多包容吧。

全部回复(336)
正序查看
倒序查看
qghqgh
LV.6
2
2006-09-15 13:15
顶.
0
回复
wwwjjjwww
LV.2
3
2006-09-15 13:52
大家顶一下吧,我可是全部奉献给了大家了.



500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/56/891187394781.jpg');}" onmousewheel="return imgzoom(this);">
0
回复
qghqgh
LV.6
4
2006-09-15 13:56
@wwwjjjwww
大家顶一下吧,我可是全部奉献给了大家了.[图片]500){this.resized=true;this.width=500;this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}"onclick="if(!this.resized){returntrue;}else{window.open('http://u.dianyuan.com/bbs/u/56/891187394781.jpg');}"onmousewheel="returnimgzoom(this);">
文件下载不了啊.
0
回复
wwwjjjwww
LV.2
5
2006-09-15 14:05
重新上传1158306159.rar
0
回复
upsdian
LV.3
6
2006-09-15 15:02
@wwwjjjwww
重新上传1158306159.rar
还是下载不了啊!
0
回复
wwwjjjwww
LV.2
7
2006-09-15 15:47
为什么我上传的文件不对?
0
回复
upsdian
LV.3
8
2006-09-15 16:47
@wwwjjjwww
为什么我上传的文件不对?
要不,发到我的邮箱里吧.我也研究一下. linhua_23@163.com 谢了!
0
回复
qghqgh
LV.6
9
2006-09-15 17:10
@upsdian
要不,发到我的邮箱里吧.我也研究一下.linhua_23@163.com谢了!
现在论坛上的RAR文件都不能下载.怎么回事?
0
回复
houtao
LV.6
10
2006-09-15 19:34
@wwwjjjwww
重新上传1158306159.rar
不知这位兄台能否发一份给我,我现正在研究UPS.
0
回复
houtao
LV.6
11
2006-09-15 19:38
@houtao
不知这位兄台能否发一份给我,我现正在研究UPS.
给我来一份?
0
回复
2006-09-15 20:20
发一份给我吧!小弟在此先谢谢了.yypyesse@163.com
0
回复
hbzjcjw
LV.10
13
2006-09-15 20:23
@qghqgh
现在论坛上的RAR文件都不能下载.怎么回事?
给我传一份:hbzjcjw@sohu.com
0
回复
zhai_0099
LV.3
14
2006-09-15 22:26
@wwwjjjwww
为什么我上传的文件不对?
给我来1份:zgk_278@163.com 谢谢
0
回复
z123456
LV.4
15
2006-09-16 08:56
@wwwjjjwww
为什么我上传的文件不对?
贴出来,或转为文本文件
0
回复
grs998
LV.3
16
2006-09-16 10:57
给小弟一份!!
0
回复
zli
LV.7
17
2006-09-16 12:51
能不能给一份zlier1026@163.com
0
回复
zwg0106
LV.1
18
2006-09-16 12:51
过我一份吧
我的邮箱:zwg0106@163.com
Thank you!!!!!!
0
回复
hbzjcjw
LV.10
19
2006-09-16 20:45
敢问兄弟什么学历?小学?
0
回复
wwwjjjwww
LV.2
20
2006-09-18 09:16
//------------------------------------------------------------
//       spwm信号调制
//------------------------------------------------------------
#include
#include
//系统配置
__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTEN);
//打开看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护
//------------------------------------------------------------
//指示灯宏定义
#define L1_RED_ON   RB1=1;RB2=0;//L1红灯亮
#define L1_OFF   RB1=0;RB2=0;
#define L2_RED_ON   RB4=1;RB3=0;//L2红灯亮
#define L2_OFF   RB4=0;RB3=0;
#define L3_RED_ON   RB7=1;RB5=0;//L3红灯亮
#define L3_OFF   RB7=0;RB5=0;
#define L1_GREE_ON  RB2=1;RB1=0;//L1绿灯亮
#define L2_GREE_ON  RB3=1;RB4=0;//L2绿灯亮
#define L3_GREE_ON  RB5=1;RB7=0;//L3绿灯亮
//-----------------------------------------------------------
//模拟输入通道宏定义
#define AN0 CHS2=0;CHS1=0;CHS0=0;
#define AN1 CHS2=0;CHS1=0;CHS0=1;
#define AN2 CHS2=0;CHS1=1;CHS0=0;
//-----------------------------------------------------------
//-----------------------------------------------------------
void adc_init()
{
//ad时钟选择
ADCS1=1;//FOSC/32
ADCS0=0;
/*IF CPU IS PIC16F7X7
VCFG1=0;
VCFG0=0;//vref=vdd-vss
*/
PCFG0=0;
PCFG1=0;
PCFG2=0;//VREF=VDD-VSS
ADON=1;//打开ad模块
ADIF=0;//清除ad中断标志
ADIE=0;//打开ad模块中断
}
//-----------------------------------------------------------
void port_init()//端口初始化
{
//端口b设置
TRISB0=0;TRISB1=0;TRISB2=0;TRISB3=0;TRISB4=0;TRISB5=0;
TRISB6=1;//输入
TRISB7=0;//RB端口方向设置
PORTB=0;//输出0
RBPU=0;//使能内部弱上拉
INTE=0;//禁止RB0中断
RBIF=0;
RBIE=1;//允许RB端口电平变化中断
//端口c设置
TRISC=0X00;//PORTC are outputs
PORTC=0;//输出为0
RC1=RC2=0;
RC3=1;RC4=0;
//timer0 init
T0CS=0;//选择内部指令时钟
T0IF=0;
//T0IE=1;//在第一次ccp1比较后打开中断使能
//timer1
TMR1CS=0;//定时器模式
}
//----------------------------------------------------------
//----------------------------------------------------------
//软件延时子程序*/
void       DELAY()
{
unsigned int i;
   for(i=2000;i>0;i--);
}
//----------------------------------------------------------
void init_start()//开始
{
L1_RED_ON;L2_RED_ON;L3_RED_ON;
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
L2_OFF;L3_OFF;L1_OFF;
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
L1_GREE_ON;L2_GREE_ON;L3_GREE_ON;
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
DELAY();DELAY();DELAY();DELAY();
L2_OFF;L3_OFF;L1_OFF;
}
//----------------------------------------------------------
bit k,power;//关机及按键标志
bank1 unsigned char tm_sum;//系统实际变量
bank1 unsigned char ad_res_1,ad_res_0,ad_res_2; //ad转换结果寄存器
bank1 float  sin_am,sin_l,sin_d;//浮点数,幅值变量,临时变量,临时变量
bit sin_up;//sin函数正负半周标志
bit tmr_s,tmr_d,crut_ie;//定时标志,定时标志变化标志,电流延时保护允许
unsigned char crut_tmr;//电流延时时间变量
unsigned char power_s;//电源动作延时变量
bit power_ie;//电源允许动作标志
bit power_up;//初次开机标志
unsigned char power_up_s;//初次开机延时标志
bit crut_if;volue_if;
//-----------AD1通道转换--------------------
void ad_0()
{
AN0;//选择通道0
DELAY();//延时,采样电容充电
ADGO=1;//开器AD
while(ADGO);//等待ad结束
ad_res_0=ADRES;//结果转存到变量AD_RES_0
}
//-----------AD1通道转换--------------------
void ad_1()
{
AN1; DELAY();
ADGO=1;while(ADGO);
ad_res_1=ADRES;
if(ad_res_1>132){sin_am-=0.005;if((ad_res_1-132)>10)sin_am-=0.04; }
else
if((ad_res_1<=132)&&(ad_res_1>=130))sin_am+=0;
else
if(ad_res_1<130) {sin_am+=0.005;if((130-ad_res_1) >10)sin_am+=0.04;}
if(sin_am>1.6)sin_am=1.6;
}
//------------AD2通道转换-------------------
void ad_2()
{
AN2; DELAY();
ADGO=1;while(ADGO);
ad_res_2=ADRES;
}
//-------------------------------------------
const unsigned char sin_[]={40,50,73,85,100,113,127,141,157,170,180,189,196,200,203,
204,//正半周
204,//负半周
203,200,195,188,179,169,157,144,129,113,96,78,59,39,15};
unsigned char sin_num;//SIN函数表查表变量
//-------------------------------------------------------------------------------
void CCP_start()
{
CCPR2L=0X0;//设置CCP2,0%的脉宽输出
CCPR1L=0X0;//设置CCP1,0%的脉宽输出
TRISC=0X00;//PORTC are outputs
PR2=0Xff;//设置PWM的工作周期,16Mhz,PWM周期15.562khz
CCP1M3=1;CCP1M2=1;//CCP1模块PWM模式
CCP2M3=1;CCP2M2=1;//CCP2模块PWM模式
sin_up=1;//正负半周SIN函数
sin_num=0;//脉宽周期调整计数器
sin_am=0;//sin函数的幅值
sin_am=0.3000;//sin函数的幅值
crut_ie=1;//电流慢保护允许
}
//-------------中断服务程序------------------------------------
void interrupt key_ccp_timer()
{
if(TMR2IF&TMR2IE){TMR2IF=0;//定时器2中断服务函数
  if(sin_num==31){sin_num=0;sin_up=!sin_up;}
  sin_d=sin_[sin_num];
  sin_l=sin_am*sin_d;if(sin_l>=255)sin_l=255;//限幅
  if(sin_up)
  {CCPR2L=(unsigned char)sin_l;CCPR1L=0;}//换向
  else
      {CCPR1L=(unsigned char)sin_l;CCPR2L=0;}//换向
  sin_num++;
}
CLRWDT();//清除看门狗
if(RBIF&&RBIE){RBIF=0;if((!RB6)&&power_ie)k=1;}//端口b中断服务函数
if(TMR1IF&TMR1IE){TMR1IF=0;tm_sum++;if(tm_sum==31){tm_sum=0;tmr_s=!tmr_s;tmr_d=1;}}
//定时器1中断服务函数
}
//************************************************************************************
main()
{
CLRWDT(); //清除看门狗
port_init();//端口初始化
init_start();//开机状态
adc_init();//ad通道初始化
//-----
RC4=0;//继电器关闭
RC3=1;//关闭脉冲封锁
//-----
TMR1CS=0;//同步模式
T1SYNC=0;//内部指令周期
TMR1H=0XFD;
TMR1L=0X10;//定时器1初值
TMR1IE=1;//定时器1中断使能
//-----
TRISC=0X00;//端口C输出
TRISC1=TRISC2=1;//RC1,RC2输入模式
PEIE=1;//外围模块中断使能
TMR2IE=1;//打开定时器2中断使能
GIE=1;//开全局中断
TMR2ON=1;//打开定时器2
TOUTPS3=0;TOUTPS2=1;TOUTPS1=0;TOUTPS0=0;//定时器2后分频器5分频
TMR1ON=1;//打开定时器1
power_ie=1;//允许开机
while(1)
{
CLRWDT();//清除看门狗
if(k){
  DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();//延时
  DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();//延时
if(k&&RB6){k=0;power=!power;}//开关机标志
if(power)//开机
{
power_ie=0;//开关间隔开始计时
RC3=0;//打开脉冲封锁
RC4=1;//打开继电器
L3_RED_ON;//打开L3绿灯
CCP_start();//开始SPWM
}
if(!power)//关机
{
power_ie=0;//开关间隔开开始计时
crut_if=0;//电流保护标志清零
volue_if=0;//电池电压保护标志清零
L1_OFF;//关灯
L2_OFF;
L3_OFF;
RC3=1;//关闭脉冲封锁
CCP2CON=0;CCP1CON=0;//复位CCP模块
RC2=RC1=0;//置端口固定电平
L3_OFF;//关闭L3绿灯
RC4=0;//关闭继电器
}
}
//-----输出电流检测
if(power_up)
{
if(ad_res_0>=204)//电流高于4v,快保护
{
crut_if=1;crut_tmr=0;crut_ie=0;
L2_GREE_ON;RC3=1;RC4=0;L3_GREE_ON;
}
if((ad_res_0>=102)&&(ad_res_0<204))//高于2v电流慢保护
{
L2_GREE_ON;
if(tmr_s&&tmr_d&&crut_ie)//时基,时基变化标志,保护允许
{
tmr_d=0;crut_tmr++;
if(crut_tmr==10)
{
crut_tmr=0;crut_ie=0;crut_if=1;//保护
L2_GREE_ON;RC3=1;RC4=0;L3_GREE_ON;
}
}
}
if(ad_res_0<102){crut_tmr=0;L2_OFF;if(crut_if)L2_GREE_ON;}//电流正常低于2v
//-----电池电压检测
if(ad_res_2>=102){L1_OFF;if(volue_if)L1_GREE_ON;}
//电池电压大于2v,L1红灯灭
if((ad_res_2<102)&&(ad_res_2>=91)){L1_GREE_ON;}//电池低于2v大于1.8v
     if(ad_res_2<92){volue_if=1;L1_GREE_ON;RC3=1;RC4=0;L3_GREE_ON;} //电池低于1.8v
}
//-----模拟采集
if(power)ad_1();//在开机状态下检测反馈电压
ad_2();//采集电池电压
ad_0();//采集电流
if(power_ie==0)//开关机时间间隔
{
if(tmr_s&&tmr_d){tmr_d=0;power_s++;}
if(power_s==10){power_s=0;power_ie=1;}
}
if(power_up==0)//上电延时1秒检测电池电压
{
if(tmr_s&&tmr_d){tmr_d=0;power_up_s++;}
if(power_up_s==1){power_up_s=0;power_up=1;}
}
}
}
0
回复
wwwjjjwww
LV.2
21
2006-09-18 09:19
0
回复
qghqgh
LV.6
22
2006-09-18 13:21
@wwwjjjwww
1158542354.ddb
正在学习中,多谢.
0
回复
upsdian
LV.3
23
2006-09-18 14:26
@wwwjjjwww
1158542354.ddb
怎么打不开啊!??
0
回复
wcssh
LV.4
24
2006-09-18 14:31
@wwwjjjwww
1158542354.ddb
用Protel99se无发打开
0
回复
wwwjjjwww
LV.2
25
2006-09-20 09:19
@wcssh
用Protel99se无发打开
我试了,可以下载,可以大开
0
回复
xiaxiao1127
LV.4
26
2006-09-21 03:55
@wwwjjjwww
我试了,可以下载,可以大开
老大你的ddb文件用protel99se无发打开.
0
回复
hbzjcjw
LV.10
27
2006-09-21 12:10
@xiaxiao1127
老大你的ddb文件用protel99se无发打开.
这种无聊的贴子真是浪费人的热情!
0
回复
hbzjcjw
LV.10
28
2006-09-21 22:40
@hbzjcjw
这种无聊的贴子真是浪费人的热情!
0
回复
wcssh
LV.4
29
2006-09-22 09:27
@hbzjcjw
1158849640.ddb
能打开了,谢谢.
0
回复
qghqgh
LV.6
30
2006-09-23 14:42
@wcssh
能打开了,谢谢.
我试了一下,输出带负载压降太大.且看不到正弦波形.不知问题出在哪里.盼楼主及高手解答.多谢!
0
回复
kwlon
LV.2
31
2006-12-09 13:14
@qghqgh
我试了一下,输出带负载压降太大.且看不到正弦波形.不知问题出在哪里.盼楼主及高手解答.多谢!
1165641200.ddb
高手看一下,能行吗?
0
回复