找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2509|回復(fù): 13
收起左側(cè)

單片機(jī)ADC檢測(cè)電壓怎樣校準(zhǔn)(電壓標(biāo)定)

[復(fù)制鏈接]
ID:169142 發(fā)表于 2022-2-16 21:46 | 顯示全部樓層 |閱讀模式
請(qǐng)問下,各位老大,單片機(jī)用ADC去檢測(cè)電壓,由于精度問題,怎樣做電壓校準(zhǔn)。比如,檢測(cè)一個(gè)鋰電池的電壓滿電是12V電量4個(gè)LED,11.75V點(diǎn)亮3個(gè)LED,11.35V點(diǎn)亮2個(gè)LED,10.65V點(diǎn)亮1個(gè)LED,9.6V判斷為低電壓自動(dòng)關(guān)斷。檢測(cè)精度為+/-0.01V。怎樣去校準(zhǔn)這幾個(gè)電壓點(diǎn),以51單片機(jī)為例。
謝謝。!
回復(fù)

使用道具 舉報(bào)

ID:72649 發(fā)表于 2022-2-16 23:46 來自觸屏版 | 顯示全部樓層
加常數(shù)修正
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2022-2-17 02:38 來自觸屏版 | 顯示全部樓層
就我知道的stc8的有內(nèi)部基準(zhǔn)電壓,測(cè)到的AD值換算成電壓時(shí)要根據(jù)基準(zhǔn)電壓校正。測(cè)量12v電壓還要做分壓,電阻的精度低了影響也很大。
回復(fù)

使用道具 舉報(bào)

ID:960157 發(fā)表于 2022-2-17 07:12 | 顯示全部樓層
MC1403電壓基準(zhǔn),軟件加修正。
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2022-2-17 08:18 | 顯示全部樓層
以STC單片機(jī)10位ADC來說,可以采用讀內(nèi)部基準(zhǔn)源來計(jì)算采集電壓值,這樣就可實(shí)現(xiàn)精準(zhǔn)電壓采集。如果達(dá)不到要求,就得加外部其準(zhǔn)源,對(duì)于你這個(gè)簡(jiǎn)單電路,加個(gè)基準(zhǔn)源顯示沒必要
回復(fù)

使用道具 舉報(bào)

ID:807651 發(fā)表于 2022-2-17 09:08 | 顯示全部樓層
求多次ad 取平均值
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-2-17 13:52 | 顯示全部樓層
STC8G或者STC8A系列有內(nèi)部穩(wěn)定的參考電壓(精度1%),可以用來作為基準(zhǔn)電壓,用于測(cè)量鋰電池
STC15系列不行,STC15系列的內(nèi)部參考電壓不是固定的
對(duì)于鋰電池通過電壓來大概顯示電量,一定要有一個(gè)完整的放電曲線數(shù)據(jù),用來進(jìn)行電量處理,因?yàn)殇囯妷悍烹姇r(shí)電壓會(huì)下降,不能用簡(jiǎn)單的電壓比例來計(jì)算電量
回復(fù)

使用道具 舉報(bào)

ID:169142 發(fā)表于 2022-2-17 19:01 | 顯示全部樓層

C語(yǔ)言怎么做常數(shù)修正?
回復(fù)

使用道具 舉報(bào)

ID:169142 發(fā)表于 2022-2-17 19:03 | 顯示全部樓層
wskufo 發(fā)表于 2022-2-17 07:12
MC1403電壓基準(zhǔn),軟件加修正。

軟件怎么做修正啊??
回復(fù)

使用道具 舉報(bào)

ID:169142 發(fā)表于 2022-2-17 19:04 | 顯示全部樓層
aking991 發(fā)表于 2022-2-17 08:18
以STC單片機(jī)10位ADC來說,可以采用讀內(nèi)部基準(zhǔn)源來計(jì)算采集電壓值,這樣就可實(shí)現(xiàn)精準(zhǔn)電壓采集。如果達(dá)不到要 ...

這個(gè)內(nèi)部基準(zhǔn)源是怎么讀取的???
回復(fù)

使用道具 舉報(bào)

ID:169142 發(fā)表于 2022-2-17 19:05 | 顯示全部樓層
wd1988 發(fā)表于 2022-2-17 09:08
求多次ad 取平均值

這個(gè)好像也達(dá)不到要求
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2022-2-17 23:33 來自觸屏版 | 顯示全部樓層
#ifndef __NTC_TY_H #define __NTC_TY_H  //#include <STC8HX.h>  #include "ADC.h"  #ifndef  BIAO_PIANYI         //阻值表偏移量 #define  BIAO_PIANYI                  10 #endif   float ntcty_read_temp(ADC_Name ntcn,uint8 wei,uint16 cankao);  //獲取ntc溫度 uint16 ntcty_read(ADC_Name ntcn,uint8 wei); //ntc轉(zhuǎn)換取均值一次 float ntcty_gongdian(uint8 ADW);//功能:根據(jù)內(nèi)部參考電壓計(jì)算ADC外部參考電壓, float ntcty_ADCdian(ADC_Name ntcn);//根據(jù)內(nèi)部參考電壓計(jì)算ADC電壓  //ntc_ty //數(shù)據(jù)放大1000倍方便整數(shù)計(jì)算 extern code uint16 ntc_ty[]; //------------------------------------------------------------------------------------------------------------------- //  @brief      ntc轉(zhuǎn)換取均值一次 //  @param      ntcn            選擇ntc通道 //  @param      wei      讀ADC次數(shù) //  @return     void //  Sample usage:               ntc_convert(ntc_P10, 10); //------------------------------------------------------------------------------------------------------------------- uint16 ntcty_read(ADC_Name ntcn,uint8 wei) {         uint8 y,i,u;     uint16 shuzu[10];         uint16 yaogan_max,yaogan_min,yaogan_sum;         y=wei;     adc_init(ntcn, ADC_SYSclk_DIV_2, ADC_12BIT);         if (ntcn > 15)ntcn = ntcn - 8;         for(i=0;i<y;i++)         {                 shuzu[i] = adc_read(ntcn);         }         for(u=0;u<2;u++)//拋棄最大值和最小值         {         yaogan_min = shuzu[0];                 yaogan_max = shuzu[0];                 for(i=0;i<y;i++)                 {                                                  if(yaogan_max < shuzu[i])                         {                            yaogan_max=shuzu[i];                         }                         if(yaogan_min >= shuzu[i])                         {                                 yaogan_min = shuzu[i];                         }                 }                                  for(i=0;i<y;i++)                 {                                                  if(yaogan_max==shuzu[i])                         {                            shuzu[i] =shuzu[y-1] ;                            break;                         }                    }                 for(i=0;i<y;i++)                 {                         if(yaogan_min==shuzu[i] )                         {                            shuzu[i] =shuzu[y-2] ;                            break;                                                      }                    }                 y=y-2;         }     yaogan_sum=0;         for(i=0;i<y;i++)         {            yaogan_sum=yaogan_sum+shuzu[i];//計(jì)算剩余AD值的和         }         yaogan_sum = yaogan_sum/y;//計(jì)算AD平均值         return yaogan_sum;//返回計(jì)算的AD平均值 }    //*******************************************************************/ //功能:讀ADC電壓值 //形參:無 //返回:電壓值 //詳解:根據(jù)內(nèi)部參考電壓計(jì)算ADC電壓, //*******************************************************************/ float ntcty_ADCdian(ADC_Name ntcn)//根據(jù)內(nèi)部參考電壓計(jì)算ADC電壓, {         uint16 adjg,adck;         adjg = ntcty_read(ntcn,6);         adck = ntcty_read(ADC_REF,6);     return 1.19/adck*adjg; }   //*******************************************************************/ //功能:讀供電電壓(ADC外部參考電壓) //形參:ADW:ADC的實(shí)際最高位數(shù)。12,10,8 //返回:電壓值 //詳解:根據(jù)內(nèi)部參考電壓計(jì)算ADC外部參考電壓, //*******************************************************************/ float ntcty_gongdian(uint8 ADW)//功能:根據(jù)內(nèi)部參考電壓計(jì)算ADC外部參考電壓, {         uint16 adjg; //        ntc_init(ADC_REF, ntc_SYSclk_DIV_2);         adjg = ntcty_read(ADC_REF,6);         switch (ADW) {         case 12:    return 4095*1.19/adjg;     break;         case 10:    return 2047*1.19/adjg;     break;         default:    return 255*1.19/adjg;     break;   }         } //======================================================================== // 描述: ntc從電阻分度表格里查找最靠近的位置. // 參數(shù): 電阻值*1000. // 返回: 分度表格里最靠近的位置. //======================================================================== uint8 ntcty_find_r(uint16 data) {     uint8  start_index, mid = 0, end_index;     uint16  dat;          start_index = 0;     end_index = 50;            // 2. 開始二分法查找     while (start_index < end_index)     {         mid = (end_index + start_index) >> 1;         dat = ntc_ty[mid];                  if (data < dat)         {             start_index = mid + 1;         }         else if (data > dat)         {             if (mid)             {                 end_index = mid;             }             else             {                 break;             }         }         else         {             return (mid);         }     }          return (mid); }  //======================================================================== // 描述: 根據(jù)查表結(jié)果計(jì)算溫度. // 參數(shù): 電阻值*1000. // 返回: 溫度. //======================================================================== float ntcty_get_value(uint16 data) {   uint8 index;   float temp;   data = (data > ntc_ty[0]) ? ntc_ty[0] : data;   data = (data < ntc_ty[50]) ? ntc_ty[50] : data;      index = ntcty_find_r(data);    if(ntc_ty[index]>data)   {     temp = index + (float)(ntc_ty[index]-data)/(ntc_ty[index]-ntc_ty[index+1]);//線性插值          return temp+BIAO_PIANYI-1;//偏移   }   else if(ntc_ty[index]<data)   {     temp =  index-(float)(data-ntc_ty[index])/(ntc_ty[index-1]-ntc_ty[index]);//線性插值     return temp+BIAO_PIANYI+1;//偏移   }   else   {     return index+BIAO_PIANYI;   } }  //======================================================================== // 描述: 獲取ntc溫度. // 參數(shù): None. // 返回: 溫度. //======================================================================== float ntcty_read_temp(ADC_Name ntcn,uint8 wei,uint16 cankao) {     float V,V0;         V0=ntcty_ADCdian(ntcn);//讀ADC電壓值     V=ntcty_gongdian(wei); //讀供電電壓     V=V/(V0-V)*cankao;     V = ntcty_get_value(V*1000);//電阻值放大1000倍查找溫度     V = (int)(10.0 * V + 0.5) / 10.0;//保留一位小數(shù)     return V*1.0; }  #endif
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2022-2-17 23:35 來自觸屏版 | 顯示全部樓層
給你看這個(gè)stc8的ntc庫(kù)測(cè)溫我用到了內(nèi)部基準(zhǔn)電壓校正AD電壓。的
回復(fù)

使用道具 舉報(bào)

ID:382454 發(fā)表于 2022-2-23 12:04 | 顯示全部樓層
要精準(zhǔn)測(cè)量,MCU板的基準(zhǔn)電源要用低溫漂的作為參考電源,至于怎么修正,進(jìn)行多次AD后,比如128次,再做平均值,即除于128,在這一段代碼里有一個(gè)基準(zhǔn)參照電源,比如參照電源是4V,在代碼里就是4000   你可以用福錄克萬用表測(cè)量對(duì)比一下,如果太低可以把參照源改成4010,計(jì)算出來不行再進(jìn)行微調(diào)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表