K60-光电 前瞻40cm 控制周期5ms ccd 舵机100HZ。。 2.对于CCD来说,图像稳定是关键。我用的是蓝宙4代CCD,总结说,CCD的运放千万不要调节过度。
我参考的是蓝宙的修改的曝光时间
void CCD_Sample(void)
{
uint8_t i=0;
/* Æô¶ˉé¨Ãè */
CCD1_SI = 1;
Delay_Us(CCD_Us);
CCD1_CLK = 1;
Delay_Us(CCD_Us);
CCD1_SI = 0;
Delay_Us(CCD_Us);
/*é¨Ãèμú1¸öμã */
CCD_GrayVal1[0] = ADC_GetConversionValue(ADC1_SE7_PE3);
CCD1_CLK = 0;
Delay_Us(CCD_Us);
/* é¨Ãèμú2-128¸öμã */
for(i=1; i<128; i++)
{
CCD1_CLK = 1;
/* AD2éÑù£¬ê±¼äÔ¼12us */
CCD_GrayVal1 = ADC_GetConversionValue(ADC1_SE7_PE3);
CCD1_CLK = 0;
Delay_Us(CCD_Us);
}
/* ·¢Ëíμú129¸öCLK */
CCD1_CLK = 1;
Delay_Us(CCD_Us);
CCD1_CLK = 0;
Delay_Us(CCD_Us);
}
3.图像滤波,我采用的大众化的普通滤波,每隔3个点处理波形。
4.舵机控制方面建议50-120hz。频率越高舵机反应越灵敏。
我从最初的固定PID,到分段PID,然后二次PD。最后试过三次P和模糊PD;
对于二次P的效果,我总结为,过弯道效果非常好。可能是我调的不够好,不同的error对应的二次P衔接不好,直道入弯道效果不是很好。二次P如下:
// Servo_Hanshu= ( 0.0823) * Servo_Error * Servo_Error + 30 ;
// Servo_Sqrt= sqrt(Servo_Hanshu);
// Servo_PWM_Vaule= (int32)( Servo_Sqrt * Servo_Error + S_Common.D* (Servo_Error-Servo_Error_old) );
// //Servo_PWM_Vaule= (int32)( S_Common.P * Servo_Error + S_Common.D* (Servo_Error-Servo_Error_old) );
// Servo_Add = Servo_Middle + Servo_PWM_Vaule;
我经过试验,最终的二次P可以不需要开根号,那样效果会好一些。因为任何数字的变化,开根号后的变化率基本是非常小了。
三次P来说,我建议和二次p一起用。
模糊PID,一句话,难调。我就给个大致的我调节的模糊表吧
// -2 -1 0 1 2 ec e
{ 1, 1, 1, 0, 0}, // -3
{ 4, 2, 1, 0, 0}, // -2
{ 6, 4, 1, 1, 0}, // -1
{ 3, 3, 0, 3, 3}, // 0
{ 0, 1, 1, 4, 6}, // 1
{ 0, 0, 1, 2, 4}, // 2
{ 0, 0, 1, 1, 1} // 3
3.电机控制,理想速度由舵机得到,参考哈工大的技术方案,实际速度和编码器成线性关系,当然我也试过二次函数关系,也可以。
Currentspeedr = 90.398*Average_DMA_R +192.69; //实际右轮速度
Currentspeedl = 90.398*Average_DMA_L +192.69; //实际左轮速度
调节电机的PID,
我采用的增量式,
Motor_L_Pwm = (int)(Motor_L_Pwm + Motor_L.P*(error_l-last_error_l)+Motor_L.I*error_l+Motor_L.D*(error_l+pre_error_l-2*last_error_l));
用虚拟示波器调节,先调节Kp。。使得阶跃大致稳定在理想速度附近。
然后调节kd使得周期稳定。最后调节ki,使得响应速度很快,但是一般ki的数值很小。
最后祝各位加油,大神不要喷我哈,小白一个。
有什么错误大家帮忙修改,最后大家加油。。。
不要问我车速多少。2.7m/s。。
有特殊可私聊QQ:2801559274
|