** **功能介紹放開頭, 使用便捷無需愁。
這是全網最詳細、性價比最高的STM32實戰項目入門教程,通過合理的硬件設計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學習,通過3萬字筆記、12多個小時視頻、20多章節代碼手把手教會你如何開發和調試。讓你更快掌握嵌入式系統開發。
**V3.3.0-STM32智能小車 **
**視頻: **[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click][添加鏈接描述]
V3:HAL庫開發、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。
20.3-使用兩個通道進行電磁循跡
我們知道了V1和V4的電壓值、這個電壓值正比于 電感垂直放置在磁導線的距離,那么我們很容易就容易想到 使用二者差值表示小車偏轉方向和大小。
比如一次測量: V4:0.63 V1 :0.50 那么用 V4-V1 = 0.63-0.50=0.13 大于零表示往V4方向偏,0.13表示偏轉大小
但是這個計算方法有個壞處,我們舉例,假設小車位置不變,但是因為賽道線長度,電磁信號不同等原因,所以信號會整體發生變化,我們假設電壓都提升10%,那么就是
**V4: 0.63*1.1= 0.693 **
V1:0.50*1.1= 0.55
0.693 - 0.55 = 0.143
發現 0.143 和之前的0.13 還是有變化的。
那么嘗試換個計算方法 使用差比和計算方法:(a-b)/(a+b) 計算:V4:0.63 V1 :0.50、然后(0.63-0.50)/(0.63+0.50) 結果是:0.13/1.13=
0.11504
(a-b)/(a+b) 計算:( 0.693-0.55)/(0.693+0.55):0.143/1.243 = 0.11504
這樣發現值就是相同的。
歸一化處理:
進行歸一化處理的原因是:是根據電感值在對應賽道到的最大值max,把根據這個max,然后再根據采集值value,使用****value/max * 100 這個公式計算數據處理到對應0-100的值,這樣的好處的是:在更換賽道后,測量新的賽道的最大值,改變max值即可,有 較強適應性 。**
**
float g_fVoltageMax[4]={2.89,2.89,2.89,2.89};//用于歸一化的最大ADC電壓采集值 不同賽道要獲得更好循跡效果 需要重新采集這個值
int g_iVoltageGuiYi[4];//這個是四個通道歸一化的結果,用0-100表示每個通道電壓大小
使用歸一化的公式進行計算
/**歸一化處理**/
for(int i=0;i< 4;i++)
{
if(g_fVoltage[i] > g_fVoltageMax[i]) g_fVoltage[i] = g_fVoltageMax[i];//進行限幅
g_iVoltageGuiYi[i] = g_fVoltage[i]/g_fVoltageMax[i]*100;//進行歸一化計算轉化到0-100
}
進行差比和計算:
使用差比和原因: 可以直觀反映小車偏離方向和程度,通過正負反映小車偏移方向,通過絕對值大小反映偏移程度。
**定義兩個變量 **
float g_fVoltageOuter;//電感桿外面兩個電感差比和值 電感4和電感1
float g_fVoltageInterior;//電磁桿中間兩個電感差比和值 電感2和電感3
使用差比和計算公式進行
注意使用放置截斷 使用(float) 進行轉化
/*差比和值表示小車的偏差 差比和計算公式 (a-b)/(a+b)這個值表示小車的偏差 */
/* 下面是使用歸一化的值進行差比值計算*/
/*增加(float)的原因是轉化成浮點數,防止整數除法時候出現截斷現象*/
g_fVoltageOuter = (float)((g_iVoltageGuiYi[3]-g_iVoltageGuiYi[0])/(float)(g_iVoltageGuiYi[3]+g_iVoltageGuiYi[0] +1));//外面兩個電感差比和值 電感4和電感1 "-1"是因為要和數組索引對應
g_fVoltageInterior = (float)((g_iVoltageGuiYi[2]-g_iVoltageGuiYi[1])/(float)(g_iVoltageGuiYi[2]+g_iVoltageGuiYi[1] +1));//里面兩個電感差比和值 電感2和電感3
?
利用差比和值進行循跡:
根據差比和值正負和絕對值大小進行調整運動方向
/*利用差比和值進行循跡*/
if(0.75 > g_fVoltageOuter > 0.5)
{
motorPidSetSpeed(1,0.8);//左邊運動 這個值可能需要根據自己軌道特點調整
}
else if(0.75 <= g_fVoltageOuter)// 檢測小車位置到更加右偏了
{
motorPidSetSpeed(1.2,0.2);//更向左邊運動 這個值可能需要根據自己軌道特點調整
}
else if(-0.75 < g_fVoltageOuter < -0.5)
{
motorPidSetSpeed(0.8,1);//右邊運動 這個值可能需要根據自己軌道特點調整
}
else if( -0.75 >= g_fVoltageOuter)// 檢測小車位置到更加左偏了
{
motorPidSetSpeed(0.2,1.2);//更向右邊運動 這個值可能需要根據自己軌道特點調整
}
else{
motorPidSetSpeed(1,1);//前運動
}
顯示屏幕方便調試:
調整把上面的一些數據顯示在OLED,其實這部應該先做,先把一些計算的結果顯示在OLED上,這樣方便調試
sprintf((char*)OledString, "O:%.2f I:%.2f ", g_fVoltageOuter,g_fVoltageInterior);//顯示差比和值 O: 這個是外面兩個差比和值計算結果 I:這個
OLED_ShowString(0,1,OledString,12);//這個是oled驅動里面的,是顯示位置的一個函數,
sprintf((char*)OledString, "G1:%d G2:%d ", g_iVoltageGuiYi[0],g_iVoltageGuiYi[1]);//顯示歸一化后的數據 G1:電感1差比和值 G2 :電感2差比和值
OLED_ShowString(0,2,OledString,12);//這個是oled驅動里面的,是顯示位置的一個函數,
sprintf((char *)OledString,"G3:%d G4:%d ",g_iVoltageGuiYi[2],g_iVoltageGuiYi[3]);//顯示歸一化后的數據 G3:電感3差比和值 G4:電感4差比和值
OLED_ShowString(0,3,OledString,12);//這個是oled驅動里面的,是顯示位置的一個函數,
sprintf((char *)OledString,"v1:%.2f v2:%.2f ",g_fVoltage[0],g_fVoltage[1]);//顯示 1、2 電壓值 V1:電感1值 V2:電感2值
OLED_ShowString(0,4,OledString,12);//這個是oled驅動里面的,是顯示位置的一個函數,
sprintf((char *)OledString,"v3:%.2f v4:%.2f ",g_fVoltage[2],g_fVoltage[3]);//顯示3、4 電壓值 V3;電感3值 V4:電感4值
OLED_ShowString(0,5,OledString,12);//這個是oled驅動里面的,是顯示位置的一個函數,
一些實際照片效果
把小車放置到通有正弦交流信號的軌道上:
小車放置到遠離信號發生器位置直道上
把小車放置到軌道中間,然后觀察O: 的數值(就是g_fVoltageOuter 顯示的變量) 應該在0.00的左右。
然后G1:數值(g_iVoltageGuiYi[0]數值顯示位置)和G4:數值(g_iVoltageGuiYi[3]的數值)應該大致相同
讓軌道位于小車的左下方然后觀察三個數值大小
O:應該是大概0.70-0.99比較大的值
G1:應該是大概0-30左右
G4:應該是70-100左右
下面我們讓軌道位于小車右邊
O:的值在大概-0.80- -1左右
G1:的值大概70-100左右
G4的值大概0-30左右
審核編輯 黃宇
-
嵌入式系統
+關注
關注
41文章
3593瀏覽量
129466 -
電磁
+關注
關注
15文章
1133瀏覽量
51814 -
PID
+關注
關注
35文章
1472瀏覽量
85513 -
智能車
+關注
關注
21文章
403瀏覽量
76961 -
循跡
+關注
關注
0文章
14瀏覽量
13072
發布評論請先 登錄
相關推薦
評論