目录
前言
一、整体控制思路
二、代码实现
1.主函数
2.定时器回调函数
总结
前言
通过以上三篇文章已将基本条件实现,本文将结合以上内容,进行综合控制,实现小车的视觉巡线功能。
系列文章请查看:视觉巡线小车——STM32+OpenMV系列文章
一、整体控制思路
首先,减速电机需要以指定的速度运行,就需要用 PID 控制算法对减速电机的速度 进行控制,即速度环。其次,根据机器人中心线与黑线的偏差,再通过 PID 控制算法控 制调整左右减速电机的速度,进而控制机器人的转向,即转向环。因此,速度环为内环 控制,转向环为外环控制,而外环控制一般只需要用比例P控制即可。如下图:
二、代码实现
1.主函数
由于电机是按照一定的频率进行控制,所以主函数不进行电机的控制,而PID参数调试已完成,该上位机已不再使用,故主函数不做其他处理。
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_TIM2_Init();MX_TIM3_Init();MX_TIM4_Init();MX_USART2_UART_Init();MX_USART3_UART_Init();/* USER CODE BEGIN 2 */__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);protocol_init();//PID上位机调试助手协议初始化。HAL_UART_Receive_IT(&huart2,&OpenMV_Buf,1);HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL); HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,0);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
// printf("hello\n");
// receiving_process();}/* USER CODE END 3 */
}
2.定时器回调函数
该部分为整体控制的核心,速度采集、PID运算、电机控制等都在这里进行。
#define OpenMV_Kp 1.2void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/*******电机控制周期,每10ms对电机控制一次*********/if(htim->Instance == TIM2 ){motorA.speed = get_speed_motorA();motorB.speed = get_speed_motorB(); // motorA.S += motorA.speed;// motorB.S += motorB.speed;// int Speed = motorA.speed;// set_computer_value(SEND_FACT_CMD, CURVES_CH1,&Speed , 1); // 给通道 1 发送实际值。motorA.Target_Speed = base_speed - rho_org * OpenMV_Kp;motorB.Target_Speed = base_speed + rho_org * OpenMV_Kp;motorA.out = pid_control(motorA.speed,motorA.Target_Speed,200,18,15);motorB.out = pid_control(motorB.speed,motorB.Target_Speed,200,18,15);Load(motorA.out, motorB.out);}}
这里只使用了 像素点偏差进行控制,未用角度偏差。其中OpenMV_Kp为转向环的比例控制参数,可以根据小车行走的情况自行调整。
总结
至此,视觉巡线小车的基本内容已全部完成。当然这只是一个基本的雏形,其中视觉处理部分可以根据自己情况进一步优化,同时控制思路也可以适当调整。小车功能很单一,只是简单地进行视觉巡线,其他更多功能可以自行丰富。
系列文章请查看:视觉巡线小车——STM32+OpenMV系列文章
不足之处望指正。