這個是全網(wǎng)最詳細(xì)的STM32項目教學(xué)視頻。
第一篇在這里:
視頻在這里
19.5-STM32接收數(shù)據(jù)-根據(jù)狀態(tài)控制電機
前面我們測試了openmv能夠正確識別,正確發(fā)送數(shù)據(jù)、STM32能夠正確接收、那么下面STM32單片機就要開始控制電機了。
這里控制電機其實和我們紅外循跡PID基本一致。
需要注意的 因為我們的攝像頭更加前瞻,距離車輪更遠(yuǎn),所以電機同樣的擺動幅度,攝像頭擺動更大。
先分析一下之前的代碼,然后明白我們要改什么了就
所以我們需要上面紅色減藍(lán)色 的部分
這里我們先定義一個結(jié)構(gòu)體,這個是攝像頭PID循跡,仿造那個紅外對管的就可以。
tPid pidOpenmv_Tracking;//openmv攝像頭的PID結(jié)構(gòu)體類型變量
pidOpenmv_Tracking.actual_val=0.0;
pidOpenmv_Tracking.target_val=0.00;//攝像頭PID 的目標(biāo)值為0
pidOpenmv_Tracking.err=0.0;
pidOpenmv_Tracking.err_last=0.0;
pidOpenmv_Tracking.err_sum=0.0;
pidOpenmv_Tracking.Kp=-0.4;//攝像頭循跡PID的K和d先調(diào)整的小一些
pidOpenmv_Tracking.Ki=0;
pidOpenmv_Tracking.Kd=0.10;
聲明一下
extern tPid pidOpenmv_Tracking;//攝像頭的PID
sprintf((char*)OledString, "lHW:%d ", g_lHW_State);//視覺識別結(jié)果
OLED_ShowString(0,0,OledString,12);//這個是oled驅(qū)動里面的,是顯示位置的一個函數(shù),
g_fHW_PID_Out = PID_realize(&pidOpenmv_Tracking,g_cThisState);//PID計算輸出目標(biāo)速度 這個速度,會和基礎(chǔ)速度加減
g_fHW_PID_Out1 = 0.5 + g_fHW_PID_Out;//電機1速度=基礎(chǔ)速度+循跡PID輸出速度
g_fHW_PID_Out2 = 0.5 - g_fHW_PID_Out;//電機1速度=基礎(chǔ)速度-循跡PID輸出速度
if(g_fHW_PID_Out1 >1.2) g_fHW_PID_Out1 =1.2;//進(jìn)行限幅 限幅速度在0-1.2之間
if(g_fHW_PID_Out1 <0) g_fHW_PID_Out1 =0;
if(g_fHW_PID_Out2 >1.2) g_fHW_PID_Out2 =1.2;//進(jìn)行限幅 限幅速度在0-1.2之間
if(g_fHW_PID_Out2 <0) g_fHW_PID_Out2 =0;
if(g_cThisState != g_cLastState)//如何這次狀態(tài)不等于上次狀態(tài)、就進(jìn)行改變目標(biāo)速度和控制電機、在定時器中依舊定時控制電機
{
motorPidSetSpeed(g_fHW_PID_Out1,g_fHW_PID_Out2);//通過計算的速度控制電機
}
g_cLastState = g_cThisState;//保存上次紅外對管狀態(tài)
注意攝像頭不能仰角太大
聯(lián)系:Q,1930299709