?? probridge.c
字號:
/* DESCRIPTION:This program uses to give out full 3-phase bridge's pulse.
Detecting the voltage of the capacitor and the current of the circuit.
*/
#include "LF2407regs.h"
#include <stdlib.h>
#define delay_pulse 650
#define pulse_width 500
#define pulse_width_Vs 6000
#define QuickTest 0
#define ClearOut 0x0FF00;
#define Tmax 50000
#define Tmin 10000
#define delay_time 20000
#define LPULSE 160000
#define T3P 400
int bFirst=1;
int AciFirst=1;
int AssVs;
int VsNum;
void inline enable()
{
asm(" clrc INTM ");
}
void inline disable()
{
asm(" setc INTM ");
}
void interrupt nothing()
{
enable();
return;
}
void interrupt FatalERR()
{
int bJudgeProtect=0,Int_PIVR;
Int_PIVR=*PIVR;
if(Int_PIVR==0x0020)
{
while(1)
{
*PADATDIR=*PADATDIR&ClearOut;
*PBDATDIR=*PBDATDIR&ClearOut;
*PEDATDIR=*PEDATDIR&ClearOut;
*PFDATDIR=*PFDATDIR&ClearOut;
bJudgeProtect=1;
}
}
else
return;
}
void Sys_initial()
{
asm(" setc SXM ");
asm(" clrc OVM ");
asm(" clrc CNF ");
*IFR=0x0FFFF;
*WDCR=0x00E8;
*SCSR1=0x81FE;
*IMR=0x0001;
/* set *IMR to a certain value ; use it to enable homologize interrupt*/
}
void IO_initial()
{
*MCRA=*MCRA&0x0C000; /* set IOPA3~7 as GPIO;set IOPB0~3 as GPIO */
*MCRC=*MCRC&0x8000;/* set IOPE1 ~7 as GPIO */
*PADATDIR=*PADATDIR|0x0C700;
*PADATDIR=*PADATDIR&0x0C700;/* set IOPA3~5 as input pin;set IOPA6~7 as output pin*/
*PBDATDIR=*PBDATDIR|0x0F00;
*PBDATDIR=*PBDATDIR&0x0F00;/* set IOPB0~3 as output pin */
*PEDATDIR=*PEDATDIR|0x7F00;
*PEDATDIR=*PEDATDIR&0x7F00;/*set IOPE1~6 as output pin */
}
void ADC_reset()
{
*ADCTRL1=0x4000;
asm(" NOP ");
*ADCTRL1=0x0000;
}
unsigned int AD0()
{
int convert,j;
volatile unsigned int *i;
unsigned int result=0;
unsigned int GetAd0[8];
*ADCTRL1=0x2030;/*set AD0 work state */
*MAXCONV=0x07;
*CHSELSEQ1=0x1111;
*CHSELSEQ2=0x1111;
*ADCTRL2=*ADCTRL2|0x4000;/*point to CONV00*/
*ADCTRL2=*ADCTRL2|0x2000;
for(;;)
{
convert=*ADCTRL2&0x0200;
if(convert==0x0200)
break;
else
continue;
}
i=RESULT0;
for(j=0;j<8;j++,i++)
{
GetAd0[j]=*i;
result+=*i>>3;
}
if(result>Tmax)
{
result=Tmax;
}
else if(result<Tmin)
{
result=Tmin;
}
*ADCTRL2=*ADCTRL2|0x4200;/* reset SEQ1, write a 1 clear INT FLAG SEQ1*/
return(result);
}
/* get the frequency */
/* *a 得到電容電壓測量值的4倍,*b得到回路電流的測量值的4倍 */
/*
用于檢測電容電壓和電流的值
*/
void Timers_initial()
{
*T1CON=0x150A;
*T2CON=0x150A;
*T3CON=0x1508;
*GPTCONA=0x6000;
*GPTCONB=0x6000;
*EVAIMRA=*EVAIMRA|0x0181;
*EVAIMRB=*EVAIMRB|0x0003;
*EVAIFRA=*EVAIFRA&0x0181;
*EVAIFRB=*EVAIFRB&0x0003;
}
/*initial timers and EVA,EVxIFRx write 1 to clear */
void CapacitorCharge(unsigned long delay)
{
unsigned long SysWait=delay_time;
*PADATDIR=*PADATDIR&ClearOut;
*PEDATDIR=*PEDATDIR&ClearOut;
*PADATDIR=*PADATDIR|B6_MSK;
*PEDATDIR=*PEDATDIR|B5_MSK; /* give SCR1 and SCR8 pulse */
for(;delay>1;delay--)
{
delay=delay;
}
*PADATDIR=*PADATDIR&ClearOut;
*PEDATDIR=*PEDATDIR&ClearOut;
for(;SysWait>0;SysWait--)
{
SysWait=SysWait;
}
return;
}
/* Capacitor pre-charge,set IOPA6(pulse1) and IOPF0 (pulse8)
as 1 and delay then set as 0
*/
int doStart()
{
int i;
if(QuickTest)
i=1;
else
{
i=*PADATDIR&B3_MSK;
if(i==B3_MSK)
i=1;
else
i=0;
}
return(i);
}
int doStop()
{
int i;
if(QuickTest)
i=0;
else
{
i=*PADATDIR&B4_MSK;
if(i==B4_MSK)
i=1;
else
i=0;
}
return(i);
}
int GetCapacitorPolar()
{
int i,k;
k=*PADATDIR&B5_MSK;
if(k==B5_MSK)
i=1;
else
i=0;
return(i);
}
void ReportERR()
{
;
}
void main(void)
{
int i;
int DelayOfAs;
volatile unsigned long m; /*define some variables */
unsigned int AD0res; /*define a variable to get AD0's result */
int intT1CMP,intT2CMP,intT1PER,intT2PER,intT3PER;
int bStart,bStop;
char *sysWait;
unsigned long Capacitor_delay=80000; /*use to delay for capacitor pre-charge*/
int V_capacitor,I_circuit;
unsigned int Vvalue,Ivalue;
int BullCapacitorPolar; /* use to judge the capacitor's polarity */
disable();
Sys_initial();
ADC_reset();
Timers_initial();
IO_initial();
enable();
start: while((bStart=doStart())!=1)
{
sysWait=" ACI not start! ";
bFirst=1;
AciFirst=1;
IO_initial();
}
stop: while((bStop=doStop()))
{
sysWait=" ACI stop ! ";
bFirst=1;
AciFirst=1;
*T1CON=*T1CON&0x0FFBF;
goto start;
}
if(bFirst)
{
CapacitorCharge(Capacitor_delay);
bFirst=0;
}
/*
we can use another timer to inspect if we should stop or start ACI.
In that way we can do this work in interrupt.
*/
if(AciFirst)
{
*PADATDIR=*PADATDIR|0x00C0;
/*IOPA6(pulse1)=1,IOPA7(pulse2)=1;*/
for(m=LPULSE;m>0;m--)
{
m=m;
}
/*
這個地方系統需要長時間的等待以確立使1,2導通;估計是由于電感反電勢的阻擋
使一段時間內無法使2導通且該時間較長,因此,需要修改i的大小,使之能夠適合
*/
*PADATDIR=*PADATDIR&ClearOut;
/*IOPA6(pulse1)=0,IOPA7(pulse2)=0*/
AD0res=AD0();/* AD0()需定義*/
*T1PER=AD0res;
*T1CMP=AD0res-pulse_width;
*T1CNT=0x0000;
*T1CON=*T1CON|0x0040; /*open T1*/
*T1CON=0x1546;
AciFirst=0;
AssVs=7;
VsNum=1;
/*clear ACI beginning Flag */
}
else
{
for(;;)
{
intT1CMP=*EVAIFRA&B8_MSK;
if(intT1CMP==B8_MSK)
break;
else
continue;
}
switch(AssVs)
{
case 7 :
{
*PEDATDIR=*PEDATDIR|B1_MSK;/* set IOPE1(pulse7)=1*/
*EVAIFRA=*EVAIFRA&B8_MSK;/* write a 1 to clear T1CINT */
AD0res=AD0();
*T1PER=AD0res;
*T1CMP=AD0res-pulse_width;
for(;;)
{
intT1PER=*EVAIFRA&B7_MSK;
if(intT1PER==B7_MSK)
break;
else
continue;
}
*PEDATDIR=*PEDATDIR&ClearOut;/*set IOPE7(pulse7)=0*/
*EVAIFRA=*EVAIFRA|B7_MSK;/*write a 1 to clear T1PINT*/
*T2PER=pulse_width_Vs+delay_pulse;
*T2CMP=delay_pulse;
*T2CNT=0x0000;
*T2CON=*T2CON|0x0040;
*T3CNT=0x0000;
*T3PER=T3P;
*T3CON=*T3CON|0x0040;
for(;;)
{
intT3PER=*EVBIFRA&B7_MSK;
if(intT3PER==B7_MSK)
break;
else
continue;
}
*EVBIFRA=*EVBIFRA|0x0FFFF;
*T3CON=*T3CON&0x0FFBF;
/* if((*PADATDIR&B5_MSK)==B5_MSK)
/* if(((PADATDIR&B5_MSK)==B5_MSK)!=0) */
/* {
ReportERR();
} */
for(;;)
{
*ADCTRL1=0x4000;
asm(" NOP ");
*ADCTRL1=0x0000;
*ADCTRL1=0X2030;
*MAXCONV=0x07;
*CHSELSEQ1=0x7373;
*CHSELSEQ2=0x7373;
*ADCTRL2=*ADCTRL2|0x4000;
*ADCTRL2=*ADCTRL2|0x2000;
for(;;)
{
if((*ADCTRL2&0x0200)==0x200)
break;
else
continue;
}
Vvalue=(*RESULT0>>6)+(*RESULT2>>6)+(*RESULT4>>6)+(*RESULT6>>6);
Ivalue=(*RESULT1>>6)+(*RESULT3>>6)+(*RESULT5>>6)+(*RESULT7>>6);
V_capacitor=28220-17*Vvalue;
I_circuit=4*Ivalue-50;
V_capacitor=abs(V_capacitor);
if((V_capacitor>=(I_circuit+1500)))
{
break;
}
else
{
intT2CMP=*EVAIFRB&B1_MSK;
if(intT2CMP==B1_MSK)
break;
else
continue;
}
}
/* mul 10 to I ,V*/
/* 計算電容電壓和電流大小,進行判斷。在達到電容域值或達到固定時間間隔的時候
給出脈沖
*/
switch(VsNum)
{
case 1 :
*PADATDIR=*PADATDIR|B6_MSK;/* set IOPA6(pulse1)=1*/
*EVAIFRB=*EVAIFRB|B1_MSK;/*write a 1 to clear T2CINT*/
for(;;)
{
intT2PER=*EVAIFRB&B0_MSK;
if(intT2PER==B0_MSK)
break;
else
continue;
}
*PADATDIR=*PADATDIR&ClearOut;
VsNum=2;
AssVs=8;
break;
case 3 :
*PBDATDIR=*PBDATDIR|B0_MSK;/*set IOPB0(pulse3)=1*/
*EVAIFRB=*EVAIFRB|B1_MSK;/*write a 1 to clear T2CINT*/
for(;;)
{
intT2PER=*EVAIFRB&B0_MSK;
if(intT2PER==B0_MSK)
break;
else
continue;
}
*PBDATDIR=*PBDATDIR&ClearOut;
VsNum=4;
AssVs=8;
break;
case 5 :
*PBDATDIR=*PBDATDIR|B2_MSK;
*EVAIFRB=*EVAIFRB|B1_MSK;/*write a 1 to clear T2CINT*/
for(;;)
{
intT2PER=*EVAIFRB&B0_MSK;
if(intT2PER==B0_MSK)
break;
else
continue;
}
*PBDATDIR=*PBDATDIR&ClearOut;
VsNum=6;
AssVs=8;
break;
}
*T2CON=*T2CON&0x0FFBF;
*EVAIFRB=*EVAIFRB&B0_MSK;/* write a 1 to clear T1PCNT*/
*EVAIFRB=*EVAIFRB|0x0FFFF;
break;
}
case 8 :
{
*PEDATDIR=*PEDATDIR|B5_MSK;/* set IOPE2(pulse8)=1*/
*EVAIFRA=*EVAIFRA&B8_MSK;/* write a 1 to clear T1CINT */
AD0res=AD0();
*T1PER=AD0res;
*T1CMP=AD0res-pulse_width;
for(;;)
{
intT1PER=*EVAIFRA&B7_MSK;
if(intT1PER==B7_MSK)
break;
else
continue;
}
*PEDATDIR=*PEDATDIR&ClearOut;/*set IOPF0(pulse8)=0*/
*EVAIFRA=*EVAIFRA|B7_MSK;/*write a 1 to clear T1PINT*/
*T2PER=pulse_width_Vs+delay_pulse;
*T2CMP=delay_pulse;
*T2CNT=0x0000;
*T2CON=*T2CON|0x0040;
*T3CNT=0x0000;
*T3PER=T3P;
*T3CON=*T3CON|0x0040;
for(;;)
{
intT3PER=*EVBIFRA&B7_MSK;
if(intT3PER==B7_MSK)
break;
else
continue;
}
*EVBIFRA=*EVBIFRA|0x0FFFF;
*T3CON=*T3CON&0x0FFBF;
/* if(((*PADATDIR&B5_MSK)==B5_MSK))*/
/* if(((PADATDIR&B5_MSK)==B5_MSK)!=1) */
/* {
ReportERR();
} */
for(;;)
{
*ADCTRL1=0x4000;
asm(" NOP ");
*ADCTRL1=0x0000;
*ADCTRL1=0X2030;
*MAXCONV=0x07;
*CHSELSEQ1=0x7373;
*CHSELSEQ2=0x7373;
*ADCTRL2=*ADCTRL2|0x4000;
*ADCTRL2=*ADCTRL2|0x2000;
for(;;)
{
if((*ADCTRL2&0x0200)==0x200)
break;
else
continue;
}
Vvalue=(*RESULT0>>6)+(*RESULT2>>6)+(*RESULT4>>6)+(*RESULT6>>6);
Ivalue=(*RESULT1>>6)+(*RESULT3>>6)+(*RESULT5>>6)+(*RESULT7>>6);
V_capacitor=28220-17*Vvalue;
I_circuit=4*Ivalue-50;
V_capacitor=abs(V_capacitor);
if((V_capacitor>=(I_circuit+1500)))
{
break;
}
else
{
intT2CMP=*EVAIFRB&B1_MSK;
if(intT2CMP==B1_MSK)
break;
else
continue;
}
}
/* mul 10 to I ,V*/
/* 計算電容電壓和電流大小,進行判斷。在達到電容域值或達到固定時間間隔的時候
給出脈沖
*/
switch(VsNum)
{
case 2 :
*PADATDIR=*PADATDIR|B7_MSK;
*EVAIFRB=*EVAIFRB|B1_MSK;
for(;;)
{
intT2PER=*EVAIFRB&B0_MSK;
if(intT2PER==B0_MSK)
break;
else
continue;
}
*PADATDIR=*PADATDIR&ClearOut;
VsNum=3;
AssVs=7;
break;
case 4 :
*PBDATDIR=*PBDATDIR|B1_MSK;
*EVAIFRB=*EVAIFRB|B1_MSK;
for(;;)
{
intT2PER=*EVAIFRB&B0_MSK;
if(intT2PER==B0_MSK)
break;
else
continue;
}
*PBDATDIR=*PBDATDIR&ClearOut;
VsNum=5;
AssVs=7;
break;
case 6 :
*PBDATDIR=*PBDATDIR|B3_MSK;
*EVAIFRB=*EVAIFRB|B1_MSK;
for(;;)
{
intT2PER=*EVAIFRB&B0_MSK;
if(intT2PER==B0_MSK)
break;
else
continue;
}
*PBDATDIR=*PBDATDIR&ClearOut;
VsNum=1;
AssVs=7;
break;
}
*T2CON=*T2CON&0x0FFBF;
*EVAIFRB=*EVAIFRB&B0_MSK; /* write a 1 to clear T1PCNT*/
*EVAIFRB=*EVAIFRB|0x0FFFF;
break;
}
break;
}
}
goto start;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -