深圳應廣微控制器比較器測供電電源VDD電壓

深圳市泛海微電子公司部落格發表於2020-12-15

     應廣微控制器有很實用的功能,就是可以用內部的分壓電阻,內部1.2v參考電壓,和比較器一起,測試微控制器VDD電壓.厲害吧,不使用任何外部器件,測試供電的電源電壓.!當電池低壓的時候可以做相應的動作.比如休眠,進入低功耗等.不多說,上程式碼! 記得有問題可以聯絡我!

       這個程式碼結構結構不是很好,佈置一個作業,理解之後自己修改去.哈哈!模擬之後檢視ucVolt就可以知道電源電壓是多少.雖然不精確,但夠用.

#include "extern.h"

#define        f_Com    !p_Com_Out
BIT        p_Com_Out    :    gpcc.6;

BIT        f_getBat;

BYTE     ucVolt;
WORD     usTmp;

bit     FLAG_NMS;
byte    count;
word    T16COUNTER;

/*     子程式    */
void Tmr16InterInit ( void )
{
     /*計數值清零*/
     T16COUNTER  =488;
     /*ms標記reset*/
     FLAG_NMS     =0;
     
     /*使能定時器*/
     $     INTEN     T16;
     /*關中斷*/
     INTRQ         =     0;
     
     /*停止定時器*/
     T16M.5      =0;               
 
     STT16 T16COUNTER;
     
     /*計算方法16M/*/
     $     T16M     IHRC,/1,BIT11;                         /*全域性中斷開啟*/
}

/*比較器初始化*/
void InitCompare ( void )
{
    /*b7@1=開啟比較器
      b6@0=負輸入大於正輸入
      b5@0=比較器不用tm2_ck取樣
      b4@0=比較結果沒有極性相反
      b3:1@ 010=內部Band-gap電壓
      b0@1=PA4輸入0=內部電阻輸入*/
    gpcc=0b1_0_0_0_010_0;
//$ padier    0b111_0_100_1;
    /*
      b7@0=不輸出到PA0
      b6@0保留
      b5@0=高R
      b4@0=低R
      b3:0@0000-1111內部r值
      */
    gpcs=0B0_0_0_0_0000;
}

void GetBat ( void )
{
    /*設定模式 2-6,檢測3.2V*/
    gpcs=0B0_0_10_0110;
    .delay 10;
    if ( f_Com )
    {
        /*電壓低於3.2V,執行關機*/
        ucVolt=10; 
        f_getBat=0;
        PA=0B0001_0000;
    }
    else
    {    
        f_getBat=1; 
        PA=0B0010_0000;
    }

}


#if 1

/*取得結果*/
void GetComRes ( void )
{
    if (f_getBat)
    {
    f_getBat=0;
        
    /*設定模式 1-10,檢測2.6V*/
    gpcs=0B0001_1010;
    .delay 10;
    if ( f_Com )
    {
        /*電壓低於2.6V*/
        ucVolt=25;
        
    }
    else
    {
        /*設定模式 2-8,檢測2.8V*/
        gpcs=0B0_0_10_1000;
        .delay 10;
        if ( f_Com )
        {
            /*電壓低於2.8V*/
            ucVolt=27;
            
        }
        else
        {
            /*設定模式 2-7,檢測3.0V*/
            gpcs=0B0_0_10_0111;
            .delay 10;
            if ( f_Com )
            {
                /*電壓低於3.0V*/
                ucVolt=29;
                
            }
            else
            {
                /*設定模式 2-6,檢測3.2V*/
                gpcs=0B0_0_10_0110;
                .delay 10;
                if ( f_Com )
                {
                    /*電壓低於3.2V*/
                    ucVolt=31;
                    
                }
                else
                {
                    /*設定模式 2-5,檢測3.4V*/
                    gpcs=0B0_0_10_0101;
                    .delay 10;
                    if ( f_Com )
                    {
                        /*電壓低於3.4V*/
                        ucVolt=33;
                        
                    }
                    else
                    {
                        /*設定模式 1-7,檢測3.6V*/
                        gpcs=0B0_0_01_0111;
                        .delay 10;
                        if ( f_Com )
                        {
                            /*電壓低於3.6V*/
                            ucVolt=35;
                            
                        }
                        else
                        {
                            /*設定模式 3-9,檢測3.8V*/
                            gpcs=0B0_0_11_1001;
                            .delay 10;
                            if ( f_Com )
                            {
                                /*電壓低於3.8V*/
                                ucVolt=37;
                                
                            }
                            else
                            {
                                /*設定模式 2-3,檢測4.0V*/
                                gpcs=0B0_0_10_0011;
                                .delay 10;
                                if ( f_Com )
                                {
                                    /*電壓低於4.0V*/
                                    ucVolt=39;
                                    
                                }
                                else
                                {
                                    /*設定模式 3-8,檢測4.2V*/
                                    gpcs=0B0_0_11_1000;
                                    .delay 10;
                                    if ( f_Com )
                                    {
                                        /*電壓低於4.2V*/
                                        ucVolt=41;
                                        
                                    }
                                    else
                                    {
                                        /*設定模式 2-2,檢測4.4V*/
                                        gpcs=0B0_0_10_0010;
                                        .delay 10;
                                        if ( f_Com )
                                        {
                                            /*電壓低於4.4V*/
                                            ucVolt=43;
                                            
                                        }
                                        else
                                        {
                                            /*設定模式 2-1,檢測4.8V*/
                                            gpcs=0B0_0_10_0001;
                                            .delay 10;
                                            if ( f_Com )
                                            {
                                                /*電壓低於4.8V*/
                                                ucVolt=47;
                                                
                                            }
                                            else
                                            {    
                                                /*電壓高於4.8V*/
                                                ucVolt=50;
                                                

                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    }
}
#endif

void    FPPA0 ( void )
{
     /*使用這一行就可以看到測試出來電壓ucVolt為33*/
//    .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.3v;

     /*使用這一行就可以看到測試出來電壓ucVolt為41*/
    .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=4.0v;


    Tmr16InterInit();
    
    InitCompare();
    
    /*    delay 200x2000x0.5us=0.2s    */
    usTmp=200;
    while(usTmp--)
    {
          .delay 2000;
          wdreset;    //復位看門狗定時器
    }

    GetBat ();

    engint;
    
    while ( 1 )
    {    
        
        GetComRes();

    }
}


void    Interrupt ( void )
{
    pushaf;

    
    if ( Intrq.T16 )  
    {

        Intrq.T16    =    0;
        
        STT16 T16COUNTER;
            
        if ( count>0 )
        {
            count--;
        }
        else
        {
            count   =   9;
            /*1ms*/
            //FLAG_NMS=   1; 

            f_getBat=1;

        }

    }
    popaf;
}
/*QQ:326156566

相關文章