在單片機(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ì)算如圖所示。
圖1:電池組電壓檢測(cè)電路
如圖2為鉛酸電池的充電電流檢測(cè)電路,TA1為工頻電流互感器,輸入的4個(gè)二極管為整流二極管,電流流過R37(510Ω)形成壓差△V。電路計(jì)算如圖所示。
圖2:電池組充電電流檢測(cè)電路
如圖3為單片機(jī)STM32F103CBT6,圖1和圖2的模擬信號(hào)輸入至單片機(jī)的PA5、PA6、PA7。
圖3:STM32F103CBT6單片機(jī)
由于代碼較多,為便于瀏覽,我就把其中一部分以截圖的形式展示
如圖4為單片機(jī)adc.c文件的底層配置,把PA5、PA6、PA7端口配置成模擬輸入模式。
圖4:配置端口模式
如圖5對(duì)以上三個(gè)模擬量進(jìn)行模數(shù)轉(zhuǎn)換并緩存入數(shù)組ADC_ConvertedValue[3],得到的AD值的范圍是0~4096。
圖5:模數(shù)轉(zhuǎn)換并緩存
如圖6把以上兩個(gè)配置函數(shù)整合在一起,定義成模擬量的初始化函數(shù)void ADC1_Init(void)。
圖6:初始化
如圖7在adc.h文件里聲明函數(shù)void ADC1_Init(void),另外幾個(gè)函數(shù)也在adc的c文件里定義的,后面附上源程序(非截圖)。
圖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ù)在下面講)。
圖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)用。
審核編輯:湯梓紅
-
鉛酸電池
+關(guān)注
關(guān)注
8文章
264瀏覽量
25550 -
電路圖
+關(guān)注
關(guān)注
10316文章
10717瀏覽量
527229 -
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44490瀏覽量
632005 -
檢測(cè)電路
+關(guān)注
關(guān)注
13文章
305瀏覽量
58091 -
模擬量
+關(guān)注
關(guān)注
5文章
491瀏覽量
25481 -
電壓檢測(cè)
+關(guān)注
關(guān)注
5文章
92瀏覽量
27499
原文標(biāo)題:【單片機(jī)】實(shí)例講解單片機(jī)模擬量采集: 從硬件到程序, 從濾波到實(shí)際值轉(zhuǎn)換,有多少人懂了?
文章出處:【微信號(hào):設(shè)備維修屋,微信公眾號(hào):設(shè)備維修屋】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論