家电维修网

 找回密码
 注册
查看: 2585|回复: 3

PIC16F73做的逆变器程序及原理图

[复制链接]

高级维修师

Rank: 6Rank: 6

回帖
36
主题
29
积分
524
在线时间
19 小时
注册时间
2008-8-22
最后登录
2020-8-16

推广活动勋章

发表于 2009-10-3 14:57 | 显示全部楼层 |阅读模式
本帖最后由 tbklgt 于 2009-10-3 15:12 编辑

//------------------------------------------------------------
//       spwm信号调制
//------------------------------------------------------------
#include <pic16f7x.h>
#include<pic.h>
//系统配置
__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;}
                }
        }
}
PIC16F73做的逆变器程序及原理图.JPG
afb056a52a065a8ecfd8e0d7790df3ea1.jpg

protel 文件夹原理图.rar

19.49 KB, 下载次数: 46, 下载积分: 金币 -2 分

高级维修师

Rank: 6Rank: 6

回帖
36
主题
29
积分
524
在线时间
19 小时
注册时间
2008-8-22
最后登录
2020-8-16

推广活动勋章

 楼主| 发表于 2009-10-3 15:03 | 显示全部楼层

源程序hex文件

本帖最后由 tbklgt 于 2009-10-4 11:12 编辑

源程序hex文件

pic_nibian.rar

93.2 KB, 下载次数: 8, 下载积分: 金币 -2 分

hex.rar

2.6 KB, 下载次数: 8, 下载积分: 金币 -2 分

回复 支持 反对

使用道具 举报

匿名  发表于 2011-7-23 16:05
师傅印刷板的,原理图,能不能发一份给我,谢谢,znhznh558@163.com

.qq395031911
回复 支持 反对

使用道具

中级维修师

Rank: 5Rank: 5

回帖
24
主题
33
积分
350
在线时间
49 小时
注册时间
2008-11-8
最后登录
2014-1-8

推广活动勋章

发表于 2011-7-23 16:29 | 显示全部楼层
师傅,如果要多少钱的,请回个电话18657700966
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|门户地图|网站地图|家电维修|手机版|家电维修技术论坛 ( 蜀ICP备14030498号-16 川公网安备51102502000162号 )

GMT+8, 2025-5-1 03:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表