📄 za.c
字号:
TRISF=0XFFFF;PORTF=0;
TRISA=0XFFFF;PORTA=0;
TRISD=0XFFFF;PORTD=0;
IPC0=IPC1=IPC2=IPC3=IPC4=IOCON1=IOCON2=IPC5=IPC7=IEC0=IEC1=IEC2=IPC8=0;
INTCON1=INTCON2=pt50ms=resdata=0;
func=0;error=0;imin_count=0;imintime=0;
time5s=0;
//-------------------------------------------------
};
//=============================================================
void timer1_set (void)
{
T1CON=0;
TMR1=0;
PR1=1650; //5mS/次.
T1CONbits.TSIDL=0;
T1CONbits.TGATE=0;
T1CONbits.TCKPS1=1;
T1CONbits.TCKPS0=0;
T1CONbits.TSYNC=0;
T1CONbits.TCS=0;
T1CONbits.TON=1;
IPC0bits.T1IP=1; //T1优先.
IEC0bits.T1IE=1;
};
//=============================================================
void timer2_set (void)
{
T2CON=0;
TMR2=0;
PR2=0X320; //320 //40uS/次.
T2CONbits.TCS=0;
T2CONbits.TGATE=0;
T2CONbits.T32=0;
T2CONbits.TCKPS=0;
T2CONbits.TSIDL=0;
T2CONbits.TON=1;
IPC1bits.T2IP=2;
IEC0bits.T2IE=1;
};
//==========================================================================================================
//==========================================================================================================
void ADCandPWM_Init()
{
#define powon() {__asm__ volatile ("bset.b 0x040b,#7");}
#define powoff() {__asm__ volatile ("bclr.b 0x040b,#7"); __asm__ volatile ("bclr.b 0x02da,#1"); }
//-------------------------------------------------------------------------------
PTPER = 5000; /* PWM Period = 2.199 usec @ 29.1 MIPS */
/* Refer to PWM section for more details */
//-------------------------------------------------------------------------------
/* Initialize PWM Generator 1 */
IOCON1bits.PENH = 0; /* PWM Module controls High output */
IOCON1bits.PENL = 0; /* GPIO Module controls Low output */
IOCON1bits.POLH = 0; /* High Output Polarity is active High */
IOCON1bits.POLL = 0; /* Low Output Polarity is active High */
IOCON1bits.PMOD = 1 ; /* Independant output mode */
IOCON1bits.OVRENH = 0; /* High Output Override disabled */
IOCON1bits.OVRENL = 0; /* Low Output Override disabled */
TRGCON1bits.TRGDIV = 0; /* Trigger on evry event */
TRGCON1bits.TRGSTRT = 0; /* Start the counting at the start */
TRIG1 = 200; /* Trigger event at 0.214 usec from start of he PWM cycle */
PWMCON1bits.FLTSTAT = 0; /* Clear Fault Interrupt flag */
PWMCON1bits.CLSTAT = 0; /* Clear Current Limit Interrupt flag */
PWMCON1bits.TRGSTAT = 0; /* Clear PWM Trigger Interrupt flag */
PWMCON1bits.FLTIEN = 0; /* Disable Fault Interrupt */
PWMCON1bits.CLIEN = 0; /* Disable Current Limit Interrupt */
PWMCON1bits.TRGIEN = 0; /* Disable Trigger Interrupt */
PWMCON1bits.ITB = 0; /* Time base is read from PTMR */
PWMCON1bits.MDCS = 0; /* Duty cycle is read from PDC */
PWMCON1bits.DTC = 2; /* No Dead Time */
PWMCON1bits.XPRES = 0; /* No extenal reset for PTMR */
PWMCON1bits.IUE = 1; /* Immediate update to PDC */
PDC1 =3000; // 128; /* Start with a Ton value of 0.137usec */
PHASE1 = 0; /* No staggering */
//-------------------------------------------------------------------------------
/* Intialize the ADC */
ADCONbits.ADSIDL = 0; /* Operate in Idle Mode */
ADCONbits.FORM = 0; /* Output in Integer Format */
ADCONbits.EIE = 1; /* Enable Early Interrupt */
ADCONbits.ORDER = 0; /* Even channel first */
ADCONbits.SEQSAMP = 1; /* Sequential Sampling Enabled */
ADCONbits.ADCS = 5; /* Clock Divider is set up for Fadc/14 */
ADPCFG = 0xFFC3; /* AN2 AN3 AN4 AN5 are analog inputs */
TRISB|=0x3f; /* AN2 AN3 AN4 AN5 are analog inputs */
ADSTAT = 0; /* Clear the ADSTAT register */
ADCPC0bits.TRGSRC0 = 0x0; //NA触发
ADCPC0bits.TRGSRC1 = 0xd; // PWM1触发=4 /* Trigger conversion on PWM#1 Trigger */
ADCPC1bits.TRGSRC2 = 0xd; // PWM1触发=4 /* Trigger conversion on PWM#1 Trigger */
ADCPC1bits.TRGSRC3 = 0x0; //NA触发 /* Trigger conversion on PWM#1 Trigger */
ADCPC0bits.IRQEN1 = 1; /* Enable the interrupt */
ADCPC0bits.IRQEN0 = 1; /* Enable the interrupt */
ADCONbits.ADON = 1; /* Start the ADC module */
qiao_off();
/* Set up the Interrupts */
IFS0bits.ADIF = 0; /* Clear AD Interrupt Flag */
IPC2bits.ADIP = 3; /* Set ADC Interrupt Priority */
IEC0bits.ADIE = 1; /* Enable the ADC Interrupt */
PTCONbits.PTEN=1; /* Enable PWM Module */
}
//==========================================================================================================
void uptime()
{ clrwdt();
tim+=1;
if (pt50ms>70) {pt50ms=0;imin_count=0;pow_data+=1;}; //5ms*30功率步进一次.
if (pow_data>199) pow_data=195;
};
void qiao_on()
{
_TRISE6=0; _TRISE7=0;
if (qiaotime<qiaotime_set/2)
{_RE7=0;nop();nop();nop();_RE6=1; }
else
{_RE6=0;nop();nop();nop();_RE7=1;};
};
void qiao_off()
{
_TRISE6=_LATE6=0; _TRISE7=_LATE7=0;
_RE7=0;qiaotime=0;nop(); _RE6=1;nop();
};
void hid_on()
{
do{
clrwdt(); powon();
if (vad>vmax_ma) goto fgwq; //电压错误马上跳出
if (vad<vmin_ma) goto fgwq; //电压错误马上跳出
if (iad>imax_ma) goto fgwq; //电流错误马上跳出
if (error&iminf) goto fgwq; //电流错误马上跳出
time5s=0; qiaotime=0; // if (!qiad) qiad=1;
if (!(ptpass&bit0)) goto fhfl;
if (pt50ms>10) { pow_data=(unsigned char)(qvad*10/qiad);pt50ms=0; setb1(ptpass,bit1); if (pow_data>199) {pow_data=0;} goto fgwq; };
fhfl:; //25
if (ptpass&&bit0) goto gtg;
if (pt50ms<5) pow_data=0;
if (pt50ms>10) {setb1(ptpass,bit0);pt50ms=0; pow_data=(unsigned char)(qvad*2/qiad);if (pow_data>199) {pow_data=0;} };
gtg:; //25
// pow_data=0;
//PDC1=pow_set[0]; // PDC1 =1200; // goto outpow;
uptime(); //时间计算.
}while(! ((ptpass&bit1)&&(ptpass&bit0)) ); //goto led_loop;
fgwq:;
if (pow_data>199) pow_data=195;
};
void hid_off()
{
powoff(); pow_data=0; qiaotime=0; _TRISE6=0; _TRISE7=0; _RE7=0;nop(); _RE6=1;nop(); //关管.关桥.
pt50ms=0; imin_count=0; time5s=0; PDC1 =0; ptpass=0; clrb1(func,dengst);time5s=0;imintime=0;imin_count=0;
time5s=0; tim=0;
};
int main(void)
{
//======================================
CLEARAM(); //清内存
qiao_off();
vad=(vmax_ma+vmin_ma)/2;
timer1_set(); //时间中断设定
timer2_set ();
ADCandPWM_Init(); //开AD+电源管PWM驱动+桥驱动=中断.
//======================================
_TRISD0=0; hid_off();
vad2=500;vad=500;iad=50;vad_ew=0; vad_count=0; imax=0; i_count=0; imintime=0;time5s=0; PDC1 =3000;
// powon(); setb1(func,dengst);PDC1 =3500;
maikr:;
clrwdt(); powon(); PDC1 =4500;
if (1) goto maikr;
while(1)
{
//-------------------------------------------------
//主程序.
// if (error&iminf) {setb1(error,iminf); hid_off(); clrb1(func,dengst);goto main_out;};//轻载关闭.不可恢复.
// if (iad>imax_ma) {setb1(error,imaxf); time5s=0; hid_off(); clrb1(func,dengst);goto main_out; }//重载时,不能恢复.
// if (vad>vmax_ma) {setb1(error,vmaxf); time5s=0; hid_off();qiaotime=0;PDC1=2000;} else {if (vad<vmax_ma-2) clrb1(error,vmaxf);}; //高压判断
// if (vad<vmin_ma) {setb1(error,vminf); time5s=0;hid_off(); qiaotime=0;PDC1=4300; clrb1(error,iminf);} else {if (vad>vmin_ma+2) clrb1(error,vminf);}; //低压判断
// if (error&vmaxf) {hid_off(); clrb1(func,dengst); goto main_out; }; //高压错误.关灯跳出 1.5S返回.
// if (error&vminf) {hid_off(); clrb1(func,dengst); goto main_out; }; //低压错误.关灯跳出 1.5S返回.
// if ( (qvad>800)&&(ptpass&bit1)&&(ptpass&bit0) ) {time5s=0;qiaotime=0; hid_off(); PDC1 =3000; clrb1(func,dengst);goto main_out; }//重载时,不能恢复.
// if (error) {hid_off(); clrb1(func,dengst); goto main_out;} //有任何错误时.跳出.
// if (!(func&dengst)) {vad=500;iad=50; PDC1 =800; hid_on(); setb1(func,dengst);}; //正常开灯.
//-------------------------------------------------
main_out:;
uptime(); //时间计算.
//-------------------------------------------------
};
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -