逆变电源程序.docx
- 文档编号:23109647
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:26
- 大小:21.55KB
逆变电源程序.docx
《逆变电源程序.docx》由会员分享,可在线阅读,更多相关《逆变电源程序.docx(26页珍藏版)》请在冰豆网上搜索。
逆变电源程序
//-----------------
//main.c,晶振4MHz,20110722,系统测试
//--------------
#include
#include
#include"text.h"//资源定义
#include"12864.h"//显示
#include"Initial.h"//初始化
#include"keyscan.h"//按键扫描
#include"pwm.h"
//--------------------
voidmain(void)
{
Initial();//调用初始化子函数
LCD_lnitial();//LCD初始化子函数
LCD_Prints(0,0,"双极性单相SPWM");
LCD_Prints(1,0,"逆变器模拟装置");
LCD_Prints(2,0,"频率:
Hz");
LCD_Prints(3,0,"调制度:
=>>");
while
(1)
{
while(!
T0IF);//判断40ms到否
{
T0IF=0;TMR0=98;
asm("clrwdt");//清看门狗
keyscan();//按键扫描
if(spwmint&fer_Hz<50)//上电初始后,频率自动加到50Hz,调制度自动加到0.98
{
if(delay>15)
{
fer_Hz+=1;delay=0;mark=1;
if((fer_Hz%2)&m<15){m++;xian_m+=2;}
}
elsedelay++;
}
else
{spwmint=0;LCD_Prints(3,6,"");}
if(k2){m++;mark=1;xian_m+=2;}//有k2键,调制度加0.02,即m加1
if(xian_m==102)xian_m=68;
if(m>16){m=0;mark=1;}//调制度范围为0.68~1,共17阶,每阶加0.02
if(k1){fer_Hz=fer_Hz+10;mark=1;}//有k1键,正弦波频率加10Hz
if(k0){fer_Hz=fer_Hz+1;mark=1;}//有k0键,正弦波频率加1Hz
if(fer_Hz>100)fer_Hz=10;//正弦波频率范围为10~100Hz
R4=fer_Hz/100;//显示频率和调制度
R5=(fer_Hz%100)/10;
R6=fer_Hz%10;
LCD_Printc(2,2,0x3A);
LCD_Writedata(0x00);
LCD_Writedata(0x30+R4);
LCD_Writedata(0x30+R5);
LCD_Writedata(0x30+R6);
R4=xian_m/100;
R5=xian_m%100/10;
R6=xian_m%10;
LCD_Printc(3,3,0x3A);
LCD_Writedata(0x30+R4);
LCD_Writedata(0x2E);
LCD_Writedata(0x30+R5);
LCD_Writedata(0x30+R6);
if(mark)
{
mark=0;
if(10<=fer_Hz&fer_Hz<24)sta=0;//10~24Hz根据频率确定对应的抽样次数
if(25<=fer_Hz&fer_Hz<39)sta=1;//25~39Hz
if(40<=fer_Hz&fer_Hz<59)sta=2;//40~59Hz
if(60<=fer_Hz&fer_Hz<100)sta=3;//60~100Hz
switch(sta)
{
case0:
//10~24Hz
N=100;//预分频数为4
PR2_time=((250000/fer_Hz)/N)-1;//某一频率正弦波对应的一个PWM周期
for(n=0;n<25;n++)//计算1/4周期正弦波的PWM正脉宽时间
{//结果存于number1[]数组中
R0=(tiaom[m]*sin100[n])/255;R1=(R0+1)/2;R2=(R1+128);
R3=(R2*PR2_time)/255;
number1[n]=R3;
}
choose_table=1;//将中断中的查表状态值改为1
PR2=PR2_time;//修改PWM周期值
pwm_N=25;//1/4抽样数给中断查pwm_high个数
T2CKPS0=1;//欲分频系数为4
for(n=0;n<25;n++)//表1值移入表0中
{
number0[n]=number1[n];
}
choose_table=0;//表值移完,中断查表状态值改为0
break;
case1:
//25~39Hz
N=160;//抽样总数160
PR2_time=(1000000/fer_Hz)/N-1;//某一频率正弦波对应的一个PWM周期
for(n=0;n<40;n++)//计算1/4周期正弦波的PWM正脉宽时间
{//结果存于number1[]数组中
R0=(tiaom[m]*sin160[n])/255;R1=(R0+1)/2;R2=(R1+128);
R3=(R2*PR2_time)/255;
number1[n]=R3;
}
choose_table=1;//将中断中的查表状态值改为1
PR2=PR2_time;//修改PWM周期值
pwm_N=40;//1/4抽样数给中断查pwm_high个数
T2CKPS0=0;//欲分频系数为1
for(n=0;n<40;n++)//表1值移入表0中
{
number0[n]=number1[n];
}
choose_table=0;//表值移完,中断查表状态值改为0
break;
case2:
//40~59Hz
N=100;//抽样总数100
PR2_time=(1000000/fer_Hz)/N-1;//某一频率正弦波对应的一个PWM周期
for(n=0;n<25;n++)//计算1/4周期正弦波的PWM正脉宽时间
{//结果存于number1[]数组中
R0=(tiaom[m]*sin100[n])/255;R1=(R0+1)/2;R2=(R1+128);
R3=(R2*PR2_time)/255;
number1[n]=R3;
}
choose_table=1;//将中断中的查表状态值改为1
PR2=PR2_time;//修改PWM周期值
pwm_N=25;//1/4抽样数给中断查pwm_high个数
T2CKPS0=0;//欲分频系数为1
for(n=0;n<25;n++)//表1值移入表0中
{
number0[n]=number1[n];
}
choose_table=0;//表值移完,中断查表状态值改为0
break;
case3:
//60~100Hz
N=76;//抽样总数76
PR2_time=(1000000/fer_Hz)/N-1;//某一频率正弦波对应的一个PWM周期
for(n=0;n<19;n++)//计算1/4周期正弦波的PWM正脉宽时间
{//结果存于number1[]数组中
R0=(tiaom[m]*sin76[n])/255;R1=(R0+1)/2;R2=(R1+128);
R3=(R2*PR2_time)/255;
number1[n]=R3;
}
choose_table=1;//将中断中的查表状态值改为1
PR2=PR2_time;//修改PWM周期值
pwm_N=19;//1/4抽样数给中断查pwm_high个数
T2CKPS0=0;//欲分频系数为1
for(n=0;n<19;n++)//表1值移入表0中
{
number0[n]=number1[n];
}
choose_table=0;//表值移完,中断查表状态值改为0
break;
default:
break;
}//switch(sta)
}//if(mark)
}//while(!
T0IF)
}//while
(1)
}
//==================================
//中断程序
voidinterruptpic(void)
{
TMR2IF=0;
pwm();
if(A==35){RC0=~RC0;A=0;}
A++;
}
/初始化
voidInitial(void)//上电复位
{
if(nPOR==0)
{
PORTA=0x00;
PORTB=0x00;
PORTC=0x00;
PORTD=0X00;
PORTE=0X00;
}
while(nPOR==0){nPOR=1;}
OPTION_REG=0x06;//分频器给TMR0,128分频
TRISA=0x01;
TRISB=0xC0;
TRISC=0xc0;//第二个IO口CCP1
TRISD=0x00;
TRISE=0x00;
ADCON1=0x06;//全部为数字口
//OPTION_REG=0X03;//定时器0分频系数16
TMR0=98;//定时器初值,定时40ms256*157
//----------------------
//PWM工作方式设置
INTCON=0xC0;//开总中断和外部中断
PIE1=0x02;//定时器2允许中断
PIR1=0x00;
TRISC=0x00;
TMR2=0X00;
CCP1CON=0X0C;//CCP模块工作在PWM方式
T2CON=0X00;//分频1:
1,TMR2ON=1,未启动定时器2
TMR2ON=1;//启动定时器2
mark=1;
spwmint=1;
}
/*-------------------
*文件:
12864.h
*功能:
并行LCD显示
*平台:
PIC16F877A4MHz晶振
*作者:
S_gqing
*时间:
2011.10
IO口定义
#defineLCD_RSRC5//指令数据选择位。
0为指令1为数据
#defineLCD_RWRC6//读写选择位。
0为写1为读
#defineLCD_ENRC7//并口使能位
#defineLCD_BUSY_1RD7//读忙位
#defineT_BUSYTRISD7//忙状态方向设置位
#defineT_DATATRISD//数据口方向设置
#defineLCD_DATA_IOPORTD//八位数据IO口
-------------------*/
/*=====================
//读忙状态
//说明:
读到不忙才跳出程序
=====================*/
//RS=0,RW=1,E=H,DO~D7=状态字
voidLCD_CheckBusy(void)
{
busy=1;RD=0x00;//先置位繁忙标志位
TRISD=0xFF;//RC口设为输入口
LCD_RS=0;//设置该字节数据为命令代码
LCD_RW=1;//设置此次操作为读
while(busy)
{
asm("NOP");
asm("NOP");
asm("NOP");
LCD_EN=1;//使能
asm("NOP");
asm("NOP");
asm("NOP");
if(!
RD7)busy=0;//检测LCD是否工作繁忙
asm("NOP");
asm("NOP");
asm("NOP");
LCD_EN=0;//禁止
}
LCD_EN=0;//禁止
TRISD=0X00;//恢复通信为输出
}
/*
voidLCD_CheckBusy(void)
{
ucharflag=1;
LCD_RS=0;//指令
LCD_RW=1;//读
T_DATA=0xff;//RD口设为输入口
T_BUSY=1;//设为输入口
while(flag)
{
asm("NOP");
asm("NOP");
LCD_EN=1;
//__delay_us(5);
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
if(!
LCD_BUSY_1)flag=0;
LCD_EN=0;
}
LCD_EN=0;
T_DATA=0x00;//RD设为输出口
//__delay_us
(2);
asm("NOP");
asm("NOP");
}
*/
/*=====================
//写命令到LCD
//输入:
八位命令__cmd
=====================*/
voidLCD_Writecmd(ucharcom)
{
LCD_CheckBusy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA_IO=com;
LCD_EN=1;
//__delay_us(3);
asm("NOP");
asm("NOP");
asm("NOP");
LCD_EN=0;
}
/*======================
//写一字节数据到LCD
//输入:
八位数据__data
======================*/
voidLCD_Writedata(uchardata)
{
LCD_CheckBusy();
LCD_RS=1;
LCD_RW=0;
LCD_DATA_IO=data;
LCD_EN=1;
//__delay_us(3);
asm("NOP");
asm("NOP");
asm("NOP");
LCD_EN=0;
}
/*=========================
读一个数据到单片机
返回数值x
=========================*/
ucharLCD_Readdata(void)
{
unsignedchardata;
LCD_CheckBusy();//检测LCD是否工作繁忙
TRISD=0xFF;//RD口设为输入口
LCD_RS=1;//设置该字节数据是显示数据
LCD_RW=1;//设置该次操作为读
LCD_EN=1;
asm("NOP");
asm("NOP");
asm("NOP");
data=PORTD;//PORTD口数据送data
LCD_EN=0;//使能
TRISD=0x00;//下次循环为输出口
returndata;//返回数值data
}
/*========================
//LCD光标定位(行和列定位)
//输入:
行__row,列__line
//说明:
row为0~3,line为0~7
=========================*/
voidLCD_SetPos(ucharrow,ucharline)
{
if(row==0)LCD_Writecmd(0x80+line);
elseif(row==1)LCD_Writecmd(0x90+line);
elseif(row==2)LCD_Writecmd(0x88+line);
elseLCD_Writecmd(0x98+line);
}
/*=========================
//写一字节数据到LCD
//输入:
row__行,line__列,data__数据
//说明:
row为0~3,line为0~15,data为待显示一字节数据
=========================*/
voidLCD_Printc(ucharrow,ucharline,uchardata)
{
LCD_SetPos(row,line);
LCD_Writedata(data);
}
/*=========================
//写字符串到LCD
//输入:
row__行,line__列,*string__字符串的首地址指针
//说明:
row为0~3,line为0~15,字符串用常量const修饰
=========================*/
voidLCD_Prints(ucharrow,ucharline,constuchar*string)
{
LCD_SetPos(row,line);
while(*string)
{
LCD_Writedata(*string);
string++;
}
}
/*======================
//清GDRAM内容
======================*/
voidLCD_CleanGDRAM(void)
{
ucharx,y;
for(y=0;y<64;y++)
{
for(x=0;x<16;x++)
{
LCD_Writecmd(0x34);
LCD_Writecmd(0x80+y);//行地址
LCD_Writecmd(0x80+x);//列地址
LCD_Writecmd(0x30);
LCD_Writedata(0x00);
LCD_Writedata(0x00);
}
}
}
/*======================
//延时程序
======================*/
voidDelay_LCD(void)
{
uchark;
for(k=50;k>0;k++);
}
/*=========================
//LCD初始化
=========================*/
voidLCD_lnitial(void)
{
//Delay_LCD();
__delay_ms(500);//延时50mS
LCD_Writecmd(0x30);//选择8位数据,基本指令集
LCD_Writecmd(0x30);//选择8位数据,基本指令集
//LCD_Writecmd(0x01);
//LCD_Writecmd(0x06);
LCD_Writecmd(0x0c);//开显示(无游标,观标不闪)
LCD_Writecmd(0x01);//清显示,设定地址指针为00H
LCD_Writecmd(0x06);//指定在资料的读取和写入时,设定游标的移动方向为右及指定显示的移位
LCD_CleanGDRAM();
}
#defineucharunsignedchar
#defineuintunsignedint
#defineRAPORTA
#defineRBPORTB
#defineRCPORTC
#defineRDPORTD
#defineREPORTE
//---------------------
#defineLCD_RSRC5//指令数据选择位。
0为指令1为数据
#defineLCD_RWRC6//读写选择位。
0为写1为读
#defineLCD_ENRC7//并口使能位
#defineLCD_BUSY_1RD7//读忙位
#defineT_BUSYTRISD7//忙状态方向设置位
#defineT_DATATRISD//数据口方向设置
#defineLCD_DATA_IOPORTD//八位数据IO口
//------------------------
staticvolatilebitxs7@(unsigned)&PORTE*8+2;
staticvolatilebitxs6@(unsigned)&PORTE*8+1;
staticvolatilebitxs5@(unsigned)&PORTE*8+0;
staticvolatilebitxs4@(unsigned)&PORTB*8+5;
staticvolatilebitxs3@(unsigned)&PORTB*8+4;
staticvolatilebitxs2@(unsigned)&PORTB*8+3;
staticvolatilebitxs1@(unsigned)&PORTB*8+2;
staticvolatilebitxs0@(unsigned)&PORTB*8+1;
//----------------------------------------------
staticvolatilebank3ucharkey1@0x6b;//定义十二个按键
stat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 变电 源程序