0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

模擬量的硬件和程序的設計

硬件攻城獅 ? 來源:頭條號電鹵藥丸 ? 2023-03-26 14:39 ? 次閱讀

單片機系統(tǒng)里對模擬量的處理要比數(shù)字量稍顯復雜,但是只要掌握了使用技巧,使用起來也很簡單,很多朋友一開始比較糾結(jié)于單片機的底層語言,非要先弄個明白才罷休,其實大可不必,重要的是我們要先學會怎么應用。

現(xiàn)以鉛酸電池電壓檢測充電電流檢測為例講解模擬量的硬件和程序的設計。

如圖1為28節(jié)鉛酸電池的電壓檢測電路,1--14節(jié)組成電池組1,15--28節(jié)組成電池組2;第1節(jié)正極為BAT+,14與15節(jié)之間為BATM,第28節(jié)負極為BAT-。輸入端的8個二極管的作用是鉗位作用;電路計算如圖所示。

aedc9376-caf1-11ed-bfe3-dac502259ad0.png

圖1:電池組電壓檢測電路

如圖2為鉛酸電池的充電電流檢測電路,TA1為工頻電流互感器,輸入的4個二極管為整流二極管,電流流過R37(510Ω)形成壓差△V。電路計算如圖所示。

af39d464-caf1-11ed-bfe3-dac502259ad0.png

圖2:電池組充電電流檢測電路

如圖3為單片機STM32F103CBT6,圖1和圖2的模擬信號輸入至單片機的PA5、PA6、PA7。

af5d9606-caf1-11ed-bfe3-dac502259ad0.png

圖3:STM32F103CBT6單片機

由于代碼較多,為便于瀏覽,我就把其中一部分以截圖的形式展示

如圖4為單片機adc.c文件的底層配置,把PA5、PA6、PA7端口配置成模擬輸入模式。

af7438c0-caf1-11ed-bfe3-dac502259ad0.png

圖4:配置端口模式

如圖5對以上三個模擬量進行模數(shù)轉(zhuǎn)換并緩存入數(shù)組ADC_ConvertedValue[3],得到的AD值的范圍是0~4096

af7ece48-caf1-11ed-bfe3-dac502259ad0.png

圖5:模數(shù)轉(zhuǎn)換并緩存

如圖6把以上兩個配置函數(shù)整合在一起,定義成模擬量的初始化函數(shù)void ADC1_Init(void)。

afa908c0-caf1-11ed-bfe3-dac502259ad0.png

圖6:初始化

如圖7在adc.h文件里聲明函數(shù)void ADC1_Init(void),另外幾個函數(shù)也在adc的c文件里定義的,后面附上源程序(非截圖)。

afb1b9b6-caf1-11ed-bfe3-dac502259ad0.png

圖7:聲明函數(shù)

如圖8在main()主函數(shù)里調(diào)用ADC1_Init()初始化函數(shù)(要去掉void),初始化函數(shù)一定要放在while(1)的前面,表示在進入while(1)無限循環(huán)前只執(zhí)行一次。Analog_Processing()為模擬量處理函數(shù),要放在while(1)無限循環(huán)里面(該函數(shù)在下面講)。

afc1ccfc-caf1-11ed-bfe3-dac502259ad0.png

圖8,函數(shù)調(diào)用

以下為模擬量在main.c文件里的定義。

s16 Charging_Current; //充電電流實際值
s16 Battery1_Voltage; //電池組1電壓實際值
s16 Battery2_Voltage; //電池組2電壓實際值
s16 Battery_Voltage;  //電池組總電壓值

下面三個函數(shù)的定義都在adc.c文件里面定義的。

以下代碼為模擬量處理函數(shù):①對數(shù)組ADC_ConvertedValue[3]緩存值進行濾波處理;②對濾波后的AD值轉(zhuǎn)換為實際值。

/******************************
模擬量處理函數(shù)
******************************/
void Analog_Processing(void)
{
//對AD值進行濾波
ADC_Charging_Current=Filter(ADC_ConvertedValue[0],ADC_Charging_Current,1,10);
ADC_Battery1_Voltage=Filter(ADC_ConvertedValue[1],ADC_Battery1_Voltage,1,10);
ADC_Battery2_Voltage=Filter(ADC_ConvertedValue[2],ADC_Battery2_Voltage,1,10);
//AD值轉(zhuǎn)換為實際值
Charging_Current = Adc_To_Act(ADC_Charging_Current, 10, 4096, 0, 220);//22.0A
Battery1_Voltage = Adc_To_Act(ADC_Battery1_Voltage, 10, 4096, 0, 267);//267V
Battery2_Voltage = Adc_To_Act(ADC_Battery2_Voltage, 10, 4096, 0, 267);//267V
//兩組電壓相加得到總電壓
Battery_Voltage = Battery1_Voltage + Battery2_Voltage;
}

以下代碼為濾波函數(shù),濾波函數(shù)有很多,采用合適的才是最實用的(該函數(shù)濾波后的值是連續(xù)變化的,有些濾波函數(shù)濾波后的值是跳變的)。

/******************************
濾波函數(shù)(base/k越大,容性越大)
該函數(shù)相當于是一個電容,通常取值k=1,base=10
******************************/
u16 Filter(u16 NewData, u16 OldData, u8 k, u8 base)
{
u16 uiResult;
if (NewData > OldData)
{
uiResult = NewData - OldData;
uiResult *= k;
uiResult += base >> 2;
uiResult /= base;
uiResult = OldData + uiResult; 
}
else if (OldData > NewData)
{
uiResult = OldData - NewData;
uiResult *= k;
uiResult += base >> 2;
uiResult /= base;
uiResult = OldData - uiResult; 
}
else
{
uiResult = NewData;
}

return(uiResult);
}

使用方法如下:NewData表示最新采用的模擬量;OldData表示濾波后的模擬量。

ADC_Battery1_Voltage=Filter(ADC_ConvertedValue[1],ADC_Battery1_Voltage,1,10);

為便于邏輯計算、控制及顯示,以下代碼是把AD值轉(zhuǎn)換為實際值,

/******************************
AD值轉(zhuǎn)換實際值函數(shù)
******************************/
s16 Adc_To_Act(s16 Adc_Value, s16 Pre_Adc_Min, s16 Pre_Adc_Max, s16 Pre_Act_Min, s16 Pre_Act_Max)
{
s32 _temp;
s32 _range;
_temp = (s32)((Adc_Value - Pre_Adc_Min) * (Pre_Act_Max - Pre_Act_Min) / (Pre_Adc_Max-Pre_Adc_Min)) + Pre_Act_Min;
_temp = Adc_Value - Pre_Adc_Min;
_range = Pre_Act_Max - Pre_Act_Min;
_temp = _temp * _range;
_range = Pre_Adc_Max - Pre_Adc_Min;
_temp = _temp + _range / 2;
_temp = _temp / _range;
_temp = _temp + Pre_Act_Min;
return(_temp);
}

使用方法如下:Adc_Value表示要轉(zhuǎn)換的模擬量;Pre_Adc_Min表示模擬量AD值的最小值;Pre_Adc_Max表示模擬量AD值的最大值;Pre_Act_Min表示轉(zhuǎn)換后實際值的最小值;Pre_Act_Max表示轉(zhuǎn)換后實際值的最大值;(以下最大實際值220表示22.0A,是因為數(shù)碼管顯示需要小數(shù)表示)。

Charging_Current = Adc_To_Act(ADC_Charging_Current, 10, 4096, 0, 220);//22.0A

要點:

①模擬量的采樣電路,我多采用運放的差分放大電路,原因是被測電壓可以和運放不用共地,且可有效抑制共模噪聲,可達到較高的精確線性測量,比如以上電池組的被測電壓的誤差與實際相差在0.3V左右;

②電池組輸入至運放的8個1M的電阻是兩個為一組的,且功率至少1/4W以上,因為在高壓下的電阻容易老化,為保險起見,通常一個電阻的最大壓差在100V以下為宜;

③電池組分為兩組檢測,一是為了降低元件所承受的電壓,二是為了監(jiān)視兩組電池電壓之間是否平衡,達到保護電池目的。

③函數(shù)應功能模塊化,且具備通用性質(zhì),便于移植和調(diào)用,對于很多朋友應先學會如何使用,底層代碼只要會配置就完全足夠了。

當然,以上提供的設計是我通常的做法,能滿足大多數(shù)的常規(guī)應用。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鉛酸電池
    +關注

    關注

    8

    文章

    256

    瀏覽量

    25395
  • 單片機
    +關注

    關注

    6023

    文章

    44376

    瀏覽量

    628385
  • 整流二極管
    +關注

    關注

    5

    文章

    342

    瀏覽量

    31076
  • 模擬量
    +關注

    關注

    5

    文章

    488

    瀏覽量

    25401
  • 電流檢測
    +關注

    關注

    13

    文章

    482

    瀏覽量

    40910

原文標題:模擬量采集從硬件到程序,從濾波到實際值轉(zhuǎn)換,多少人懂了

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    模擬量和開關

    模擬量和開關 在控制系統(tǒng)中,一個常見的術語就是模擬量和開關。 不論輸入還是輸出,一個參數(shù)要么是模擬量,要么
    發(fā)表于 12-11 11:38 ?2976次閱讀

    模擬量處理程序設計實驗

    實驗  模擬量處理程序設計實驗 一 、 實驗目的1、 熟悉PLC的功能指令。2、 熟悉對模擬量的處理的常用方法。3、&
    發(fā)表于 05-17 10:52 ?1300次閱讀

    模擬量輸入(AI)程序設計(利用LabVIEW實現(xiàn))

    【LabVIEW從入門到精通】8.1 模擬量輸入(AI)程序設計(利用LabVIEW實現(xiàn))
    發(fā)表于 01-08 16:03 ?0次下載

    通過DAQ實現(xiàn)模擬量輸入(AI)_labview程序案例

    程序案例通過DAQ實現(xiàn)模擬量輸入(AI),喜歡的朋友可以下載來學習。
    發(fā)表于 01-13 16:12 ?32次下載

    模擬量輸入(AI)_labview程序案例

    程序案例模擬量輸入(AI),喜歡的朋友可以下載來學習。
    發(fā)表于 01-13 16:12 ?18次下載

    模擬量輸出(AO)_labview程序案例

    程序案例模擬量輸出(AO),喜歡的朋友可以下載來學習。
    發(fā)表于 01-13 16:12 ?86次下載

    利用LabVIEW實現(xiàn)模擬量輸出(AO)_程序案例

    程序案例 利用LabVIEW實現(xiàn)模擬量輸出(AO)
    發(fā)表于 01-13 16:22 ?312次下載

    利用LabVIEW實現(xiàn)模擬量輸入(AI)_程序案例

    程序案例 利用LabVIEW實現(xiàn)模擬量輸入(AI)
    發(fā)表于 01-13 16:22 ?26次下載

    基于LabviewCVI(DLL+DAQ)的模擬量輸出(AO)_程序案例

    程序案例 基于LabviewCVI(DLL+DAQ)的模擬量輸出(AO)
    發(fā)表于 01-13 16:22 ?45次下載

    利用LabWindowsCVI實現(xiàn)模擬量輸入AI_程序案例

    程序案例 利用LabWindowsCVI實現(xiàn)模擬量輸入AI
    發(fā)表于 01-13 16:22 ?30次下載

    s7-200模擬量處理子程序

    s7-200模擬量處理子程序,介紹西門子200模擬量處理程序的源代碼
    發(fā)表于 01-20 15:56 ?11次下載

    深度講解模擬量硬件程序的設計

    在單片機系統(tǒng)里對模擬量的處理要比數(shù)字量稍顯復雜,但是只要掌握了使用技巧,使用起來也很簡單,很多朋友一開始比較糾結(jié)于單片機的底層語言,非要先弄個明白才罷休,其實大可不必,重要的是我們要先學會怎么應用。
    的頭像 發(fā)表于 04-28 17:28 ?2668次閱讀
    深度講解<b class='flag-5'>模擬量</b>的<b class='flag-5'>硬件</b>和<b class='flag-5'>程序</b>的設計

    模擬量和開關的區(qū)別

    模擬量和開關量具體的區(qū)別分別為:開關——是指輸出無源信號,模擬量——是指輸出有源信號。常用的一些探測器接入的有源信號即是模擬量。
    發(fā)表于 06-16 16:07 ?2.7w次閱讀

    開關模擬量是什么

    開關是指輸出無源信號,模擬量則是有源信號的輸出。通常使用探測器接入有源信號即模擬量。
    發(fā)表于 07-06 16:21 ?9917次閱讀

    模擬量濾波程序算法詳解

    就要對模擬量信號進行濾波,使其盡量消除現(xiàn)場的干擾,今天就給大家分享個模擬量濾波的FB塊,這個程序分為二種濾波位,一種是求全部采集到的模擬量的平均值 ,第二種是去除最大值 和最小值 再求
    的頭像 發(fā)表于 11-14 09:53 ?3569次閱讀