赞
踩
这个是全网最详细的STM32项目教学视频。
第一篇在这里:
视频在这里
STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随
前面我们测试了openmv能够正确识别,正确发送数据、STM32能够正确接收、那么下面STM32单片机就要开始控制电机了。
这里控制电机其实和我们红外循迹PID基本一致。
需要注意的 因为我们的摄像头更加前瞻,距离车轮更远,所以电机同样的摆动幅度,摄像头摆动更大。
先分析一下之前的代码,然后明白我们要改什么了就
所以我们需要上面红色减蓝色 的部分
这里我们先定义一个结构体,这个是摄像头PID循迹,仿造那个红外对管的就可以。
tPid pidOpenmv_Tracking;//openmv摄像头的PID结构体类型变量
pidOpenmv_Tracking.actual_val=0.0;
pidOpenmv_Tracking.target_val=0.00;//摄像头PID 的目标值为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先调整的小一些
pidOpenmv_Tracking.Ki=0;
pidOpenmv_Tracking.Kd=0.10;
声明一下
extern tPid pidOpenmv_Tracking;//摄像头的PID
sprintf((char*)OledString, "lHW:%d ", g_lHW_State);//视觉识别结果 OLED_ShowString(0,0,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数, g_fHW_PID_Out = PID_realize(&pidOpenmv_Tracking,g_cThisState);//PID计算输出目标速度 这个速度,会和基础速度加减 g_fHW_PID_Out1 = 0.5 + g_fHW_PID_Out;//电机1速度=基础速度+循迹PID输出速度 g_fHW_PID_Out2 = 0.5 - g_fHW_PID_Out;//电机1速度=基础速度-循迹PID输出速度 if(g_fHW_PID_Out1 >1.2) g_fHW_PID_Out1 =1.2;//进行限幅 限幅速度在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;//进行限幅 限幅速度在0-1.2之间 if(g_fHW_PID_Out2 <0) g_fHW_PID_Out2 =0; if(g_cThisState != g_cLastState)//如何这次状态不等于上次状态、就进行改变目标速度和控制电机、在定时器中依旧定时控制电机 { motorPidSetSpeed(g_fHW_PID_Out1,g_fHW_PID_Out2);//通过计算的速度控制电机 } g_cLastState = g_cThisState;//保存上次红外对管状态
注意摄像头不能仰角太大
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。