当前位置:   article > 正文

基于STM32的ROS车辆底层开发(调速部分)_ros stm32开发

ros stm32开发

C8T6核心板 调速教程

前言:本程序是在公众号小白学移动机器人的程序基础上对其进行改进适配,是对其内容进行扩充并对部分功能进行完善,最终修改至符合实际调速要求。其中的改进代码并不具有唯一性,需要结合自身的使用和学习进行进一步的改进和扩充,以便加强自身对stm32内容的理解。本教程仅对其中的调速部分进行讲解与分析。

一、改进动机及需求分析

1.需要将原有的RCT6核心板转移至现在的C8T6核心板

2.原程序的调速链条有逻辑漏洞

3.原C8T6核心板的编码器接口无定时器通道分配

4.需要可视化的速度数据

5.可以在PC上位机上对PID参数进行实时修改

二、硬件及连线部分

本教程调速使用的开发板为C8T6核心(爬山虎科技),其所使用的电机驱动芯片为DRV8848.

C8T6仅具有四个定时器资源,其中只有一个高级定时器TIM1和三个通用定时器TIM2,TIM3,TIM4.

开发板原理图如下图所示:

为尽可能通过该开发板所提供的定时器资源实现我们需要的功能,需要其进行合理的规划,具体规划如下:

·TIM1用于产生固定时间间隔的中断,并控制舵机

·TIM2用于读取编码器脉冲

·TIM3用于读取编码器脉冲

·TIM4用于控制双路电机

显然,我们需要使用的外设功能有以下几条:

1.两个直流减速电机

2.两个编码器(和电机在一起)

3.一个舵机

4.CH340通过串口1转TTL

5.ST-LINK等烧写仿真工具

6.MPU6050

由于本教程仅讲解调速部分,因此只对电机和编码器的接线进行讲解。

(左侧为外设接口,右侧为板子接口)

左电机M+                 左M+

左电机M-                  左M-

左电机编码器5v            左5V

左电机编码器GND          左GND

左电机编码器A             LED           TIM2_CH1

左电机编码器B             ReSYN         TIM_CH2

右电机编码器A             PA7           TIM3_CH2

右电机编码器B             PA6           TIM3_CH1

其余右侧电机接线同理

            

三、调速代码讲解

前注:本代码移植需要一定的C语言基础(c++亦可),在学习和调试前,最好对这部分内容进行有针对性的学习,以便更方便的阅读和修改代码。

调速链条共有如下几环:

1.设定目标速度信息

2.使用编码器读取速度信息

3.将目标速度信息和编码器读取的实时速度信息传入PID

4.增量式PID进行计算,并传出调整量

5.将调整量应用于电机

下面将沿着该链条对速度链进行梳理。

1.设定目标速度信息

2.使用编码器读取速度信息

首先对TIM2和TIM3进行初始化

然后设置读取TIM->CNT寄存器计数的函数

注意:32738为CNT上限的一个中间值,这样即可以做正转计数,又可以做反转计数,而不会产生溢出现象(因为正转CNT是加,反转CNT是减)

然后设置一个将得到的编码器数据进行处理并传出的函数:

这里值得注意的是:

左右轮速(线速度,角速度)是根据前后两轮定时器中断的脉冲差值计算的,因此,不同型号的编码器,其参数不同,我这里使用编码器为13线,电机减速比为30,采用四倍频读取脉冲,因此,每旋转一圈编码器的脉冲数为13*30*4。

所以这里结合车轮的直径做了线速度的换算:

使用其他的编码器或者车轮的时候,需要对这些参数进行修改,

另外,在这里,我除了将线速度传出外,还将车轮角速度传出:

最后函数形参拿到这些数据,在外部调用该函数,就可以完成对调用变量进行赋值的操作。

另外,速度信息需要持续的更新,因此需要设置一个定时器的中断,以便在固定的时间间隔拿一次速度信息,这里使用TIM1做这件事。

我这里做的是一个50ms中断。

需要更改PSC和ARR的值更改中断时间。

友情提示1MH为1000000Hz.

最后在中断服务函数里完成对速度信息的读取:

这里注意是怎么读的getPWMzuo和getPWMyou.

3.将目标速度信息和编码器读取的实时速度信息传入PID

这里的PID入口函数为:

4.增量式PID进行计算,并传出调整量

其函数体为:

这里的函数底层原理是增量式PID,在CSDN上对增量式PID有着非常详细的叙述,这里不展开。

但该段代码有几个值得注意的点:

·对Error进行了限幅,防止微小误差引起振荡,但该幅度需要自行确定,不可过大

·对控制器输出量进行了限幅,防止调整量过大,对电路造成损害。

·该函数最后调用了Set_Pwm,我将它写在了motor.c文件中,因此不要忘记在该PID文件中包含其头文件。

5.将调整量应用于电机

其代码为:

这里需要注意的是,这段代码涉及到电机的底层驱动方式,由于我们采用的是DRV8848芯片,使用双路PWM输出以控制电机,所以这里需要对CCR寄存器进行赋值操作以实现PWM的变化。(我写的绿字不要看,没用)

最后的myabs()为取绝对值函数。

至此调速链条讲解完毕。

四、PC上位机调试代码讲解

上位机调试界面如下:

该上位机程序下载链接:https://gitee.com/syuan7/y-serialplot

为方便调速,需要在上位机中输入速度的期望值和PID参数,以完成实时更改,极大加快调速效率。为此,需要植入通讯协议:

(友情提示:在该程序界面的?号处有非常详细的使用和格式说明)

首先需要对USART进行初始化,这里使用的是USART1:

然后编写usart1的中断服务函数:

该服务函数用于接收来自上位机usart1的输入数据(友情提示:注意修改缓存)
 

然后来到发送信息给上位机的函数:

其中分为:

通道名称帧头AABBCC

通道名称帧尾CCBBAA

数据帧头DDEEFF

数据帧尾FFEEDD

通道名称

数据信息

其中数据信息来自该函数:

它是从TIM1的中断服务函数中拿到的实时速度数据。

最后该函数通过usart_senddatas()函数,将打包好的数据发送给上位机。

现在来到从上位机拿到数据的函数:

(友情提示:注意修改缓存)

该函数主要是通过usart_get_data()函数来拿到来自上位机的数据,如下:

在拿到数据后,我们想将其应用到我们具体的变量中,以完成实际的操作,所以这里设置

set_cmd()函数:

至此,上位机通讯功能加入完毕。simg 小部件

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

闽ICP备14008679号