视觉巡线小车——STM32+OpenMV(四)

目录

前言

一、整体控制思路

二、代码实现

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.2

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/*******电机控制周期,每十秒对电机控制一次*********/
    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系列文章

不足之处望指正。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在STM32主控OpenMV巡线的过程中,可以通过串口将数据从OpenMV发送给STM32进行处理和控制。首先,需要配置好STM32的串口波特率,与OpenMV相匹配。在串口代码中,需要注意字符接收必须以0x0d、0x0a结尾(回车换行),否则无法接收数据。因此,在OpenMV发送数据时,需要在输出后加上回车换行符。\[2\] 在处理左偏数据时,可以通过对数据进行处理,例如将num-100再赋给num变量,并将其加入到TIM控制PWM函数中。然而,需要注意的是,调试过程中可能会出现无法改变TIM两个通道的PWM参数的情况。这可能导致只能向一边偏的现象。此外,还需要注意矫正左右轮的速率,以避免在给相同PWM时出现微小偏移现象。这两个因素结合在一起可能导致小车只能往一个方向跑圆圈的现象。不过,值得一提的是,这种情况下小车的运动可能会非常平滑。\[3\] 在调整OpenMV的PID时,需要将rho的P参数调得比较大,以实现更好的巡线效果。 #### 引用[.reference_title] - *1* *2* *3* [Openmv+STM32F103C8T6视觉巡线小车](https://blog.csdn.net/weixin_51583957/article/details/123958565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值