國賽光電組源碼
0.png (22.56 KB, 下載次數: 64)
下載附件
2018-11-11 02:36 上傳
203824rpzefy8ttcpoeee4.jpg (177.53 KB, 下載次數: 70)
下載附件
2018-11-11 02:41 上傳
2014-05-09
首次將兩個程序融合。
2014-05-11
上位機成功移植。
2014-05-13
底層基本完工。
2014-05-20
//調試舵機中心值語句(放在主循環)
//FTM2->CONTROLS[0].CnV = (uint32)(1.5625*((float)Steer1_info.Steer_PWMOutputDuty));
//調試舵機左右極限值的語句(放在主循環)
// if(1 == CCD1_info.CCDGetDataOK_Flag)
// {
// CCD1_info.CCDGetDataOK_Flag = 0;
// if(0 == xx)
// Steer1_info.Steer_PWMOutputDuty -= 1;
// else
// Steer1_info.Steer_PWMOutputDuty += 1;
//
// if(Steer1_info.Steer_PWMOutputDuty >= Steer1_info.Steer_RightMAX)
// xx = 0;
// else if(Steer1_info.Steer_PWMOutputDuty <= Steer1_info.Steer_LeftMAX)
// xx = 1;
// FTM2->CONTROLS[0].CnV = (uint32)(1.5625*((float)Steer1_info.Steer_PWMOutputDuty));
// }
2014-05-22
改變了巡線方式。
2014-05-28
舵機KP = 1.1/1.2,KD >= 1.6(1.8),電機KP = 340,KI = 3。偏差D步長10
2014-06-03
舵機KP = 1.06,KD = 2.5,電機KP = 480,KI = 80
2014-06-11
//計時,調試停車
if(Stop != Car_state)//計算行駛的時間
Parameter_info.Time += 0.003;
#ifdef DebugTime_Enable
//若調試時間為零則進入正常行駛狀態,不進行調試
if((0 != Parameter_info.DebugTime) && (Parameter_info.Time >= Parameter_info.DebugTime))//調試時間到,停車
{
if(Stop != Car_state)
{
Car_state_Pre = Car_state;
Car_state = Stop;
Parameter_info.StartEndLine_Flag = 1;
}
}
#endif
//end of DebugTime_Enable
2014-06-12
同時采集CCD1,CCD2,CCD3的數據和求3個CCD的偏差。
CCD1當兩邊都不丟為有效,CCD2當兩邊不全丟為有效,CCD3當兩邊都不丟為有效.
當 CCD1_Ready_Num >= 5,CCD2_Ready_Num >= 6,CCD3_Ready_Num >= 10時是直道。
當 CCD1_Ready_Num >= 5,CCD2_Ready_Num >= 6,CCD3_Ready_Num = 0時是直道入彎道。
當 CCD1_Ready_Num >= 5;CCD2_Ready_Num = 0;CCD3_Ready_Num = 0時是彎道。
當 CCD1_Ready_Num = 0;CCD2_Ready_Num = 0;CCD3_Ready_Num = 0時是急彎。
2014-06-13
搖頭舵機控制的時候在十字路口會有全白的時候,此時將搖頭舵機逐漸回正,以保證再次尋到正確的邊界。
2014-06-20
限制搖頭舵機補線時的中線位置,防止在十字路口由于補線錯誤出現的抖動。
2014-06-21
根據華為標準規范了代碼風格。
2014-06-22
經測試,用Keil生成的K60代碼中的右移位運算( >> )為算數右移,即負數也可用右移運算。
2014-06-26
myOLED_Dec4(7,10,CCD3_info.LeftLine[0]);
myOLED_Dec4(7,50,CCD3_info.CentralLine[0]);
myOLED_Dec4(7,90,CCD3_info.RightLine[0]);
myOLED_Dec4(6,10,CCD2_info.LeftLine[0]);
myOLED_Dec4(6,50,CCD2_info.CentralLine[0]);
myOLED_Dec4(6,90,CCD2_info.RightLine[0]);
myOLED_Dec4(5,10,CCD1_info.LeftLine[0]);
myOLED_Dec4(5,50,CCD1_info.CentralLine[0]);
myOLED_Dec4(5,90,CCD1_info.RightLine[0]);
2014-06-29
由于當搖頭舵機打到最大后不再利用偏差減速,則速度會有突變導致在急彎的時候不穩定。
2014-07-01
十字道雖然用了CCD2和CCD3來輔助檢測前面的邊界,但是一旦近處的CCD1再次尋到邊界(不管是單邊還是雙邊)都會退出十字道的處理。
這樣產生的影響就是就算前面的CCD2,CCD3糾正正確了,一旦近處CCD1搜到單邊界(有可能不是正確的邊界),則會退出十字處理,可能導致錯誤。
長直道進入坡道的時候車可能由于速度太大減速不及時會跳動,可以利用3個CCD來預判坡道。即3個CCD都有雙邊界,并且中心值在63附近,
一旦3個CCD的道路寬度都呈現逐漸加大的情況,則可以認為是坡道。處理方法為由3檔或者2檔減速到1檔,并且開始減速。
2014-07-06
彎道加速
//清零出彎道加速標記
// if(fabs(Steer_info->Steer_PWMOutputDuty - Steer_info->Steer_Center) < 50)
// {
// Speed_info->CurSpeedAcc_Flag = 0; //清零出彎道加速標記
// Speed_info->CurSpeedAcc = 0; //直道上清零出彎道速度增加值
// }
// else
// {
// if(1 == Speed_info->CurSpeedAcc_Flag)//已經在進行彎道加速
// {
// if(Speed_info->CurSpeedAcc < 5000)//限制上限,防止越界
// {
// Speed_info->CurSpeedAcc += 1; //每個周期增加1個脈沖
// }
// }
// else if((1 != Speed_info->CurSpeedAcc_Flag)
// && ((Steer_info->Steer_PWMOutputDuty >= Steer_info->Steer_RightMAX - 100)
// || (Steer_info->Steer_PWMOutputDuty <= Steer_info->Steer_LeftMAX + 100)))//彎道中轉向舵機打到極限的時候開始出彎道加速
// {
// Speed_info->CurSpeedAcc_Flag = 1; //開始出彎道加速
//
// Speed_info->CurSpeedAcc += 1; //增加1個脈沖
// }
// }
// if((1 == Parameter_info.RampReady_FLag) && (Ramp_Up != Road_condition))//長直道進入坡道預判成功
// {
// Speed_info->TargetSpeed = Speed_info->RampUp_Speed;//設定為上坡道速度來急減速
// }
// else
// {
// Speed_info->TargetSpeed += sqrt(Speed_info->CurSpeedAcc);//如果在彎道中則加速
// }
2014-07-11
舵機調試
//轉向舵機輸出
FTM2->CONTROLS[0].CnV = Steer_info.Steer_PWMOutputDuty;
myOLED_Dec(4,50,Steer_info.Steer_PWMOutputDuty);
速度控制
//根據搖頭舵機打角,偏差,搖頭舵機打角偏差率來計算速度,并根據檔位的不同來改變直道最高速度
// if((3 == Speed_info->LastSpeedMode) && (2 == Speed_info->SpeedMode))//由3檔換到2檔,應該急減速
// {
// Speed_info->TargetSpeed = Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1]
// - (Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1] - Speed_info->Cur_Speed)*HeadSteerPWMError_MAX/Speed_info->HeadSteerPWMError_K
// - (Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1] - Speed_info->Snake_Speed)*HeadSteerPWMError_D_MAX/Speed_info->HeadSteerPWMError_D_K
// - (Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1] - Speed_info->Cur_Speed)*LineError_MAX/Speed_info->Error_K;
//
// }
// else if((1 == Speed_info->LastSpeedMode) && (2 == Speed_info->SpeedMode))//由1檔換到2檔,應該加速
// {
// Speed_info->TargetSpeed = Speed_info->Straight_Speed
// - (Speed_info->Straight_Speed - Speed_info->Cur_Speed)*HeadSteerPWMError_MAX/Speed_info->HeadSteerPWMError_K;
// }
// else
// {
// Speed_info->TargetSpeed = Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1]
// - (Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1] - Speed_info->Cur_Speed)*HeadSteerPWMError_MAX/Speed_info->HeadSteerPWMError_K
// - (Speed_info->Straight_Speed + Speed_info->SpeedAcc[Speed_info->SpeedMode - 1] - Speed_info->Snake_Speed)*HeadSteerPWMError_D_MAX/Speed_info->HeadSteerPWMError_D_K;
// }
調試前瞻
// myOLED_Dec(7,10,CCD3_info.LeftLine[0]);
// myOLED_Dec(7,50,CCD3_info.CentralLine[0]);
// myOLED_Dec(7,90,CCD3_info.RightLine[0]);
//
// myOLED_Dec(6,10,CCD2_info.LeftLine[0]);
// myOLED_Dec(6,50,CCD2_info.CentralLine[0]);
// myOLED_Dec(6,90,CCD2_info.RightLine[0]);
//
// myOLED_Dec(5,10,CCD1_info.LeftLine[0]);
// myOLED_Dec(5,50,CCD1_info.CentralLine[0]);
// myOLED_Dec(5,90,CCD1_info.RightLine[0]);
// myOLED_CCDwave(&CCD1_info,&CCD2_info,&CCD3_info);
2014-07-11
發現一旦同時采集CCD數據和陀螺儀數據并且用液晶顯示東西過多就會出現死機的現象,初步懷疑是陀螺儀與CCD采集公用了一個AD模塊,導致陀螺儀
正在進行AD轉換時被CCD采集中斷打斷而入堆棧,而陀螺儀AD轉換尚未完成,若被打斷則繼續等待轉換完成,CCD進入采集程序后需要該AD模塊進行數據轉換
,若此時該AD正在等待,則有可能繼續等待,導致最終死機。
2014-08-05
發現十字道抖動的原因為CCD1進入十字道,CCD2搜到邊界,控制搖頭舵機的量由CCD3切換至CCD2時發生抖動。
2014-08-09
if(((1 == Speed_info->LastSpeedMode) && (2 == Speed_info->SpeedMode)) || (1 == Speed_info->CurSpeedAcc_Flag))
{
Speed_info->TargetSpeed[0] = Speed_info->Straight_Speed
- (Speed_info->Straight_Speed - Speed_info->Cur_Speed)*1/Speed_info->HeadSteerPWMError_K;
if(1 == Speed_info->CurSpeedAcc_Flag)
{
if(Speed_info->Speed_Now < Speed_info->Straight_Speed)
{
Speed_info->CurSpeedAcc += 1.5;//每個周期增加1.5個脈沖
}
Speed_info->TargetSpeed[0] += sqrt(fabsf(Speed_info->CurSpeedAcc));
}
}
全部資料51hei下載地址:
LDPY_V5(臥式舵機).rar
(6.74 MB, 下載次數: 9)
2018-11-11 02:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|