久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2450|回復: 13
打印 上一主題 下一主題
收起左側

單片機ADC檢測電壓怎樣校準(電壓標定)

[復制鏈接]
跳轉到指定樓層
樓主
ID:169142 發表于 2022-2-16 21:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問下,各位老大,單片機用ADC去檢測電壓,由于精度問題,怎樣做電壓校準。比如,檢測一個鋰電池的電壓滿電是12V電量4個LED,11.75V點亮3個LED,11.35V點亮2個LED,10.65V點亮1個LED,9.6V判斷為低電壓自動關斷。檢測精度為+/-0.01V。怎樣去校準這幾個電壓點,以51單片機為例。
謝謝!!!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:72649 發表于 2022-2-16 23:46 來自手機 | 只看該作者
加常數修正
回復

使用道具 舉報

板凳
ID:857072 發表于 2022-2-17 02:38 來自手機 | 只看該作者
就我知道的stc8的有內部基準電壓,測到的AD值換算成電壓時要根據基準電壓校正。測量12v電壓還要做分壓,電阻的精度低了影響也很大。
回復

使用道具 舉報

地板
ID:960157 發表于 2022-2-17 07:12 | 只看該作者
MC1403電壓基準,軟件加修正。
回復

使用道具 舉報

5#
ID:65956 發表于 2022-2-17 08:18 | 只看該作者
以STC單片機10位ADC來說,可以采用讀內部基準源來計算采集電壓值,這樣就可實現精準電壓采集。如果達不到要求,就得加外部其準源,對于你這個簡單電路,加個基準源顯示沒必要
回復

使用道具 舉報

6#
ID:807651 發表于 2022-2-17 09:08 | 只看該作者
求多次ad 取平均值
回復

使用道具 舉報

7#
ID:401564 發表于 2022-2-17 13:52 | 只看該作者
STC8G或者STC8A系列有內部穩定的參考電壓(精度1%),可以用來作為基準電壓,用于測量鋰電池
STC15系列不行,STC15系列的內部參考電壓不是固定的
對于鋰電池通過電壓來大概顯示電量,一定要有一個完整的放電曲線數據,用來進行電量處理,因為鋰電壓放電時電壓會下降,不能用簡單的電壓比例來計算電量
回復

使用道具 舉報

8#
ID:169142 發表于 2022-2-17 19:01 | 只看該作者

C語言怎么做常數修正?
回復

使用道具 舉報

9#
ID:169142 發表于 2022-2-17 19:03 | 只看該作者
wskufo 發表于 2022-2-17 07:12
MC1403電壓基準,軟件加修正。

軟件怎么做修正啊??
回復

使用道具 舉報

10#
ID:169142 發表于 2022-2-17 19:04 | 只看該作者
aking991 發表于 2022-2-17 08:18
以STC單片機10位ADC來說,可以采用讀內部基準源來計算采集電壓值,這樣就可實現精準電壓采集。如果達不到要 ...

這個內部基準源是怎么讀取的???
回復

使用道具 舉報

11#
ID:169142 發表于 2022-2-17 19:05 | 只看該作者
wd1988 發表于 2022-2-17 09:08
求多次ad 取平均值

這個好像也達不到要求
回復

使用道具 舉報

12#
ID:857072 發表于 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轉換取均值一次 float ntcty_gongdian(uint8 ADW);//功能:根據內部參考電壓計算ADC外部參考電壓, float ntcty_ADCdian(ADC_Name ntcn);//根據內部參考電壓計算ADC電壓  //ntc_ty //數據放大1000倍方便整數計算 extern code uint16 ntc_ty[]; //------------------------------------------------------------------------------------------------------------------- //  @brief      ntc轉換取均值一次 //  @param      ntcn            選擇ntc通道 //  @param      wei      讀ADC次數 //  @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];//計算剩余AD值的和         }         yaogan_sum = yaogan_sum/y;//計算AD平均值         return yaogan_sum;//返回計算的AD平均值 }    //*******************************************************************/ //功能:讀ADC電壓值 //形參:無 //返回:電壓值 //詳解:根據內部參考電壓計算ADC電壓, //*******************************************************************/ float ntcty_ADCdian(ADC_Name ntcn)//根據內部參考電壓計算ADC電壓, {         uint16 adjg,adck;         adjg = ntcty_read(ntcn,6);         adck = ntcty_read(ADC_REF,6);     return 1.19/adck*adjg; }   //*******************************************************************/ //功能:讀供電電壓(ADC外部參考電壓) //形參:ADW:ADC的實際最高位數。12,10,8 //返回:電壓值 //詳解:根據內部參考電壓計算ADC外部參考電壓, //*******************************************************************/ float ntcty_gongdian(uint8 ADW)//功能:根據內部參考電壓計算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從電阻分度表格里查找最靠近的位置. // 參數: 電阻值*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); }  //======================================================================== // 描述: 根據查表結果計算溫度. // 參數: 電阻值*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溫度. // 參數: 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;//保留一位小數     return V*1.0; }  #endif
回復

使用道具 舉報

13#
ID:857072 發表于 2022-2-17 23:35 來自手機 | 只看該作者
給你看這個stc8的ntc庫測溫我用到了內部基準電壓校正AD電壓。的
回復

使用道具 舉報

14#
ID:382454 發表于 2022-2-23 12:04 | 只看該作者
要精準測量,MCU板的基準電源要用低溫漂的作為參考電源,至于怎么修正,進行多次AD后,比如128次,再做平均值,即除于128,在這一段代碼里有一個基準參照電源,比如參照電源是4V,在代碼里就是4000   你可以用福錄克萬用表測量對比一下,如果太低可以把參照源改成4010,計算出來不行再進行微調。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区二区视频 | 亚州成人 | 欧美日韩在线播放 | 亚洲精品久 | 狠狠的干狠狠的操 | 国产精品久久久久久久久污网站 | 日韩精品一区二区三区中文在线 | 亚洲一区视频在线播放 | 四虎永久影院 | 最新国产在线 | 中文天堂在线一区 | cao在线 | 色婷婷影院 | 午夜影晥| 亚洲成人午夜电影 | 中文字幕高清视频 | 91爱爱·com| 综合久久国产 | 九九久久精品视频 | 日韩中文电影 | 欧美日韩毛片 | 三级免费av | 欧美综合在线观看 | 国产成人一区二 | 在线免费观看黄视频 | 国产在线精品一区二区三区 | 久久久亚洲 | 免费毛片在线 | 成人精品视频在线观看 | 免费观看一级特黄欧美大片 | 午夜视频在线免费观看 | 黄色av免费网站 | 成人a网 | 欧美日韩国产一区二区 | h视频在线免费 | 国产精品日韩一区二区 | 五月香婷婷 | 久久香蕉精品视频 | 最新中文字幕久久 | 久久久久久免费观看 | 国产丝袜av |