亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? liion_bc_main.c

?? 基于單片機的鋰電池充電源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
//  voltage in mV, and temperature in C, 2% accurate.
//
int Monitor_Battery(unsigned char value)
{
  char i;
  unsigned long av =0;
  long signed result;

  ADC0CF = (SYSCLK/5000000) << 3;       // ADC conversion clock = 5.0MHz
  ADC0CF &= 0xF8;                       // Clear any Previous Gain Settings
  
  switch (value)
  {
    case TEMPERATURE:
      Turn_PWM_Off();                   // Turn PWM Off   
      AMX0SL = TBAT;                    // Select appropriate input for AMUX
      ADC0CF |= 0x02;                   // Set PGA gain = 2
      break; 
     
    case VOLTAGE: 
      AMX0SL = VBAT;                    // Select appropriate input for AMUX
      ADC0CF |= 0x01;                   // Set PGA gain = 1
      break;   

    case VOLTAGE_PWM_OFF: 
      Turn_PWM_Off();                   // Turn PWM Off   
      AMX0SL = VBAT;                    // Select appropriate input for AMUX
      ADC0CF |= 0x01;                   // Set PGA gain = 1
      break;  

   case CURRENT: 
      AMX0SL = IBAT;                    // Select appropriate input for AMUX
      ADC0CF |= 0x03;                   // Set PGA gain = 4
      break;
   
  }  
  
  //Compute average of next 10 A/D conversions
  for(av=0,i=10;i;--i){ 
    AD0INT = 0;                         // clear end-of-conversion indicator
    AD0BUSY = 1;                        // initiate conversion
    while(!AD0INT);                     // wait for conversion to complete
    av = av+ADC0;
  }

  av = av/10;                           // Compute the average
  av = av<<8;                           // Convert to 16-bit conversion
                                        // ...to account for 16-bit cal.
                                        //    coefficients

  PCA0CPM0 = 0x42;                      // Turn on PWM

  switch (value)
  { case TEMPERATURE:
      result =  (long) av * 1000/TEMP_SLOPE; 
      break;

    case VOLTAGE:
    case VOLTAGE_PWM_OFF:
    result = (av - VOLT_OFFSET.l);      // Account for System Errors
    result /= VOLT_SLOPE.l;             // Convert to Voltage in Millivolts
    result *= 100;                      // Account for Math Truncation Error
    result *= RESAB;                    // Account for Divide Resistors
    result /= RESB;                   
    break;
    case CURRENT:
      result =  av*2;                   // Account for Differential Mode   
      result -= I_NOAMP_OFFSET.l;       // Account for System Errors
      result /= I_NOAMP_SLOPE.l;        // Convert to Milliamps
      result *= 100;                    // Account for Math Truncation Error
      result /= RSENSE;                 // Account for Sense Resistor
      result *= RESAB;                  // Account for Divide Resistors
      result /= RESB;
      result /= CURRENT_GAIN;
      break;
  }

  return (int) result;     
}

//-----------------------------------------------------------------------------
// Bulk_Charge Function
//-----------------------------------------------------------------------------
void Bulk_Charge(void)
{
  unsigned int temp = 0;
  unsigned int bulk_finish_hour = 0;
  unsigned int bulk_finish_min = 0;
  unsigned int delay_hour = 0;  
  unsigned int delay_min = 0;
  unsigned int last_min = 0;
                                          
  Reset_Time_Base();                    // Reset Time Base to zero

                                        // Calculate BULK charge finish time
  bulk_finish_min = (TIME.min + MAX_TIME_BULK);
  bulk_finish_hour = TIME.hour;
  while (bulk_finish_min > 60)
  {
    bulk_finish_min = bulk_finish_min - 60;
    bulk_finish_hour++;
  }

  CONST_C = 1;                          // Start in constant current charge mode
  DELAY   = 0;                          // Reset timer DELAY
    

  temp = Monitor_Battery(TEMPERATURE);  // Monitor Temperature
                                        // Is temperature within range? 

  if ((temp > MIN_TEMP_ABS) && (temp < MAX_TEMP_ABS))
  {
    temp = Monitor_Battery(VOLTAGE);    // Monitor Voltage
                                        // Is Voltage within range?  
    if ((temp <= (MAX_VOLT_ABS + VOLT_TOLERANCE)) && temp > MIN_VOLT_BULK)
    {
      PCA0CPM0 = 0x42;                  // Configure CCM0 to 8-bit PWM mode
    
      // Enter main loop in Bulk_Charge()
      while ((BULK == 1) && (ERROR == 0))
      {
        if (CONST_C == 1)
          Regulate_Current(I_BULK);     // Charge with Constant Current
        
        else if (CONST_V == 1)
          Regulate_Voltage();           // Charge with Constant Voltage
               
        // Now, Check for error and charge termination conditions
        // If above max charge time, flag error    
        // Test for BULK Charge Time Out

                                        // Monitor Time 
        if ((TIME.hour == bulk_finish_hour) && (TIME.min == bulk_finish_min) 
           &&  (DELAY == 0))                               
        {
          Turn_PWM_Off();               // Turn Off PWM
          TIME_MAX = 1;                 // Set Time max error flag
          ERROR    = 1;                 // Set general error flag 
        }

                                        // Monitor Temperature  
        temp = Monitor_Battery(TEMPERATURE);
        if ((temp < MIN_TEMP_ABS) && (temp > MAX_TEMP_ABS))
      {
          Turn_PWM_Off();               // Turn Off PWM
          
        if (temp < MIN_TEMP_ABS)          
            TEMP_MIN = 1;               // Set Temperature below minimum flag
          else
            TEMP_MAX = 1;               // Set Temperature exceeds maximum flag
                                            
          ERROR    = 1;                 // Set general error flag
        }

                                        // Minute elapsed?
                                        // Check for minimum current
                                        // if reached, enter last DELAY charge
        if (TIME.min != last_min)   
        {
          last_min = TIME.min;
          if ((CONST_V == 1) && (DELAY == 0) && (Monitor_Battery(CURRENT) 
             <= MIN_I_BULK))
          {
                                        // Calculate TOP OFF Battery Time finish time 
            delay_min = (TIME.min + BULK_TIME_DELAY);
            delay_hour = TIME.hour;
            while (delay_min > 60)
            {
              delay_min = delay_min - 60;
              delay_hour++;
            }            
            DELAY = 1;                  // Set Delay Flag
          }
 
                                        // Monitor Delay time, time up?
          if ((TIME.hour == delay_hour)&&(TIME.min == delay_min) &&
             (DELAY == 1))
          {
            Turn_PWM_Off();             // Turn Off PWM
            CONST_V = 0;                // Exit CONST_V
            CONST_C = 1;                // Prepare to enter CONST_C
            BULK = 0;                   // Prepare to exit BULK mode 
            LOWCURRENT = 1;             // Prepare to enter LOWCURRENT Mode
          }                         
        }                        
      }                                 // End Main While loop
    }

    else if(ERROR == 0)
    {
      if (temp > (MAX_VOLT_ABS + VOLT_TOLERANCE))
      { VOLT_MAX = 1;                   // Set Max Voltage error flag
        ERROR    = 1;                   // Set general error flag
      }
     else if(temp < MIN_VOLT_BULK)
      { VOLT_MIN = 1;                   // Set Minimum bulk voltage error flag  
        LOWCURRENT = 1;                 // Switch to LOWCURRENT mode
        BULK = 0;                       // Exit Bulk Charge mode
      }                                 // battery's voltage very low
    }     
  }       

  else if(ERROR == 0)                   // Absolute temperature out of range?
  {   
    if (temp < MIN_TEMP_ABS)          
     TEMP_MIN = 1;                      // Set Temperature below minimum flag
    else
     TEMP_MAX = 1;                      // Set Temperature exceeds maximum flag

      ERROR = 1;                        // Set general error flag
  }
}

//-----------------------------------------------------------------------------
// Lowcurrent_Charge 
//-----------------------------------------------------------------------------

void Lowcurrent_Charge(void)
{
  unsigned int temp = 0;
  unsigned int lowcurrent_finish_min = 0;
  unsigned int lowcurrent_finish_hour = 0;

  Reset_Time_Base();                    // Reset Time base to zero

                                        // Calculate LOWCURRENT finish time
  lowcurrent_finish_min = (TIME.min + MAX_TIME_LOWCURRENT); 
  lowcurrent_finish_hour = TIME.hour;
  while (lowcurrent_finish_min > 60)
  {
    lowcurrent_finish_min = lowcurrent_finish_min - 60;
    lowcurrent_finish_hour++;
  }

  // Enter Main Lowcurrent Loop. 
  // Only exits are upon error and full charge
  while ((LOWCURRENT == 1) && (ERROR == 0))  
  {    
    temp = Monitor_Battery(TEMPERATURE);// Get Temperature Reading
                                        // Is TEMPERATURE within limits 
    if ((temp > MIN_TEMP_ABS) && (temp < MAX_TEMP_ABS))   
    {
      // Is Battery's Charge Voltage below max charge voltage
      temp = Monitor_Battery(VOLTAGE);  // Get Voltage Reading
      if (temp <= (VOLT_LOWCURRENT + VOLT_TOLERANCE))
      {
        if (CONST_C == 1)               // CONST_C ?, charge w/ constant current
          Regulate_Current(I_LOWCURRENT);

        if (CONST_V == 1)               // CONST_V?, charge w/ constant voltage
          Regulate_Voltage();       
      
        if ((temp >= MIN_VOLT_BULK) && (DELAY == 0))// Bulk Threshold voltage met?
        { LOWCURRENT = 0;               // Exit LOWCURRENT mode
          BULK = 1;                     // Switch to Bulk Charge mode
        }
                                        // Check elapsed time 
        if ((TIME.hour == lowcurrent_finish_hour) && 
        ( TIME.min == lowcurrent_finish_min))
        {
          TIME_MAX = 1;                 // Set Time MAX error flag
          ERROR    = 1;                 // Set general error flag    
        }
      }
      else if(ERROR == 0)               // Voltage to high?
      {
        VOLT_MAX = 1;                   // Set Max voltage error flag
        ERROR    = 1;                   // Set general error flag
      }      
    }     
    else if(ERROR == 0)                 // Absolute temperature out of range?
    {   
      if (temp < MIN_TEMP_ABS)          
        TEMP_MIN = 1;                   // Set Temperature below minimum flag
      else
        TEMP_MAX = 1;                   // Set Temperature exceeds maximum flag
      
      ERROR = 1;                        // Set general error flag
    }
  }
}

//-----------------------------------------------------------------------------
// Main Function
//-----------------------------------------------------------------------------
void main(void)
{ 
  EA = 0;                               // Disable All Interrupts
  Reset_Time_Base();
  Config_F300();                        // Config F300
  CalibrateADCforMeasurement();         // Calibrate F300

  EA = 1;                               // Enable All Active Interrupts 
  
  while(1)
  {
    LED0 = 0;                           // Turn LED0 off    
   
    TERMINATION = 0x00;                 // Reset Termination Flags
    CHARGE_STATUS = 0x00;               // Reset Charge Status Flags
    BULK = 1;                           // Start in LOWCURRENT Charge mode
    CONST_C = 1;
    
    while (SW0 == 1);                   // Wait until SW0 pushed
    Delay_Loop();                       // Wait for Switch Bounce
    
    while (ERROR == 0)
    {
      if (BULK == 1)
      {
        LED0 = 1;                       // Turn LED0,indicates Bulk Mode
        Bulk_Charge();                  // Enter Bulk Charge Mode
     }                   
      if (LOWCURRENT == 1)
        Lowcurrent_Charge();            // Enter Lowcurrent_Charge function 
                                        // Toggle LED0 at 1 Hz rate via ISR
    }

    if (ERROR == 1)
    {
      Turn_PWM_Off();;                  // Turn PWM Off
      LED0 = 0;                         // Turn OFF LED0 to indicate "ERROR". 
      EA = 0;                           // Disable All Interrupts
      while (1);                        // Enter a eternal loop 
                                        // No recovery except "reset-button"
    }   
  } 
}

//-----------------------------------------------------------------------------
// PCA_ISR
//-----------------------------------------------------------------------------
// This routine counts the elapsed time in seconds, minutes, hours.
// It also toggles LED0 every second when in Lowcurrent Charge Mode.
// This routine interrupts every time the PCA counter overflows, every 256
//  SYSCLK cycles. After SYSCLK/256 interrupts, one second has elapsed.
// 
void PCA_OVERFLOW_ISR (void) interrupt 9
{ 
  PCA0CN = 0x40;                        // Reset all PCA Interrupt Flags

  PCA0H = 0x00;                         // Reset High Byte of PCA Counter 
                                        //   of 8-bit PWM we are using Module1 

  if (0x0000 == --TIME.t_count)
  {
    TIME.t_count = PWM_CLOCK;           // Reset 1 Second Clock
    if ( 60 == ++TIME.sec )             // Account for elapsed seconds
    {                                   // Reset second counter every minute
      TIME.sec = 0x00;                  
      if ( 60 == ++TIME.min )           // Account for elapsed minutes
      {                                 // Reset minute counter every hour
        TIME.min = 0x00;
        if ( 24 == ++TIME.hour )        // Account for elapsed hours
          TIME.hour = 0x00;             // Reset hour counter every day
      }
    }

    if ((LOWCURRENT == 1) && (ERROR == 0))
    {                                   // Blink LED0 at 1 Hz if in Lowcurrent 
      if (TIME.sec % 2)
        LED0 = 0;                       // Turn on LED every odd second
      else 
        LED0 = 1;                       // Turn on LED every even second
    }          
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩国产欧美视频| 成人高清视频在线观看| 亚洲高清免费一级二级三级| 国产精品素人视频| 国产精品丝袜久久久久久app| 精品美女在线播放| 精品理论电影在线观看| 欧美成人在线直播| 久久伊人蜜桃av一区二区| 精品奇米国产一区二区三区| 日韩精品在线网站| 欧美精品一区二区高清在线观看| 日韩一级黄色片| 欧美白人最猛性xxxxx69交| 精品三级在线观看| 久久夜色精品国产欧美乱极品| 精品国产乱码久久久久久闺蜜| 精品免费视频一区二区| 精品国产伦一区二区三区免费 | 欧美久久久久中文字幕| 在线不卡欧美精品一区二区三区| 3d动漫精品啪啪一区二区竹菊| 欧美一区二区三区喷汁尤物| 欧美大尺度电影在线| 久久久精品影视| 国产精品久久毛片av大全日韩| 综合在线观看色| 亚洲成人在线网站| 免费在线看成人av| 国产精品996| 一本色道久久加勒比精品| 欧美色视频一区| 欧美电影免费提供在线观看| 国产日产欧产精品推荐色| 亚洲视频一二三| 午夜精品在线视频一区| 激情成人午夜视频| 99久久久精品免费观看国产蜜| 欧美视频三区在线播放| 欧美v亚洲v综合ⅴ国产v| 国产精品美日韩| 亚洲成av人影院在线观看网| 91.com视频| 精品国产1区二区| 亚洲欧洲av在线| 日韩精品每日更新| 国产a久久麻豆| 欧美日韩一级二级三级| 久久只精品国产| 亚洲一区二区三区小说| 韩国在线一区二区| 色天使色偷偷av一区二区| 精品入口麻豆88视频| 最新不卡av在线| 男女性色大片免费观看一区二区 | 6080国产精品一区二区| 久久午夜电影网| 亚洲一二三四区不卡| 国产乱妇无码大片在线观看| 在线亚洲人成电影网站色www| 精品久久久久久久久久久院品网| 国产精品麻豆欧美日韩ww| 青青草成人在线观看| 99久久国产综合精品女不卡| 日韩视频在线观看一区二区| 亚洲日本电影在线| 国产一区二区三区蝌蚪| 欧美人与性动xxxx| 中文字幕 久热精品 视频在线| 日本网站在线观看一区二区三区| 99久久国产综合色|国产精品| 日韩欧美精品在线| 亚洲一区二区在线视频| 成人性生交大片免费看视频在线 | 91精品国产乱码久久蜜臀| 亚洲国产精华液网站w| 欧美a一区二区| 在线观看精品一区| 国产精品久久久久三级| 极品美女销魂一区二区三区免费| 欧美日韩亚洲综合| 亚洲女人的天堂| 成人三级在线视频| 精品国产一区二区国模嫣然| 国产一区二区三区高清播放| 裸体健美xxxx欧美裸体表演| 日本韩国一区二区| 国产精品天美传媒沈樵| 黑人精品欧美一区二区蜜桃 | 日韩一区二区在线看片| 亚洲综合网站在线观看| 99久久精品国产一区二区三区| 久久蜜桃香蕉精品一区二区三区| 欧美人牲a欧美精品| 亚洲精品视频一区| av亚洲精华国产精华精华 | 亚洲成人777| 色综合久久中文字幕| 中文字幕亚洲精品在线观看| 懂色一区二区三区免费观看| 久久久久久综合| 国产精品主播直播| 久久人人爽爽爽人久久久| 激情综合五月天| 精品国产一区a| 精品一区二区免费在线观看| 日韩精品一区二区三区老鸭窝 | 午夜欧美在线一二页| 在线视频你懂得一区| 亚洲自拍都市欧美小说| 欧美性色黄大片| 亚洲成va人在线观看| 欧美视频精品在线| 天堂午夜影视日韩欧美一区二区| 欧美美女网站色| 日韩精品久久理论片| 欧美一二三在线| 欧美男同性恋视频网站| 亚洲国产高清在线观看视频| 不卡影院免费观看| 国产精品电影一区二区三区| 91在线视频在线| 91免费国产在线| 亚洲欧美国产77777| 在线观看国产91| 丝袜脚交一区二区| 欧美va亚洲va| 成人在线视频一区| 亚洲欧洲制服丝袜| 欧美久久婷婷综合色| 国产专区欧美精品| 国产精品久久久久久久岛一牛影视 | 日韩成人免费看| 久久综合精品国产一区二区三区| 国产成人在线视频网站| 最新国产精品久久精品| 在线观看亚洲专区| 久久国产福利国产秒拍| 亚洲国产精品av| 欧美午夜精品久久久| 裸体健美xxxx欧美裸体表演| 欧美激情一区二区三区蜜桃视频| 色婷婷亚洲综合| 日本欧美肥老太交大片| 久久精品视频在线看| 亚洲欧美日韩国产综合在线| 欧美老肥妇做.爰bbww视频| 国产一区二区精品在线观看| 亚洲少妇最新在线视频| 欧美一区二区福利在线| 成人sese在线| 亚洲sss视频在线视频| 国产亚洲精品中文字幕| 欧美私人免费视频| 国产精品原创巨作av| 亚洲综合激情另类小说区| 精品成a人在线观看| 在线观看日韩电影| 国产美女精品人人做人人爽| 一区二区三区中文字幕精品精品| 日韩欧美激情四射| 色婷婷综合久久| 国产乱人伦偷精品视频免下载| 一卡二卡三卡日韩欧美| 久久久久久亚洲综合| 欧美日韩另类一区| eeuss鲁片一区二区三区 | 色哟哟欧美精品| 精油按摩中文字幕久久| 亚洲尤物在线视频观看| 国产人成一区二区三区影院| 在线成人av网站| 色www精品视频在线观看| 国产乱码精品一区二区三| 天天综合网天天综合色| 中文字幕制服丝袜成人av| 日韩精品专区在线影院观看| 欧美专区亚洲专区| 成人精品国产一区二区4080| 精一区二区三区| 日韩av电影免费观看高清完整版在线观看| 欧美激情在线免费观看| 日韩小视频在线观看专区| 欧美视频一区二区三区在线观看 | 久久成人免费网| 亚洲大型综合色站| 一区视频在线播放| 国产婷婷色一区二区三区在线| 91精品国产色综合久久ai换脸| 色婷婷亚洲精品| 成人国产视频在线观看| 国产尤物一区二区| 久久99精品久久久| 蜜臀91精品一区二区三区| 2023国产精品| 日产国产高清一区二区三区 | 日韩av电影天堂| 99久久精品免费看| 丁香桃色午夜亚洲一区二区三区| 久久国产精品72免费观看|