文章目錄
- 軟體抗干擾技術
- 數字信號的抗干擾措施
- 數字輸入信號軟體抗干擾措施
- 數字輸出信號軟體抗干擾措施
- 數字濾波
- 算術平均值濾波
- 中值濾波
- 滑動平均濾波
- 歸一化
- 差比和
- CPU及程式的抗干擾措施
- 復位
- 掉電保護
- Watchdog技術
- 總結
軟體抗干擾技術
前面介紹了一些硬體抗干擾技術,不難發現,要做好一個完美的硬體系統是需要花大心思的,而且很多硬體抗擾方案都需要借助一些元器件來實作,這在一定程度上增加了費用,而且也增加了硬體設計時的難度,這對于學生黨而言有些許的不友好,實際上,在抗擾技術方面除了之前提到的硬體抗擾技術外,我們常用的還有軟體抗擾技術,今天博主就來扒一扒我們智能車中常用的部分軟體抗擾技術,
開始介紹抗干擾技術之前,先給大家分享一個知識點吧,我們都知道對于一個控制系統,輸入信號越平滑越好,可大多數情況下輸入的資料往往需要我們處理后才能變得平滑,甚至有些波形十分凌亂我們還會采用一些數學方案讓他變得近似一條直線或者曲線,那么為什么一定要使用信號處理手段讓輸入信號變得平滑或者是近似線性呢?難道輸入原始信號就不能實作控制效果了嗎?(這里是筆者根據自動控制原理推測,并沒有明確的理論推斷,如有不妥,歡迎大家指出)
相信大家最容易想到的解釋就是,輸入信號決定了輸出信號,如果不處理這些雜亂的輸入信號,那么輸出的信號就會一片混亂,系統也就無法達到穩態,進而控制效果也就不理想,
對于這個疑問筆者有這樣一個想法,在自動控制原理以及計算機控制原理里面有介紹,我們平時研究的經典控制系統都是線性定常系統,學過自動控制原理的同學肯定都還記得有個叫穩態誤差的東西,在求穩態誤差的方法中,有一個方法是根據系統型別進行計算,想必下面這個表大家還有印象,當然沒學過自控的同學肯定沒印象,我們拋開那些理論知識,可以從表中看見兩個規律:
1.系統輸入r(t)不變時,隨著型別的提高,表中的資料越來越小,這個資料就是穩態誤差;
2.當系統型別不變時,隨之輸入信號的不斷升級(從位置信號1(t)—>速度信號t----->加速度信號1/2t^2)系統的穩態誤差不斷增加,

上面是理論部分的描述,接下來我們看個例子,考慮到有些同學沒學自控啊,這里不擺傳函這些東西;注意下面三幅圖,藍色代表輸入,紅色代表系統的輸出,
首先第一幅圖很明顯輸入是一個階躍信號可以理解為數字從0變為了1,該系統的輸出經過兩拍后可以實作無差跟隨,穩態誤差為零;
然后是第二幅圖,輸入信號是一個一次函式也就是速度信號,該系統也是經歷了兩拍后就可以無差跟蹤,穩態誤差為零;
最后是第三幅圖,可以發現輸入信號變成了一條曲線一個二次函式也就是加速度信號,此時可以發現系統輸出與輸入之間恒存在偏差,無法做到無差跟蹤,穩態誤差不再為零了,以此類推一下,如果輸入信號變成了一個三次函式,此時根據上面提到的理論,穩態誤差會進一步加大,系統輸出無法跟隨輸入信號,此時系統就沒法正常作業了,

根據上面這個例子,我們再擴充一下,智能車實際上也是一個線性定常系統,它肯定也要遵循上面的控制規律,假設我們小車是個二型系統,要想讓系統穩定作業,輸入信號是不是最多最多只能是加速度信號,輸入信號超過二次時系統就沒法無差跟隨輸入了,
有人可能會說,根據上面的理論知識,想讓系統可以跟隨更高階的信號不是還可以提高系統型別來實作嗎,顯然,提高系統型別也是一個可行方案,但是自控中所有的東西都是雙刃劍,有利它必然會帶來弊端,提高系統型別后,系統的穩定裕度就會減小,也就意味著控制器的引數更難調節,大家自己想想,現在一個PID的引數都要很長時間才能調的合適,如果再提高系統型別,是不是真的可以一年做車時間都用來調參了呢,除此之外,整個系統其他部分的環節已經固定了,要想改變系統型別只能改變控制器的演算法,這也會加大單片機內部的運算量,同時還會影響到系統的回應速度,
數字信號的抗干擾措施
數字輸入信號軟體抗干擾措施
干擾信號多呈毛刺狀,而且作用時間短,而數字信號作用時間相對要長得多,
改進:在采樣某一數字信號時,可多次重復采樣,直到連續兩次或兩次以上采樣結果完全一致方為有效,如果多次采樣后,信號始終變化不定,則說明干擾嚴重,就應停止采樣,并且發出報警信號,類似輸入如下圖時,

數字輸出信號軟體抗干擾措施
為了防止受數字輸出信號控制的輸出設備受干擾產生誤動作,最有效的方法是不斷重復輸出數字輸出信號,并且在可能條件下,輸出的重復周期越短越好,外設接收一個錯誤的資訊后,還來不及做出有效的反應,下一個正確的輸出資訊又到來了,就可以及時防止錯誤動作的發生,克服干擾的影響,
數字濾波
數字濾波是一種軟體演算法,它實作從采樣信號中提取出有效信號數值,濾除干擾信號的功能,
數字濾波與模擬濾波相比,具有很多優點,
首先,由于采用了程式實作濾波,無需硬體器件,不受外界的影響,也無引數變化等問題,所以可靠性高,穩定性好;
數字濾波可以實作對頻率很低(如0.01Hz)信號的濾波,克服了模擬濾波器的不足;
數字濾波還可以根據信號和干擾的不同,采用不同的濾波方法和濾波引數,具有靈活、方便、功能強等優點,
缺點:數字濾波不足之處在于濾波速度比硬體濾波要慢,會造成信號的延遲,影響系統回應速度;但鑒于數字濾波器具有的上述優點,在計算機控制系統中得到了廣泛的應用,下面介紹幾種常用的數字濾波方式,
算術平均值濾波
思路:
連續取 N 個采樣值進行算術平均運算
N 值較大時: 信號平滑度較高, 但靈敏度較低
N 值較小時: 信號平滑度較低, 但靈敏度較高
N 值的選取: 一般流量, N=12; 壓力: N=4
優點:
適用于對一般具有隨機干擾的信號進行濾波
這樣信號的特點是有一個平均值, 信號在某一數值范圍附近上下波動
缺點:
對于測量速度較慢或要求資料計算速度較快的實時控制不適用
比較浪費RAM

算術平均值濾波程式流程圖如下:

C語言代碼片,
// An highlighted block
/*
*/
#define N 12
char filter()
{
int sum = 0;
for ( count=0;count<N;count++)
{
sum + = get_ad();
delay();
}
return (char)(sum/N);
}
智能車中最常用于對ADC采集值進行處理,進行一個平滑處理消除個別毛刺信號, 代碼如下:
// An highlighted block
LnowADC[0] = ADC1_Read_Average(ADC1ch0_A0,10); // 左前側第1個電感,與賽道平行,采集各個電感的AD值
LnowADC[1] = ADC1_Read_Average(ADC1ch1_A1,10); // 左前側第2個電感,與垂直賽道,
LnowADC[2] = ADC1_Read_Average(ADC1ch8_B0,10); // 右前側第2個電感,與垂直賽道,
LnowADC[3] = ADC1_Read_Average(ADC1ch9_B1,10); // 右前側第1個電感,與賽道平行,
/*LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
【函式名】u16 ADC1_Read_Average(ADC_CHx_e ADC_Channel_x,uint8_t times)
【功 能】獲取幾次ADC1采樣值的平均值
【引數值】ADC_Channel_x , x為0~16
【回傳值】ADC讀到的值
【作 者】L Q
【最后更新】2021年1月22日
【軟體版本】V1.0
【呼叫樣例】 ad_v=ADC1_Read_Average(ADC1ch12_C2);
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ*/
u16 ADC1_Read_Average(ADC_CHx_e ADC_Channel_x,uint8_t times)
{
u32 temp_val=0;
u8 t,delay;
for(t=0;t<times;t++)
{
temp_val+=ADC1_Read(ADC_Channel_x);
for(delay=0;delay<50;delay++);
}
return temp_val/times;
}
中值濾波
思路:
連續采樣 N 次(N 取奇數)
把 N 次采樣值按大小排列
取中間值為本次有效值
B、 優點:
能有效克服因偶然因素引起的波動干擾
對溫度、 液位的變化緩慢的被測引數有良好的濾波效果
C、 缺點:
對流量、 速度等快速變化的引數不宜
C語言代碼片,
// An highlighted block
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0;count < N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++) //冒泡法
{
for (i=0;i<N-1-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf [i]= value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}
滑動平均濾波
遞推平均濾波法(又稱滑動平均濾波法)
思路:
把連續取 N 個采樣值看成一個佇列
佇列的長度固定為 N
每次采樣到一個新資料放入隊尾,并扔掉原來隊首的一次資料.(先進先出原則)
把佇列中的 N 個資料進行算術平均運算,就可獲得新的濾波結果
N 值的選取: 流量, N=12; 壓力: N=4; 液面, N=4~12; 溫度, N=1~4
優點:
對周期性干擾有良好的抑制作用, 平滑度高
適用于高頻振蕩的系統
缺點:
靈敏度低
對偶然出現的脈沖性干擾的抑制作用較差
不易消除由于脈沖干擾所引起的采樣值偏差
不適用于脈沖干擾比較嚴重的場合
比較浪費 RAM
行內代碼片,
// An highlighted block
/*
*/
#define N 12
char value_buf[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buf[i++] = get_ad();
if ( i == N ) i = 0;
for ( count=0;count<N;count++) sum = value_buf[count];
return (char)(sum/N);
}

有關數字濾波器還有很多,大家可以根據自己的需求去嘗試,我也上傳了一個濾波器的檔案到資源,需要的同學自行下載,
歸一化
歸一化,見名知意,就是把所有采集到的引數轉換為同一個范圍的資料,歸一化的思路:獲取變數最大值,并記錄,后面所有的采集值都與此最大值進行對比,根據比值再×對應的資料范圍即可,
主要作用是消除更換場地后電磁信號出現的偏差, 代碼片,
// An highlighted block
/*************************************************************************
* 函式名稱:void InductorNormal(void)
* 功能說明:采集電感電壓并歸一化;
* 引數說明:無
* 函式回傳:無
* 修改時間:2020年11月18日
* 備 注: 注意要先標定運放的放大倍數,盡量四個一致或者接近
*************************************************************************/
void InductorNormal (void)
{
LnowADC[0] = ADC1_Read_Average(ADC1ch0_A0,10); // 左前側第1個電感,與賽道平行,采集各個電感的AD值
LnowADC[1] = ADC1_Read_Average(ADC1ch1_A1,10); // 左前側第2個電感,與垂直賽道,
LnowADC[2] = ADC1_Read_Average(ADC1ch8_B0,10); // 右前側第2個電感,與垂直賽道,
LnowADC[3] = ADC1_Read_Average(ADC1ch9_B1,10); // 右前側第1個電感,與賽道平行,
if (LnowADC[0] < ad_min[0])
LnowADC[0] = ad_min[0]; // 重繪最小值
else if (LnowADC[0] > ad_max[0])
LnowADC[0] = ad_max[0]; // 重繪最大值
if (LnowADC[1] < ad_min[1])
LnowADC[1] = ad_min[1];
else if (LnowADC[1] > ad_max[1])
LnowADC[1] = ad_max[1];
if (LnowADC[2] < ad_min[2])
LnowADC[2] = ad_min[2];
else if (LnowADC[2] > ad_max[2])
LnowADC[2] = ad_max[2];
if (LnowADC[3] < ad_min[3])
LnowADC[3] = ad_min[3];
else if (LnowADC[3] > ad_max[3])
LnowADC[3] = ad_max[3];
// 40 70 70 40
LleftV = (LnowADC[0] - ad_min[0]) * 100 / (ad_max[0] - ad_min[0]); // 各偏移量歸一化到0--100以內
LleftP = (LnowADC[1] - ad_min[1]) * 100 / (ad_max[1] - ad_min[1]);
LrightP = (LnowADC[2] - ad_min[2]) * 100 / (ad_max[2] - ad_min[2]); // 各偏移量歸一化到0--100以內
LrightV = (LnowADC[3] - ad_min[3]) * 100 / (ad_max[3] - ad_min[3]);
MagneticField = LleftV+LleftP+LrightP+LrightV;
}
使用歸一化后所有的采集資料都被歸到1-100內,可以根據比例調節各特征引數,這樣可以解決更換場地后帶來的影響,

差比和
差比和可以很好地使輸入變得平滑且能保證資料波動不那么劇烈,能夠是系統輸入盡可能的平滑,如下圖所示系列1為歸一化后的左右電感差值,系列二為差比和后的效果,對比可以發現差比和后的波形明顯比原始波形波動范圍小,
差比和的思路就是兩個輸入變數的差值比上兩個輸入變數的和而后再乘以合適的比例即可,
ServoDuty=(LleftV-LrightV)*600/(LleftV+LrightV);

CPU及程式的抗干擾措施
CPU是計算機的核心,當CPU受到干擾不能按正常狀態執行程式時,就會引起計算機控制的混亂,這就是通常所說的程式“跑飛”或“死機”,所以需要采取措施,使CPU在受到干擾的情況下,盡可能無擾地恢復系統正常作業,
注意:尤其是在單片機系統中,應當充分考慮系統的抗干擾性能,
下面是幾種常見的針對CPU的抗干擾措施:
復位
對于失控的CPU,最簡單的方法是使其復位,程式自動從頭開始執行,為完成復位功能,在硬體電路上應設定復位電路,
復位方式有上電復位、人工復位和自動復位三種,
掉電保護
在軟體中,應設定掉電保護中斷服務程式,該中斷為最高優先級的非屏蔽中斷,使系統能對掉電作出及時的反應,
首先進行現場保護,把當時的重要狀態引數、中間結果,甚至某些片內暫存器的內容一一存入具有后備電池的RAM中,
其次是對有關外設作出妥善處理,如關閉各輸入輸出口,使外設處于某一非作業狀態等,
最后必須在片內RAM的某一個或兩個單元存入特定標記的數字,作為掉電標記,然后,進入掉電保護作業狀態,
Watchdog技術
當程式“跑飛”到一個臨時構成的死回圈中時,冗余指令和軟體陷阱將不起作用,造成系統完全癱瘓,看門狗技術,可以有效解決這一問題,
當系統運行時,看門狗與CPU同時作業,程式正常運行時,會在規定的時間內由程式向看門狗發復位信號,使定時系統重新開始定時計數,沒有輸出信號發出;當程式“跑飛”并且其他的措施沒有發揮作用時,看門狗便不能在規定的時間內得到復位信號,其輸出端會發出信號使CPU系統復位,
代碼片,
// An highlighted block
int main(void)
{
All_Init();
while(1)
{
IWDG_Feed(); //每次運行完畢進行喂狗
All_Module_ProDeal(); //所有的動作
Usart1_Command_Handle(); //串口控制
Display(); //顯示函式
Key_Action(); //按鍵操作函式
//保證每次while回圈的時間固定,消除程式運行時的時序混亂
while(1)
{
if(delay_10ms_Arrive) //定時10ms到達標志位
{
delay_10ms_Arrive = 0; //定時10ms到達標志位
break;
}
}
}
}
總結
整個智能車的系列到此也就結束了,歡迎大佬們來批評指正,筆者也已經開始搬磚了,關于八鄰域、邊沿檢測、擬合、曲率這些后面看情況,作業不忙就更,前面有疑問的同學可以私信,但回復可能不會那么的及時,望諒解,也祝愿大家新年新氣象,智能車都取得好成績,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423487.html
標籤:AI
