0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

深度講解模擬量的硬件和程序的設(shè)計(jì)

GReq_mcu168 ? 來源:今日頭條 ? 作者:電鹵藥丸 ? 2021-04-28 17:28 ? 次閱讀

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

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

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

4e7efe86-a7ff-11eb-9728-12bb97331649.png

圖1:電池組電壓檢測(cè)電路

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

4f3fc878-a7ff-11eb-9728-12bb97331649.png

圖2:電池組充電電流檢測(cè)電路

如圖3為單片機(jī)STM32F103CBT6,圖1和圖2的模擬信號(hào)輸入至單片機(jī)的PA5、PA6、PA7。

4f6098e6-a7ff-11eb-9728-12bb97331649.png

圖3:STM32F103CBT6單片機(jī)

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

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

4f760262-a7ff-11eb-9728-12bb97331649.png

圖4:配置端口模式

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

4f86db78-a7ff-11eb-9728-12bb97331649.png

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

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

4fc06fc8-a7ff-11eb-9728-12bb97331649.png

圖6:初始化

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

4fd31f92-a7ff-11eb-9728-12bb97331649.png

圖7:聲明函數(shù)

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

4ffcf466-a7ff-11eb-9728-12bb97331649.png

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

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

s16 Charging_Current; //充電電流實(shí)際值

s16 Battery1_Voltage; //電池組1電壓實(shí)際值

s16 Battery2_Voltage; //電池組2電壓實(shí)際值

s16 Battery_Voltage; //電池組總電壓值

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

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

/******************************

模擬量處理函數(shù)

******************************/

void Analog_Processing(void)

{

//對(duì)AD值進(jìn)行濾波

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)換為實(shí)際值

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í)用的(該函數(shù)濾波后的值是連續(xù)變化的,有些濾波函數(shù)濾波后的值是跳變的)。

/******************************

濾波函數(shù)(base/k越大,容性越大)

該函數(shù)相當(dāng)于是一個(gè)電容,通常取值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);

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

/******************************

AD值轉(zhuǎn)換實(shí)際值函數(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)換后實(shí)際值的最小值;Pre_Act_Max表示轉(zhuǎn)換后實(shí)際值的最大值;(以下最大實(shí)際值220表示22.0A,是因?yàn)?a target="_blank">數(shù)碼管顯示需要小數(shù)表示)。

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

要點(diǎn):

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

②電池組輸入至運(yùn)放的8個(gè)1M的電阻是兩個(gè)為一組的,且功率至少1/4W以上,因?yàn)樵?a target="_blank">高壓下的電阻容易老化,為保險(xiǎn)起見,通常一個(gè)電阻的最大壓差在100V以下為宜;

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

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

當(dāng)然,以上提供的設(shè)計(jì)是我通常的做法,能滿足大多數(shù)的常規(guī)應(yīng)用。
編輯:lyn

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

    關(guān)注

    8

    文章

    260

    瀏覽量

    25494
  • 模擬量
    +關(guān)注

    關(guān)注

    5

    文章

    491

    瀏覽量

    25451
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3161

    瀏覽量

    66003

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    plc模擬量的計(jì)算與優(yōu)勢(shì)

    模擬量是指那些連續(xù)變化的物理,它們可以在一定范圍內(nèi)取任意值。這些物理包括但不限于電壓、電流、壓力、溫度、速度和流量等。在PLC系統(tǒng)中,模擬量需要通過傳感器將其轉(zhuǎn)換為電信號(hào),然后再通
    的頭像 發(fā)表于 09-16 10:16 ?263次閱讀

    開關(guān)轉(zhuǎn)模擬量如何編程

    將開關(guān)(也稱為數(shù)字量或離散,通常是0或1的狀態(tài))轉(zhuǎn)換為模擬量(連續(xù)變化的電壓、電流或其他物理)的過程,在編程中通常不直接進(jìn)行硬件層面的
    的頭像 發(fā)表于 08-30 14:13 ?265次閱讀

    三菱plc模擬量輸出怎么寫

    編寫三菱PLC模擬量輸出程序是一個(gè)涉及多個(gè)步驟的過程,主要包括確定輸入輸出類型、選擇合適的模塊、配置PLC、編寫程序以及調(diào)試測(cè)試等。 一、引言 三菱PLC(可編程邏輯控制器)在工業(yè)自動(dòng)化控制領(lǐng)域具有
    的頭像 發(fā)表于 08-30 11:00 ?667次閱讀

    什么是IO模擬量模塊?

    IO模擬量模塊是工業(yè)自動(dòng)化領(lǐng)域中常用的一種設(shè)備,用于處理模擬信號(hào)。在工業(yè)控制系統(tǒng)中,模擬信號(hào)通常指的是連續(xù)變化的信號(hào),如溫度、壓力、流量等,這些信號(hào)可以用無限精細(xì)的數(shù)值表示。與之相對(duì)的是數(shù)字信號(hào),它只有有限的數(shù)值狀態(tài)(通常是0和
    的頭像 發(fā)表于 08-02 09:00 ?300次閱讀
    什么是IO<b class='flag-5'>模擬量</b>模塊?

    PLC獲取模擬量的方法

    、壓力、流量等,它們經(jīng)過傳感器轉(zhuǎn)換為電信號(hào)后,需要被PLC準(zhǔn)確讀取和處理。本文將詳細(xì)闡述PLC獲取模擬量的方法,包括硬件結(jié)構(gòu)、信號(hào)轉(zhuǎn)換、編程配置等方面,旨在為讀者提供全面而深入的指導(dǎo)。
    的頭像 發(fā)表于 06-18 10:58 ?519次閱讀

    星儀小課堂:開關(guān)模擬量詳解

    在現(xiàn)場(chǎng)儀表使用中,開關(guān)模擬量是使用最多的兩種輸入輸出方式。今天我們就用圖文結(jié)合的方式,詳細(xì)講解一下開關(guān)模擬量的原理是怎樣的。開關(guān)
    的頭像 發(fā)表于 06-18 09:47 ?402次閱讀
    星儀小課堂:開關(guān)<b class='flag-5'>量</b>與<b class='flag-5'>模擬量</b>詳解

    模擬量光端機(jī)/模擬量光纖轉(zhuǎn)換器的功能特性、選擇時(shí)需要考慮哪些因素?

    模擬量光端機(jī)是一種通過光纖遠(yuǎn)距離傳輸4~20mA電流模擬量信號(hào)的設(shè)備,它通過光纖將4~20mA電流模擬量信號(hào)進(jìn)行電-光轉(zhuǎn)換和光-電轉(zhuǎn)換,從而實(shí)現(xiàn)在光纖中的傳輸。這類光端機(jī)通常被設(shè)計(jì)為支持多種
    的頭像 發(fā)表于 05-27 14:53 ?386次閱讀
    <b class='flag-5'>模擬量</b>光端機(jī)/<b class='flag-5'>模擬量</b>光纖轉(zhuǎn)換器的功能特性、選擇時(shí)需要考慮哪些因素?

    模擬量PLC有哪些具體種類呢?

    模擬量PLC主要處理連續(xù)的模擬量信號(hào),與主要處理開關(guān)信號(hào)的PLC形成對(duì)比。模擬量PLC的種類可以從多個(gè)維度進(jìn)行劃分
    的頭像 發(fā)表于 04-08 10:05 ?517次閱讀

    三菱模擬量模塊的種類 三菱模擬量模塊的輸出值調(diào)整

    三菱模擬量模塊是工業(yè)自動(dòng)化領(lǐng)域常用的設(shè)備,用于將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào),并輸出給其他控制設(shè)備。根據(jù)不同的應(yīng)用需求,三菱模擬量模塊具有多種不同的類型和規(guī)格。本文將詳細(xì)介紹三菱模擬量模塊的
    的頭像 發(fā)表于 02-05 15:02 ?1295次閱讀

    plc模擬量輸出怎么接線 plc模擬量輸出是什么信號(hào)

    PLC模擬量輸出(PLC Analog Output)是指在PLC系統(tǒng)中,根據(jù)輸入信號(hào)的大小,通過模擬量輸出模塊將數(shù)字信號(hào)轉(zhuǎn)換為模擬量信號(hào)輸出到外部設(shè)備。這種輸出信號(hào)可以是電壓或電流等連續(xù)變化的信號(hào)
    的頭像 發(fā)表于 02-05 14:46 ?4608次閱讀

    請(qǐng)問PLC是如何讀取模擬量信號(hào)的?

    PLC讀取模擬量信號(hào)必須要有模擬量輸入模塊,即常說的AI模塊。
    的頭像 發(fā)表于 01-02 09:35 ?709次閱讀
    請(qǐng)問PLC是如何讀取<b class='flag-5'>模擬量</b>信號(hào)的?

    PLC開關(guān)信號(hào)和模擬量信號(hào)如何轉(zhuǎn)換?

    PLC開關(guān)信號(hào)和模擬量信號(hào)的轉(zhuǎn)化問題也是PLC的經(jīng)典應(yīng)用問題。要說清楚PLC開關(guān)信號(hào)和模擬量信號(hào)在PLC應(yīng)用中是如何轉(zhuǎn)化的,我們首先需要弄清楚幾個(gè)基本的PLC信號(hào)概念。
    發(fā)表于 12-17 10:05 ?1404次閱讀
    PLC開關(guān)<b class='flag-5'>量</b>信號(hào)和<b class='flag-5'>模擬量</b>信號(hào)如何轉(zhuǎn)換?

    單片機(jī)處理模擬量程序流程是如何的

    單片機(jī)處理模擬量程序流程是一種常見的應(yīng)用場(chǎng)景,單片機(jī)通常被用來處理各種類型的傳感器信號(hào),例如溫度傳感器、壓力傳感器、光敏傳感器等。在本文中,我將詳盡地描述單片機(jī)處理模擬量程序流程,
    的頭像 發(fā)表于 12-15 09:28 ?1273次閱讀

    模擬量模塊接線方法 模擬量模塊編程詳細(xì)介紹

    模擬量類型的模塊有三種:普通模擬量模塊、RTD模塊和TC模塊。普通模擬量模塊可以采集標(biāo)準(zhǔn)電流和電壓信號(hào)。其中,電流包括:0-20mA、4-20mA兩種信號(hào),電壓包括:+/-2.5V、+/-5V
    的頭像 發(fā)表于 11-10 14:17 ?1.2w次閱讀
    <b class='flag-5'>模擬量</b>模塊接線方法 <b class='flag-5'>模擬量</b>模塊編程詳細(xì)介紹

    smart模擬量庫(kù)指令

    smart模擬量庫(kù)指令
    發(fā)表于 10-30 15:55 ?8次下載