⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 za.c

📁 HID汽车大灯安定器,应用现在的安定器上,有多种保护功能
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -