当前位置:   article > 正文

STM32F103基于PID的蓝牙四麦小车(HAL库)_小车底盘控制代码

小车底盘控制代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、硬件需求
  • 二、底盘控制代码编写
    • 1.通过占空比对电机开环控制
    • 2.编码器测速得到电机当前转速
    • 3.PID算法实现对电机的闭环控制
  • 三、通过蓝牙调试器app控制底盘
    • 1.蓝牙调试器app的下载与使用
    • 2.蓝牙模块与单片机串口的连接

一、硬件需求

STM32F103ZET6开发板,两个TB6612电机驱动模块,HC-05蓝牙模块,四个光电编码器电机

二、底盘控制代码编写

1.通过占空比对电机开环控制

代码如下(示例):

在main函数中开启pwm输出通道。

  1.     HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_4);
  2.     HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_3);
  3.     HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2);
  4.     HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);

通过__HAL_TIM_SET_COMPARE()函数输入占空比

  1. void Set_Pwma(int motor)
  2. {
  3. int pwma_abs;
  4. if(motor>0) Motor_Left();
  5. else Motor_Right();
  6. pwma_abs=myabs(motor);
  7. __HAL_TIM_SET_COMPARE(&htim8,TIM_CHANNEL_1,pwma_abs);
  8. }
  1. int myabs(int num)
  2. {
  3. int temp;
  4. if(num<0) temp=-num;
  5. else temp=num;
  6. return temp;
  7. }

当输入值为负值时,电机反转

  1. void Motor_Left(void)
  2. {
  3. HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
  4. HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
  5. }
  6. void Motor_Right(void)
  7. {
  8. HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
  9. HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
  10. }

2.通过编码器测速得到电机当前转速

代码如下(示例):

在main函数中开启定时器6

    HAL_TIM_Base_Start_IT(&htim6);

调用定时器中断回调函数,每10ms返回一次。

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. if(htim == &htim6)
  4. {
  5. time_count++;
  6. Direction=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);//获取转动方向
  7. if(Direction==1)
  8. {
  9. CaptureNumber=65535-__HAL_TIM_GET_COUNTER(&htim3);//获取脉冲
  10. if(CaptureNumber==65535)
  11. {
  12. CaptureNumber=0;
  13. }
  14. htim3.Instance->CNT=0;
  15. NowCaptureNumber+=CaptureNumber;//计算总的脉冲数
  16. }
  17. else
  18. {
  19. CaptureNumber=__HAL_TIM_GET_COUNTER(&htim3);//获取脉冲
  20. htim3.Instance->CNT=0;
  21. NowCaptureNumber-=CaptureNumber;//计算总的脉冲数
  22. }
  23. var = NowCaptureNumber-OldCaptureNumber;//脉冲数的变化量
  24. OldCaptureNumber=NowCaptureNumber;
  25. speed1=var*60*100/4/500/30;//电机1转速
  26. }
  27. }

3.PID算法实现对电机闭环控制

将要用到的变量封装为一个结构体

  1. typedef struct
  2. {
  3. float target_val;
  4. float actual_val;
  5. float pwm_CCR;
  6. float Add_CCR;
  7. float err;
  8. float err_last;
  9. float err_sum;
  10. float err_last_last;
  11. float Kp,Ki,Kd;
  12. }tPid;

定义一个结构体类型变量

tPid pidMotor1Speed;
  1. void PID_init()
  2. {
  3. pidMotor1Speed.actual_val=0.0;
  4. pidMotor1Speed.target_val=0.00;
  5. pidMotor1Speed.Add_CCR=0.0;
  6. pidMotor1Speed.pwm_CCR=0.0;
  7. pidMotor1Speed.err=0.0;
  8. pidMotor1Speed.err_last=0.0;
  9. pidMotor1Speed.err_last_last=0.0;
  10. pidMotor1Speed.err_sum=0.0;
  11. pidMotor1Speed.Kp=10.0;
  12. pidMotor1Speed.Ki=5.0f;
  13. pidMotor1Speed.Kd=0.0;
  14. }

增量式PID算法

  1. float PID_realize(tPid * pid,int16_t actual_val)
  2. {
  3. pid->actual_val = actual_val;
  4. pid->err = pid->target_val - pid->actual_val;
  5. pid->Add_CCR = pid->Kp*(pid->err-pid->err_last)+pid->Ki*(pid->err)+pid->Kd*(pid->err+pid->err_last_last-2*pid->err_last);
  6. if(pid->Add_CCR<-1||pid->Add_CCR>1)
  7. {
  8. pid->pwm_CCR+=pid->Add_CCR;
  9. }
  10. Pwm_xianfu(&pidMotor1Speed,999);
  11. Pwm_xianfu(&pidMotor2Speed,999);
  12. Pwm_xianfu(&pidMotor3Speed,999);
  13. Pwm_xianfu(&pidMotor4Speed,999);
  14. pid->err_last_last=pid->err_last;
  15. pid->err_last=pid->err;
  16. return pid->pwm_CCR;
  17. }

对PID返回的PWM值进行限幅

  1. void Pwm_xianfu(tPid * pid,int16_t max)
  2. {
  3. if(pid->pwm_CCR>max) pid->pwm_CCR=max;
  4. if(pid->pwm_CCR<-max) pid->pwm_CCR=-max;
  5. if(pid->target_val==0)
  6. {
  7. pid->pwm_CCR=0;
  8. }
  9. }

设置PID目标速度并实现PID控制电机转速

  1. void motorPidSetSpeed(float Motor1SetSpeed,float Motor2SetSpeed,float Motor3SetSpeed,float Motor4SetSpeed)
  2. {
  3. pidMotor1Speed.target_val=Motor1SetSpeed;
  4. pidMotor2Speed.target_val=Motor2SetSpeed;
  5. pidMotor3Speed.target_val=Motor3SetSpeed;
  6. pidMotor4Speed.target_val=Motor4SetSpeed;
  7. Set_Pwma(PID_realize(&pidMotor1Speed,speed1));
  8. Set_Pwmb(PID_realize(&pidMotor2Speed,speed2));
  9. Set_Pwmc(PID_realize(&pidMotor3Speed,speed3));
  10. Set_Pwmd(PID_realize(&pidMotor4Speed,speed4));
  11. }

最后在编码器测速下方调用PID控制电机函数

motorPidSetSpeed(motor1speed,motor2speed,motor3speed,motor4speed);


三、通过蓝牙调试器app控制底盘

1.蓝牙调试器app的下载与使用

下载途径:https://pan.baidu.com/s/1OV5MgmTUjyNafIsshcdh6Q 
提取码:8888

2.蓝牙模块与单片机串口的连接

将蓝牙模块比单片机的串口引脚连接

使能串口

  1. __HAL_UART_ENABLE_IT(&huart3,UART_IT_RXNE);
  2. HAL_UART_Receive_IT(&huart3,(uint8_t *)&aRxBuffer,1);

编写串口回调函数来进行对PID目标速度的控制

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3. if(huart == &huart3)
  4. {
  5. if(Usart1_Rx_Cnt > 255)
  6. {
  7. Usart1_Rx_Cnt = 0;
  8. memset(RxBuffer,0x00,sizeof(RxBuffer));
  9. HAL_UART_Transmit(&huart3, (uint8_t *)"Êý¾ÝÒç³ö", 10,0xFFFF);
  10. }
  11. else
  12. {
  13. RxBuffer[Usart1_Rx_Cnt++] = aRxBuffer;
  14. if(aRxBuffer == 'A')
  15. {
  16. motor1speed=40;
  17. motor2speed=-40;
  18. motor3speed=40;
  19. motor4speed=-40;
  20. }
  21. if(aRxBuffer == 'B')
  22. {
  23. motor1speed=-40;
  24. motor2speed=40;
  25. motor3speed=-40;
  26. motor4speed=40;
  27. }
  28. if(aRxBuffer == 'C')
  29. {
  30. motor1speed=0;
  31. motor2speed=0;
  32. motor3speed=0;
  33. motor4speed=0;
  34. }
  35. if(aRxBuffer == 'D')
  36. {
  37. motor1speed=-40;
  38. motor2speed=-40;
  39. motor3speed=40;
  40. motor4speed=40;
  41. }
  42. if(aRxBuffer == 'E')
  43. {
  44. motor1speed=40;
  45. motor2speed=40;
  46. motor3speed=-40;
  47. motor4speed=-40;
  48. }
  49. if((RxBuffer[Usart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Usart1_Rx_Cnt-2] == 0x0D))
  50. {
  51. HAL_UART_Transmit(&huart3,(uint8_t *)&RxBuffer, Usart1_Rx_Cnt,0xFFFF);
  52. while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);
  53. Usart1_Rx_Cnt = 0;
  54. memset(RxBuffer,0x00,sizeof(RxBuffer));
  55. }
  56. }
  57. HAL_UART_Receive_IT(&huart3,(uint8_t *)&aRxBuffer,1);
  58. }
  59. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/694971
推荐阅读
相关标签
  

闽ICP备14008679号