STM32寻迹智能车
STM32尋跡智能車
- STM32尋跡智能車
- 一.電磁巡線傳感器
- 1.歸一化的概念
- 2.歸一化的原因
- 3.歸一化步驟
- 4.算術平均值濾波
- 二.線性CCD
- 1.圖像二值化
- 2.識別直道
- 3.識別彎道
- 三.編碼器
- 四.速度閉環控制
上傳這個是想記錄一下,原文鏈接暫時沒有,侵刪。
STM32尋跡智能車
一.電磁巡線傳感器
1.歸一化的概念
歸一化處理,由于各個電感的性能特性存在很大差異特別是電壓波動范圍相差較大。因此為了給算法制定統一的標準給數據處理帶來方便須對A/D傳感器采集來的信號做歸一化處理。
具體方法是通過公式將各傳感器電壓值都處理成相對該傳感器最大電壓和最小電壓使得傳感器輸出電壓值都保持在0到100之間。
2.歸一化的原因
假設不用歸一化處理時,距離中線零偏差時,電感A的值是1000,偏離賽道20厘米時,電感A值是200.當賽道電源不準時,比如輸出電流由100ma變成了120ma,這時,電感A在零偏差的值和偏離賽道20厘米時候的值都會變大,設分別變成了1200和240,這時,你設定的閾值會出問題了。比如,你設置在電感A值小于等于200的時候(偏差20cm)判定丟線,電流變大之后,偏差為20cm,A電感值為240,大于了200,這時本來該判丟線,卻沒法判丟線了,車輛路徑就相應會變化
這樣的處理算法,其本質其實就是在每次車跑之前,重新快速校準偏差和電感值的對應關系。
3.歸一化步驟
信號歸一化的方法如下:求取電壓值最大的傳感器位置,然后和它周圍兩個傳感器采樣值進行加權計算即可求得小車的偏差。
Sensor_Left = analogRead(1); //左邊電感采集值 Sensor_Middle = analogRead(2); //中間電感采集值 Sensor_Right = analogRead(3); //右邊電感采集值 if (Sensor_Left + Sensor_Middle + Sensor_Right > 25) {sum = Sensor_Left * 1 + Sensor_Middle * 50 + Sensor_Right * 99; //歸一化處理Sensor = sum / (Sensor_Left + Sensor_Middle + Sensor_Right); //求偏差 }4.算術平均值濾波
通過連續記錄數個傳感器值,經過排序后去掉最大值與最小值,剩余數進行平均。
//算數平均值濾波 uint16_t AD_Filter(u8 ch) { uint16_t ADC_Value[7];uint16_t ADC_Average[1];int i,j,t;for(i=0;i<7;i++){ ADC_Value[i]= Get_ADC(ch); }for(i=0;i<6;i++) {for(j=0;j<6-i;j++){if(ADC_Value[j]>ADC_Value[j+1]){t=ADC_Value[j+1];ADC_Value[j+1]=ADC_Value[j];ADC_Value[j]=t;}}}ADC_Average[0]=(uint16_t)((ADC_Value[1]+ADC_Value[2]+ADC_Value[3]+ADC_Value[4]+ADC_Value[5])/5.0); return ADC_Average[0]; }二.線性CCD
線性CCD相當于集成了一排灰度模塊的傳感器。
線性CCD的核心是由一行光電二極管(每個光電二極管都有各自的積分電路,此電路統稱為像素)組成的感光陣列,陣列后面有一排積分電容,光電二極管在光能量沖擊下產生光電流,構成有源積分電路,那么積分電容就是用來存儲光能轉化后的電荷。積分電容存儲的電荷越多,說明前方對應的那個感光二極管采集的光強越大,當光強接近飽和時,像素點灰度趨近于全白,呈白電平。
由此可知線性 CCD提取信號是被動的接受反射回的光線,因此采集的信號易受外界環境的影響。
//初始化ccd void ccd_Init(void) { //先初始化IO口RCC->APB2ENR|=1<<2; //使能PORTA口時鐘 GPIOA->CRL&=0XFFFF0FFF;//PA3 anolog輸入 GPIOA->CRL&=0X0FFFF0FF;//PA2 7 GPIOA->CRL|=0X20000200;//Pa2 7 推挽輸出 2MHZ //通道10/11設置 RCC->APB2ENR|=1<<9; //ADC1時鐘使能 RCC->APB2RSTR|=1<<9; //ADC1復位RCC->APB2RSTR&=~(1<<9);//復位結束 RCC->CFGR&=~(3<<14); //分頻因子清零 //SYSCLK/DIV2=12M ADC時鐘設置為12M,ADC最大時鐘不能超過14M!//否則將導致ADC準確度下降! RCC->CFGR|=2<<14; ADC1->CR1&=0XF0FFFF; //工作模式清零ADC1->CR1|=0<<16; //獨立工作模式 ADC1->CR1&=~(1<<8); //非掃描模式 ADC1->CR2&=~(1<<1); //單次轉換模式ADC1->CR2&=~(7<<17); ADC1->CR2|=7<<17; //軟件控制轉換 ADC1->CR2|=1<<20; //使用用外部觸發(SWSTART)!!! 必須使用一個事件來觸發ADC1->CR2&=~(1<<11); //右對齊 ADC1->SQR1&=~(0XF<<20);ADC1->SQR1&=0<<20; //1個轉換在規則序列中 也就是只轉換規則序列1 //設置通道7的采樣時間ADC1->SMPR2&=0XFFFF0FFF;//通道3采樣時間清空 ADC1->SMPR2|=7<<9; //通道3 239.5周期,提高采樣時間可以提高精確度 ADC1->CR2|=1<<0; //開啟AD轉換器 ADC1->CR2|=1<<3; //使能復位校準 while(ADC1->CR2&1<<3); //等待校準結束 //該位由軟件設置并由硬件清除。在校準寄存器被初始化后該位將被清除。 ADC1->CR2|=1<<2; //開啟AD校準 while(ADC1->CR2&1<<2); //等待校準結束delay_ms(1); }1.圖像二值化
線性 CCD 如果掃到白線 AD 值即為一個較高的電壓值(接近 3v),掃到黑線即為一個較低的電壓值。
為了準確判斷黑線的位置以及減弱賽道上噪點的干擾,需將 CCD 采集的圖像進行二值化處理,把模擬信號轉換成 0 和 1 的二值信號,便于后期的數據處理。
2.識別直道
賽道引導線處于賽道兩邊,在進行邊緣檢測時(即掃描像素二值化之后 0 和 1 的跳變沿),可通過從中心向兩邊掃描的方式實現,從左右兩邊同時尋找從 1 跳變到 0的像素點位置,具體過程為第 64 個像素點向第 1 個像素點掃描,得到左邊引導線的位置Error_L,第 65 個像素點向第 128個像素點掃描,得到右邊引導線的位置 Error_R,Error_L和 Error_R 符號相反。從中心到兩邊分別取值為 64 ~ 1和 - 64 ~ - 1,賽道偏差 Error = Error_L + Error_R。
由于線性 CCD 采回的數據在左右兩個邊沿不準確,所以左右各略去 4 個點,使用 120 個點的數據,此時 60 即為期望的中心值。
3.識別彎道
由于小車驅動電機的反應具有滯后性, 高速行駛于彎道時容易出現第 64 個像素點與第 65 個像素點同時落在黑線上的情況。此時從中心到兩邊像素點都沒有從 1 到 0 的跳變, Error 就為 0, 從而出現丟線的情況。
為了避免這種情況的發生, 采用浮動中心點的方法, 即掃描并不是固定的從第 64 和 65 個像素點向兩邊進行, 而是根據上一次的賽道偏差計算出本次掃描的起始位置。
當小車處于左轉彎時掃描起始位置向左移動, 反之向右移動,這樣可以很好地避免了因掃描中心點落在黑線上而導致的丟線。
未完成編程…
說一說看到其他組的現象,實戰中光源不可控,ccd容錯率低,比賽中不容易調試,可以考慮自備光源。
三.編碼器
光電編碼器是一種通過光電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器。光電編碼器是由光碼盤和光電檢測裝置組成。光碼盤是在一定直徑的圓板上等分地開通若干個長方形孔。由于光電碼盤與電動機同軸,電動機旋轉時,檢測裝置檢測輸出若干脈沖信號,為判斷轉向,一般輸出兩組存在一定相位差的方波信號。
霍爾編碼器是一種通過磁電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器。霍爾編碼器是由霍爾碼盤和霍爾元件組成。霍爾碼盤是在一定直徑的圓板上等分地布置有不同的磁極。霍爾碼盤與電動機同軸,電動機旋轉時,霍爾元件檢測輸出若干脈沖信號,為判斷轉向,一般輸出兩組存在一定相位差的方波信號。
四倍頻
通過軟件的方法實現四倍頻時。正常情況下使用M法測速的時候,會通過測量單位時間內A相輸出的脈沖數來得到速度信息。常規的方法,只測量A相(或B相)的上升沿或者下降沿,這樣就只能計數3次。而四倍頻的方法是測量A相和B相編碼器的上升沿和下降沿。這樣在同樣的時間內,可以計數12次(3個1234的循環)。這就是軟件四倍頻的原理。
采集編碼器數據
STM32定時器初始化為編碼器模式
四.速度閉環控制
速度閉環控制即有速度反饋的控制,由編碼器提供速度反饋。將反饋速度(即當前速度)與目標速度進行比較,目標速度大于當前速度則加大速度,目標速度與當前速度之差越大則加速度越大。
添加一個定時 10ms 讀取編碼器數值的函數10ms讀取一次編碼器(即100HZ)。電機減速比為20,電機自帶的霍爾編碼器精度為13,AB雙相組合得到4倍頻,則轉1圈編碼器讀數為20*13*4=1040。電機轉速=編碼器讀數*100/1040 (r/s)。由于電機本身誤差,轉1圈編碼器讀數可能不等于1040,這時可以添加誤差系數。
int Velocity_FeedbackControl(int TargetVelocity, int CurrentVelocity) {int Bias; //定義相關變量 static int ControlVelocity, Last_bias; //靜態變量,函數調用結束后其值依然存在 Bias=TargetVelocity-CurrentVelocity; //求速度偏差 ControlVelocity+=Velcity_Kp*(Bias-Last_bias)+Velcity_Ki*Bias; //增量式 PI 控制器;Velcity_Kp*(Bias-Last_bias)作用為限制加速度;Velcity_Ki*Bias,速度控制值由 Bias 不斷積分得到,偏差越大加速度越大 Last_bias=Bias; return ControlVelocity; //返回速度控制值 }總結
以上是生活随笔為你收集整理的STM32寻迹智能车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会声会影试用版和正式版的区别
- 下一篇: JVM之垃圾收集算法