当前位置:   article > 正文

自制【平衡小车】程序篇——基于STM32核心_stm32平衡小车pid算法程序

stm32平衡小车pid算法程序

目录

一:程序整体构成

二:外设程序

1.角度获取

2.速度获取

3.电机控制

4.人机交互

三:PID控制器

四:下载链接


一:程序整体构成

        平衡小车站立的前提,一是对当前倾角进行测量并反馈,二是对当前速度进行反馈,前者利用MPU6050进行采集并通过I2C与主控进行信息传递,后者通过主控定时器的编码器模式进行采集,最终经过PID运算产生结果进行输出,在当前项目当中是将最终结果装载到定时器当中,经过TB6612转换为电压(即转速)来控制电机,所以整个项目可以划为6050-主控传递角度信息,编码器-主控传递速度信息,主控-6612电机控制,人机交互四个部分。

二:外设程序

1.角度获取

        博主采用6050作为角度传感器装置,网上有现成的代码可供参考,在此不做过多解释说明。6050六轴传感使用时需要注意有一个方向的速度偏移量过大,采集数据不适合作为实际数据作为传入参数进行计算,建议找到最稳定的测量方向作为小车的前后方向。

2.速度获取

        利用STM32定时器资源自带的编码器模式,对电机速度进行读取。下方代码是F103VCT6的配置,读取函数当中将其转换为short型,即将计数区间从0-65535变为-32768~32767之间,这样一来我们就可以从其正负来判断小车的驶向,并且要注意在前面初始化函数当中,重装载值必须为65535才能使无输入时读取为0。

  1. void Encoder_Init_TIM4(void)
  2. {
  3. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  4. TIM_ICInitTypeDef TIM_ICInitStructure;
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //GPIOB0,GPIOB1
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOB,&GPIO_InitStructure);
  12. /*TIM2 定时器配置*/
  13. TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  14. TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 分频不分频
  15. TIM_TimeBaseStructure.TIM_Period = 65535; //重载初值
  16. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频
  17. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
  18. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  19. /*编码器配置*/
  20. TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  21. TIM_ICStructInit(&TIM_ICInitStructure);
  22. TIM_ICInitStructure.TIM_ICFilter = 10;
  23. TIM_ICInit(TIM4, &TIM_ICInitStructure);
  24. TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除TIM的更新标志位
  25. TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  26. //Reset counter
  27. TIM_SetCounter(TIM4,0);
  28. TIM_Cmd(TIM4, ENABLE);
  29. }
  30. //读计数值
  31. int Read_Encoder(u8 TIMX)
  32. {
  33. int Encoder_TIM;
  34. switch(TIMX)
  35. {
  36. case 3: Encoder_TIM= (short)TIM3 -> CNT;
  37. TIM3 -> CNT=0;
  38. break;
  39. case 4: Encoder_TIM= (short)TIM4 -> CNT;
  40. TIM4 -> CNT=0;
  41. break;
  42. default: Encoder_TIM=0;
  43. }
  44. return Encoder_TIM;
  45. }

3.电机控制

        博主采用的电机驱动为TB6612电机驱动,理论最大输入12V,两路可控输出,分别由两路PWM输入来控制,由四个输入口控制输出极性。但是理论终究是理论,当前常见的现成模块上的钽电容耐压值限制的实际输入电压大小,一般只有钽电容耐压达到了25V才能直接加上12V输入,如果自己制作,钽电容选用额定电压=2*输入电压即可。

        所以电机控制部分需要定时器输出PWM,4个I/O口作为方向控制部分。

4.人机交互

        屏幕和蓝牙等人机交互部分可以自由选择,人机交互部分主要是方便寻找机械中值或后期开发升级,根据不同的要求进行选择。博主选择蓝牙模块进行上位机读取数据、测试波形等操作。

三:PID控制

        PID算法是平衡小车当中常见的控制算法,由角度环构成内环,由速度环构成外环,对平衡小车来说内环的建立实现其直立的效果,这个效果在无速度环参数添加时通常持续时间不长,如果能达到5S左右的直立状态就说明机械结构比较好。速度环加上后抗干扰性能会有提升,主要体现在长时间直立及位移后可以返回原点,对于PID函数,个人建议自己写,一是方便整合理解参数,另一方面在出错时利于修改。在整合程序时需要选择使用串级控制还是并级控制,是选用位置式PID又或是增量式PID。博主选用的是位置式PID公式+串级控制。

四:下载链接

F407ZGT6核心:https://download.csdn.net/download/qq_59194050/68349863

F103VCT6核心:https://download.csdn.net/download/qq_59194050/68353602

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

闽ICP备14008679号