| 買了一片太陽能板又買了一個控制器,看看功能 自己寫一下程式看看功能可以不可以取代!! 飛利浦黑晶爐的控制電路外加 MOS 作為充電和放電... 85W 17V太陽板
 
   
 
   
 
   
 
   
 我的電路
 
   
 
   
 
   
 
   
 
   
 電壓監控 電流監控 時間輸出控制 日落狀態控制輸出 輸出時間可調整
 
 
 /* 20140813 修改部分程式 1.電池電壓修正把電流檢出造成的壓差扣除 2.內定輸出時間設為480分鐘 3.電流檢出修正 3.0A 顯示3.50A的問題   20140821 ricky chian 建議ON4秒OFF1秒充電以增加 電池的活性 */   #include "stm8s.h" #include "stm8s_tim1.h" #include "stm8s_tim6.h" #include "stm8s_adc1.h" #define BUZZER GPIO_PIN_0 #define DCVoltage ADC1_CHANNEL_0 #define DCCurrent ADC1_CHANNEL_1 #define DCTemperature ADC1_CHANNEL_2 #define OUT_PUT_MOS GPIO_PIN_2//pin 5 #define OUT_PUT_MOS_PORT GPIOA #define CHARGE_PORT GPIOB #define CHARGE1_MOS GPIO_PIN_6 //#define CHARGE2_MOS GPIO_PIN_7 #define PV_PORT GPIOF //太陽電池狀態接腳 0730 #define PV_INPUT GPIO_PIN_4  //0730 #define NORM_Repair_Select GPIOB//----20140908 modify hi-normal Lo-repair #define NORM_Repair_PIN GPIO_PIN_7//----20140908 modify hi-normal Lo-repair       u8pcdis[]={0xd6,0x14,0xcc,0x5c,0x1e,0x5a,0xda,0x14,0xde,0x5e};//定義pc port 顯示的值 u8pedis[]={0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x01};//定義pe port 顯示的值對應于7段顯示 unsigned const inttempresist[]={28709,27421,26200,25042,23943,22899,21908, 20967, 20072, 19221,18412, 17642, 16910,16213, 15549,14916,14314,13740,13192,12670,12172,11696,11243, 10809, 10395,10000,9622,9261, 8916, 8585, 8269,7967,7677,7400,7135,  6880, 6637, 6403, 6179, 5964, 5758, 5561,5371, 5189, 5014, 4846, 4685, 4530, 4381, 4238, 4101, 3968, 3841, 3719,  3601, 3487, 3378, 3273, 3172, 3074, 2980,2890, 2803, 2718, 2637, 2559, 2483, 2411, 2340, 2272, 2207, 2144, 2082, 2023,1966, 1911, 1858, 1807, 1757, 1709, 1662, 1617, 1573, 1531, 1491, 1451, 1413,  1376, 1340, 1305, 1271, 1239, 1207, 1177,1147, 1118, 1090, 1063,1037, 1011,987,963,939,917,895,874,853,833,813,794,776,758 };//b值3435 25度 10k NTC電阻=((1024count/NTCcount)-1)/10k u16 Real_Voltagea;//太陽電池的電壓 u16 Real_Voltage;//作為充電電壓放電電壓讀出 u16 Real_Current;//充電電流讀出 u16 Turn_off_Time;//倒數計時分鐘 u8 Hundreds,Tens,Units;//顯示百位十位個位 u16 voltage;// u8 count6;//timer 6 u8 adc_update_flag;//ADC 更新1次的旗標 u8 display_time;//interrupt for display u8 Start_Flag=0; u16 Voltage_AD_count;  //電壓AD值 u16 Current_AD_count;   //電流AD值 u16 Temperature_AD_count;    //電阻AD值 u8 AD_read_count;//0~3 輪流read out AD count u16 ADCValue[10]={0};//電壓值平均用減少誤差雜訊 u16 DataADC=0;//最後的電壓值 u16 NTCvalue;//10K溫度電阻 u8 Degree_C,Degree_0C;//小數點 u8 PWM_Cycle_Complete; u8 PWM_Time_Count; u8 One_Sec_Flag; u8 PWM_On_Count; u8 PWM_Off_Count; u8 PWM_Do; u8PhotoVoltaic_Status;//--------------------0730 u8 Turn_MOS_Out_Flag; u8 OutPut_Mode=0;//select for on auto off u8 One_Tenth_Count;//1/10 second u8 One_Sec_Count; u8 One_Minute_Count; u16 Store_Turn_off_Time; u8 Low_Bat_Flag;//Flag low battery voltage10.8V u8 One_Tenth_Flag; u8 One_Minute_Flag; u8 Night_Mode_Status; u8 MOS2_Status; u8 One_Hour_Flag; u8 Discharge_Low =113;//放電下限電壓 u8 Charge_High_Limit =159;//146; u8 Full_Charge =145;//135; u16 Current_Limit =400; u8 Charge_High_Limit_Top =162; u8 NORM_Repair_flag; //if hi NORMAL condition14.5V Lo repaircondition 15.9V   void AD_Data_Update(void); unsigned int ADC1Set(ADC1_Channel_TypeDefADC_Channel); void delay(unsigned int time); void GPIOinit(void); void GPIOflash(void); void GPIO10flash(void); void tim1init(void);//匯總 TIM1  void tim1svc(void);//中斷服務程式 閃爍10倍 unsigned int NTCresist(void); void ADC_Temperature(void); void KeyScan(void); void delay(unsigned int time); void TransData(void); void Display(void); void GPIOinit(void); void tim1init(void); void tim1svc(void); void tim6init(void); void tim6svc(void); void ADConvert(void); void DigitalFiltering(void); unsigned char Compare_tempres(unsigned intTR); void Display_Time(void); voidCHARGE_OUTPUT_Init(void);//----20140723 充電用 void Charge_MOS1(FunctionalState NewState); void Charge_MOS2(FunctionalState NewState); void Turn_MOS_OutPut(FunctionalStateNewState); void Charge_MOS1_PWM_Mode(void); void PV_Down_Work (void); void FORCE_Turn_MOS_ON(void); void FORCE_Turn_MOS_OFF(void); void Charge_Condition_Work(void);     @far @interrupt void TIM1_OVF_IRQ(void); @far @interrupt void TIM6_OVF_IRQ(void);     void main(void) {         GPIOinit();//顯示用         CHARGE_OUTPUT_Init();//充電&輸出 太陽電池狀態用 0730         tim1init();    tim6init();         rim();                 Turn_off_Time=120;         Store_Turn_off_Time=400;         if(NORM_Repair_flag==0)//Low condition repair mode         {          Charge_High_Limit =159;//146;   Full_Charge =145;//135;   Current_Limit =400;         }         else         {          Charge_High_Limit =146;//146;   Full_Charge =135;          Current_Limit =400;         }             while(1)         {                 AD_Data_Update();         switch(Start_Flag)//顯示用         {                               case0: voltage = Real_Current;                                                 break;                 case1:      voltage = Real_Voltage;                                           break;                   case2:ADC_Temperature();                                                 break;                 case3:Display_Time();                                           break;                 default:break;                     }           if(Real_Voltage< Discharge_Low)//電池過放電保護                 {                 Low_Bat_Flag=1;                     FORCE_Turn_MOS_OFF();                 }                 else                 Low_Bat_Flag=0;//低壓旗標                    switch(OutPut_Mode)//手動on 自動手動off         {                 case0: PV_Down_Work ();//太陽下山的自動開啟動作                                                 break;                 case1: FORCE_Turn_MOS_OFF();                                           break;                   case2: FORCE_Turn_MOS_ON();                                                 break;                 default:break;                     }           Charge_Condition_Work();//執行相關充電模式   } }   void KeyScan(void) {         GPIO_WriteLow(GPIOD,GPIO_PIN_2);         GPIO_WriteLow(GPIOD,GPIO_PIN_3);         GPIO_WriteLow(GPIOD,GPIO_PIN_4);         GPIO_WriteLow(GPIOD,GPIO_PIN_5);                GPIO_Init(GPIOC,(GPIO_PIN_6|GPIO_PIN_7),GPIO_MODE_IN_PU_NO_IT);//變更 sw4 sw5 成為 input           if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)//PC7press sw4         {         delay(50);         if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0)         {                 while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)==0);                 if(Start_Flag==3)                 {                 Store_Turn_off_Time-=10;                 if(Store_Turn_off_Time> 500)//0803                 Store_Turn_off_Time=0;                 Turn_off_Time= Store_Turn_off_Time;                 Night_Mode_Status=0;                 }         }         }           if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)//sw3         {         delay(50);         if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0)         {                 while(GPIO_ReadInputPin(GPIOB,GPIO_PIN_3)==0);                 Start_Flag++;                 if(Start_Flag > 3)                 Start_Flag=0;         }  }             if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)         {         delay(50);         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0)//sw1         {                 while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_1)==0);                 if(Start_Flag==3)                 {                 Store_Turn_off_Time+=1;                 if(Store_Turn_off_Time> 510)//0803                 Store_Turn_off_Time=0;                 Turn_off_Time= Store_Turn_off_Time;                 Night_Mode_Status=0;                 }                 if(Start_Flag< 2)//-顯示電壓電流都可以手動輸出------------0728                 {                 OutPut_Mode++;//ON-- AUTO -- OFF                 if(OutPut_Mode> 2)                 OutPut_Mode=0;                 }                                  }  }         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)//sw2         {         delay(50);         if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0)         {                 while(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==0);                 if(Start_Flag==3)                 {Turn_off_Time;                 Store_Turn_off_Time+=10;                 if(Store_Turn_off_Time> 510)//0803                 Store_Turn_off_Time=0;                 Turn_off_Time= Store_Turn_off_Time;                 Night_Mode_Status=0;                 }         }  }          if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)//PC6press sw5         {         delay(50);         if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0)         {                 while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)==0);                 if(Start_Flag==3)                 {                 Store_Turn_off_Time-=1;                 if(Store_Turn_off_Time> 510)//0803                 Store_Turn_off_Time=0;                 Turn_off_Time= Store_Turn_off_Time;                 Night_Mode_Status=0;                 }                  }         }  }     void delay(unsigned int time) {         while(time--); }   void TransData(void)//顯示用的轉換 {        if(Start_Flag==2) {      //溫度顯示         Hundreds=(Degree_C%100)/10;         Tens=Degree_C%10;         Units=Degree_0C; } else         {//電壓電流顯示         Hundreds=voltage/100;         Tens=(voltage%100)/10;         Units=voltage%10; } }   void Display(void) {               GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY7SEGMENT         GPIO_WriteLow(GPIOE,GPIO_PIN_5);         if(Hundreds>0)         {                 GPIO_Write(GPIOC,pcdis[Hundreds]);                         if(pedis[Hundreds])                                 GPIO_WriteHigh(GPIOE,GPIO_PIN_5);                                 else                                 GPIO_WriteLow(GPIOE,GPIO_PIN_5);                         }                 else                 {                 GPIO_Write(GPIOC,0x00);//百位消零                  GPIO_WriteLow(GPIOE,GPIO_PIN_5);//去除A節     }                         GPIO_Write(GPIOD,0x10);//趨動百位數   if(Start_Flag==0)//電流加上小數點             GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//加上小數點                         delay(500);                                        GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);                         delay(5);          GPIO_Write(GPIOC,pcdis[Tens]);         if(pedis[Tens])         GPIO_WriteHigh(GPIOE,GPIO_PIN_5);         else          GPIO_WriteLow(GPIOE,GPIO_PIN_5);                         GPIO_Write(GPIOD,0x08);//趨動十位數  if((Start_Flag==1)||(Start_Flag==2))//溫度加上小數點             GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//加上小數點                         delay(500);                         GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);                         delay(5);              GPIO_Write(GPIOC,pcdis[Units]);         if(pedis[Units])//消除a節問題         GPIO_WriteHigh(GPIOE,GPIO_PIN_5);         else          GPIO_WriteLow(GPIOE,GPIO_PIN_5);                         GPIO_Write(GPIOD,0x04);//趨動個位數                         delay(500);                         GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);//消除殘影                         delay(5);    }     void GPIOinit(void) {         GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY7SEGMENT         GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAY3DIGIT         GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//DISPLAYSEGMENT A         GPIO_WriteLow(GPIOE,GPIO_PIN_5);         GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT+/- TIME         GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_IN_PU_NO_IT);//INPUT+ FIRE POWER         }       void tim1init(void)//1秒1計數 { TIM1_TimeBaseInit(19,TIM1_COUNTERMODE_UP,10000,0);//2M/20=100khz除10000次=10hz TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE); TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE); TIM1_Cmd(ENABLE); }   void tim1svc(void)//1/10秒1計數 {          //-------1/10秒 作一次的工作 One_Tenth_Flag --> AD轉換  //-------1秒 作一次的工作 One_Sec_Flag --> 計秒 PWM 開關         //-------1分鐘作一次的工作 One_Minute_Flag --> 倒數計時關 斷MOS_OUTPUT      檢查日落         //-------1小時作一次的工作 One_Hour_Flag  --> 計時      One_Tenth_Flag=1;  One_Tenth_Count++;  if(One_Tenth_Count == 10)  {          One_Sec_Flag=1;          One_Tenth_Count=0;         //PhotoVoltaic_Status=(GPIO_ReadInputPin(PV_PORT,PV_INPUT));//太陽電池lo就是下山          One_Sec_Count++;          if(One_Sec_Count == 60)//----------------60          {                  One_Sec_Count=0;                  One_Minute_Flag=1;                  One_Minute_Count++;                  PhotoVoltaic_Status=(GPIO_ReadInputPin(PV_PORT,PV_INPUT));//太陽電池lo就是下山                  if(One_Minute_Count==60)                  {                          One_Minute_Count=0;                          One_Hour_Flag=1;                  }          }  }    adc_update_flag=1;//ADC轉換一次以避免過度忙碌   if(PWM_Do)//中斷中執行pwm 充電  {          Charge_MOS1_PWM_Mode();  }           TIM1_ClearFlag(TIM1_FLAG_UPDATE); }     void tim6init(void) {         TIM6_TimeBaseInit(TIM6_PRESCALER_32,250);//TIM6_PRESCALER_8TIM6_TimeBaseInit         TIM6_SetCounter(250);         TIM6_ITConfig(TIM6_IT_UPDATE,ENABLE);//2Mhz/8/250         TIM6_Cmd(ENABLE); }   void tim6svc(void) {  display_time++;  if(display_time==3)  {         if(Start_Flag< 3)         TransData();         Display();  display_time=0;   }    count6++;  if(count6==50)//250>>25  {  KeyScan();  count6=0;  }  if(Turn_off_Time==1)//倒數計時到1分鐘  GPIO_WriteReverse(GPIOD,BUZZER);         TIM6_ClearITPendingBit(TIM6_IT_UPDATE); }     unsigned int NTCresist(void) { unsigned int resist; resist=(unsigned int)((unsignedlong)(Temperature_AD_count)*10000/(1000-Temperature_AD_count)); return resist; }     void ADConvert(void) {         unsignedchar ADCcount =0;         ADC1->CR1|=0x02;         ADC1_StartConversion();         while(ADCcount<10)         {                 while(ADC1_GetFlagStatus(ADC1_FLAG_EOC)==RESET);                 ADC1_ClearFlag(ADC1_FLAG_AWS0);                 ADCValue[ADCcount]=ADC1_GetConversionValue();                 ADCcount++;         }         ADC1->CR1&= ~0x02; }   void DigitalFiltering(void) {         unsignedchar i,j;         unsignedchar cptemp;                  for(i=10;i>=1;i--)         {                 for(j-0;j<(i-1);j++)                 {                         if(ADCValue[j]>ADCValue[j+1])                         {                                 cptemp=ADCValue[j];                                 ADCValue[j]=ADCValue[j+1];                                 ADCValue[j+1]=cptemp;                         }                 }         }         DataADC=0;         for(i=2;i<=7;i++)         {                 DataADC+=ADCValue;         }         DataADC/=6;            }         unsignedchar Compare_tempres(unsigned int TR)//電阻查表成為溫度 {  unsigned char cmp_cnt;  cmp_cnt =0;  while (TR<tempresist[cmp_cnt])  {   cmp_cnt++;   if(cmp_cnt>140)  break;  }  return cmp_cnt; }   void ADC_Temperature(void) { //DataADC= Temperature_AD_count;//把溫度更新值 NTCvalue=NTCresist();//溫度AD值轉換成溫度電阻 Degree_C = Compare_tempres(NTCvalue);//溫度電阻查表成溫度值 Degree_0C= ((tempresist[Degree_C-1]-NTCvalue)*10)/(tempresist[Degree_C-1]-tempresist[Degree_C]);//差分成小數 }   void Display_Time(void)//顯示時間 {         Hundreds=Turn_off_Time/100;         Tens=(Turn_off_Time%100)/10;         Units=Turn_off_Time%10;         }   //改成電壓電流 溫度每秒讀取一次用為系統及時需要 void AD_Data_Update(void) { if(adc_update_flag==1)//定時更新減少mcu負擔  {  switch(AD_read_count)   {           case 0:Current_AD_count = ADC1Set(DCCurrent);                                         Real_Current=(unsignedint)((unsigned long)Current_AD_count*2600/1023);//電流有誤差約大0.2a使用.1*2歐姆電阻顯示1.00A 3000.2600                                             break;                             case 1:Voltage_AD_count =ADC1Set(DCVoltage);                                         Real_Voltagea=(unsignedint)((unsigned long)Voltage_AD_count*200/1023);//電壓ok 顯示12.0v                                         Real_Voltage=Real_Voltagea-(Real_Current*2/100);                                 break;                 case 2:Temperature_AD_count =ADC1Set(DCTemperature);                                 break;                                         default: break;          }  AD_read_count++;  if(AD_read_count > 2)    AD_read_count = 0;  } adc_update_flag=0; }   unsigned int ADC1Set(ADC1_Channel_TypeDefADC_Channel)//讀取不同的AD通道 {  u16 ADresult; { ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel,ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM,DISABLE,ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL0,DISABLE);  ADConvert();  DigitalFiltering();  ADresult=DataADC;  DataADC=0;  adc_update_flag=0;  }  return ADresult; }     void CHARGE_OUTPUT_Init(void) {         //#defineNORM_Repair_Select GPIOB //----20140908 modify hi-normal Lo-repair  //#define NORM_Repair GPIO_PIN_7 //----20140908 modify hi-normalLo-repair         //u8NORM_Repair_flag                 GPIO_Init(CHARGE_PORT,CHARGE1_MOS,GPIO_MODE_OUT_PP_LOW_SLOW);                 GPIO_WriteLow(CHARGE_PORT,CHARGE1_MOS);    //GPIO_Init(CHARGE_PORT,CHARGE2_MOS,GPIO_MODE_OUT_PP_LOW_SLOW );          // GPIO_WriteLow(CHARGE_PORT,CHARGE2_MOS);                 GPIO_Init(OUT_PUT_MOS_PORT,OUT_PUT_MOS,GPIO_MODE_OUT_PP_LOW_SLOW);                 GPIO_WriteLow(OUT_PUT_MOS_PORT,OUT_PUT_MOS);                 GPIO_Init(PV_PORT,PV_INPUT,GPIO_MODE_IN_FL_NO_IT);//-----------0730                 GPIO_Init(NORM_Repair_Select,NORM_Repair_PIN,GPIO_MODE_IN_FL_NO_IT);//-----------                 PWM_Cycle_Complete=1;         }   void Charge_MOS1(FunctionalState NewState) {         if(NewState!=DISABLE)         GPIO_WriteHigh(CHARGE_PORT,CHARGE1_MOS);         else         GPIO_WriteLow(CHARGE_PORT,CHARGE1_MOS); }   /* void Charge_MOS2(FunctionalState NewState) {         if(NewState!=DISABLE)         GPIO_WriteHigh(CHARGE_PORT,CHARGE2_MOS);         else         GPIO_WriteLow(CHARGE_PORT,CHARGE2_MOS); } */   void Turn_MOS_OutPut(FunctionalStateNewState)//sw1--ON sw2--OFF---0803 {         if(NewState!=DISABLE)         {         GPIO_WriteHigh(OUT_PUT_MOS_PORT,OUT_PUT_MOS);         }         else         {         GPIO_WriteLow(OUT_PUT_MOS_PORT,OUT_PUT_MOS);         } }         void Charge_MOS1_PWM_Mode(void) {  if(One_Sec_Flag)//One_Sec_Flag  {  if(PWM_On_Count != 0)    {                  PWM_On_Count--;                  One_Sec_Flag=0;                  if(PWM_On_Count == 0)                  {                  Charge_MOS1(DISABLE);                         }          }            if(PWM_On_Count==0)            {                          PWM_Off_Count--;                          One_Sec_Flag=0;                  }                      }          if(PWM_Off_Count==0)          {                  PWM_Cycle_Complete=1;                  PWM_Do=0;          }         }  //----------------0801--------------   void PV_Down_Work (void)         {         if((PhotoVoltaic_Status==0)&(Low_Bat_Flag==0))//太陽電池lo就是下山&電壓正常               {              if (Night_Mode_Status ==0)//第一次重新載入                      {                        Night_Mode_Status =1;                                   Turn_off_Time = Store_Turn_off_Time;                                  }                                 if(One_Minute_Flag ==1)                                 {                                         One_Minute_Flag=0;                                         if(Turn_off_Time== 0)                                                 {                                                         Turn_MOS_OutPut(DISABLE);                                                         MOS2_Status=0;                                                 }                                         else                                                 {                                                         Turn_off_Time--;                                                         FORCE_Turn_MOS_ON();//----0803                                                 }                                                               }         //-------------------------------------                         }                         else//電池電壓過低                                  {                                         Turn_MOS_OutPut(DISABLE);                              MOS2_Status=0;                  }         if(PhotoVoltaic_Status!=0)//                   {                 Turn_off_Time= Store_Turn_off_Time;                 Night_Mode_Status=0;//可以再次設定定時                         }         }            void FORCE_Turn_MOS_ON(void) {         if(Low_Bat_Flag==0)     {                                 if(MOS2_Status!=1)                       {                                 Turn_MOS_OutPut(ENABLE);                                 MOS2_Status=1;                                 }                 }         else         {         Turn_MOS_OutPut(DISABLE);         MOS2_Status=0;         }       }   void FORCE_Turn_MOS_OFF(void) {         if(MOS2_Status!= 0)         {         Turn_MOS_OutPut(DISABLE);         MOS2_Status=0;        } }   void Charge_Condition_Work(void) {         //充電部分;比較假如電池電壓高於15.9v就不輸出切斷充電,14.5v就進入 pwm 模式,低於14.5v就全輸出不控制電流         //放電部分;若低於11.5v就停止輸出         //pwm模式就要作部份的分割可以分成5段         if((Real_Voltage> Charge_High_Limit)||(Real_Current > Current_Limit))//tune off chargingoperation overcurrent or overvoltage         {                 Charge_MOS1(DISABLE);                 PWM_Do=0;         }         if((Real_Voltage<= Charge_High_Limit) && (Real_Voltage > Full_Charge))//PWM Mode           {                                   PWM_Do = 1;//start PWM charging in Timer mode                  if(PWM_Cycle_Complete==1)     {                         PWM_On_Count=(unsignedchar)(Charge_High_Limit - Real_Voltage)+1;//146-                         PWM_Off_Count=(unsignedchar)(Real_Voltage - Full_Charge)+1;//135                         Charge_MOS1(ENABLE);                         PWM_Cycle_Complete=0;                 }         }         if(Real_Voltage<= Full_Charge)//145         {           Charge_MOS1(ENABLE);                 PWM_Do=0;         } } /* void Charge_Condition_Work(void) { //RICKY CHIANG 建議的脈衝充電模式on4秒off1秒 20140821         //充電部分;比較假如電池電壓高於16.2v就不輸出切斷充電,13.5v就進入 pwm 模式,低於13.5v就全輸出不控制電流         //放電部分;若低於11.0v就停止輸出         //pwm模式就要作部份的分割可以分成5段         if(Real_Voltage> Charge_High_Limit_Top)//||(Real_Current > Current_Limit))//146-->162tune off charging operation overcurrent or overvoltage         {                 Charge_MOS1(DISABLE);                 PWM_Do=0;         }         if((Real_Voltage<= Charge_High_Limit_Top) && (Real_Voltage > Full_Charge))//PWMMode 小於162大於135          {                                   PWM_Do = 1;//start PWM charging in Timer mode                  if(PWM_Cycle_Complete==1)     {                         PWM_On_Count=4;//(unsignedchar)(Charge_High_Limit - Real_Voltage)+1;//146-                         PWM_Off_Count=2;//(unsignedchar)(Real_Voltage - Full_Charge)+1;//135                         Charge_MOS1(ENABLE);                         PWM_Cycle_Complete=0;                 }         }         if(Real_Voltage<= Full_Charge)//<135         {           Charge_MOS1(ENABLE);                 PWM_Do=0;         } }   */   //-------------------------------------------------------------------------- @far @interrupt void TIM1_OVF_IRQ(void) {         tim1svc(); }   @far @interrupt void TIM6_OVF_IRQ(void) {         tim6svc(); }     //Degree_0C=((tempresist[Degree_C-1]-NTCvalue)*10)/(tempresist[Degree_C-1]-(tempresist[Degree_C]); /* unsigned intGet_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)//網路上的例子 {   ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel,ADC1_PRESSEL_FCPU_D2,\     ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,DISABLE);    //你也可以用操作寄存器的方式代码如下,但未验证。    ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel,ADC1_ALIGN_RIGHT);     ADC_CR1 |= 0x01;      //开始启动转换             while(ADC1_GetFlagStatus()==RESET);   //等待转换结束    return ADC1_GetConversionValue(); //返回ADC结果 } //这个初始化代码很重要,不能省,每次切换通道都要初始化一次! //main函数中直接调用 // TempADC=Get_ADCCH_Value(ADC1_CHANNEL_1); //获取AD转化值 */ #ifdef USE_FULL_ASSERT   /**   *@brief  Reports the name of the sourcefile and the source line number  *   where the assert_param errorhas occurred.   *@param file: pointer to the source file name   *@param line: assert_param error line source number   *@retval : None   */ void assert_failed(u8* file, u32 line) {    /*User can add his own implementation to report the file name and line number,     ex: printf("Wrong parameters value: file %s on line %d\r\n",file, line) */     /*Infinite loop */  while (1)   {   } } #endif   /******************* (C) COPYRIGHT 2011STMicroelectronics *****END OF FILE****/   
 
 
 |