平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)

平衡小车+野火pid上位机移植

    • 程序源码已经上传,需要的可以下载。
  • **一.首先下载STM32CUBEMX**
  • **二.配置相关单片机和相关功能**
    • 1.配置时钟和debug引脚
    • 2.开启freertos
    • 3.相关功能以及引脚的配置
      • 这里使用的相关功能有:
      • TIM1 编码器模式 用于记录左轮的编码器
      • TIM2 编码器模式 用于记录右轮的编码器
      • TIM3 PWM输出模式 用于控制电机
      • SPI1 用于控制OLED屏幕
      • USART1 串口配置
      • UART4 串口配置
      • 8个引脚用于连接矩阵键盘
    • 4.代码生成

本篇博客用于记录一下自己在制作平衡小车使用和学习到的相关东西。
首先是硬件方面:
1.用的两个硅胶轮胎,虽然很贵(140一对),但是真的很不错。
2.直流减速电机(330r/s)
3.0.96寸的oled屏幕
4.维特智能的十轴陀螺仪
5.直流驱动L298N+3S 2200航模锂电池
6.电压显示模块(以后一定要加!!有电池因为不知道电压所以用到亏电了)
7.矩阵键盘(4*4)
8.无线收发模块(正点原子LORA模块)
9.stm32f103zet6核心板
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第1张图片
上为实物图,因为csdn不能贴视频,所以这里就不演示功能了,平衡效果不还可以,但由于小车整体重心有点偏高,所以还有提升空间。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第2张图片
上位机图片

程序源码已经上传,需要的可以下载。

一.首先下载STM32CUBEMX

这里就不介绍具体怎么下载的了,可以去官网下载安装包,参考相关博客。

二.配置相关单片机和相关功能

1.配置时钟和debug引脚

平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第3张图片
首先配置时钟源,并将Clock Configuration的外部时钟源改为72MHz。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第4张图片
在开启时钟后,如果使用的是stlink,需要将SYS中的debug选项中的Serial Wire选中,并将时钟源选择TIM6。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第5张图片

2.开启freertos

首先简单介绍一下freertos,为什么要使用freertos?作为一个优秀的实时操作系统,freertos可以将cpu的使用率大大提升,可以在规定时间内完成指定任务,可以实现在多任务中来回切换实现。如原本的延时函数,在实时操作系统中单片机可以在A的延时函数中跳转到B任务直行B任务(大大提高了CPU的利用率),可以参考B站正点原子对于freertos的详细讲解。

在左侧最下方有Middleware的选项,里面勾选freertos,选择版本CMSIS_V1(听说第二个版本目前是存在一些bug的)。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第6张图片
启动后就可以在下方的Task and Queues中添加任务,并对任务进行相应的动态/静态选择,内存分配等。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第7张图片
我在这里创建了三个任务,分别是小车的控制任务,上位机通信任务,屏幕显示任务。
还有一点容易遗忘的是,如果之后要使用osDelayUntil函数,需要在include parameters选项中将该函数激活(默认是不激活的)
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第8张图片

3.相关功能以及引脚的配置

这里使用的相关功能有:

1.TIM1 编码器模式 用于记录左轮的编码器
2.TIM2 编码器模式 用于记录右轮的编码器
3.TIM3 PWM输出模式 用于控制电机
4.SPI1 用于控制OLED屏幕
5.USART1 连接无线收发模块,与电脑上位机相连
6.UART4 连接陀螺仪
7.8个引脚用于连接矩阵键盘

TIM1 编码器模式 用于记录左轮的编码器

平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第9张图片
点开Combined Channels的选项,选择编码器模式(Encoder mode),此时右边的芯片已经可以看到TIM1的通道1、通道2的引脚(我这里是PE9和PE11)已经变绿了,即为使用引脚。
接着勾选Encoder mode的模式,这里选择encoderMode是 TI1和TI2模式,即A、B相都会计数。
Input Filter滤波值是从1-15,看情况设定,是用来滤除一些杂波的。
至于分频我觉得选不选取决于两个电机的编码器一圈的值,可以先选择3,后期作调整。
到此一个轮子的编码器就配置好了。

TIM2 编码器模式 用于记录右轮的编码器

同TIM1类似,不多介绍。

TIM3 PWM输出模式 用于控制电机

平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第10张图片
先对TIM3进行使能,可以按照图示配置。
ARR和PSC相信大家都很熟悉了,是用来配置定时器的频率的。
h=72MHz/(arr+1)(psc+1)
这个可以根据需要配置,这里将psc设置为0,arr设置为7199。
然后勾选自动重装载使能,完成配置。
(下面的各通道初始值以及配置这里采用的是默认值,如果需要配置可以在下方配置)

SPI1 用于控制OLED屏幕

平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第11张图片
这里点开SPI ,勾选Transmit Only Master就使能了SPI1,其他都是默认的即可。
但是这里还需要三个额外的控制引脚,这里直接点击右侧芯片的引脚,选中GPIO_Output。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第12张图片

接着,在GPIO选项中可以给引脚命名,并对引脚进行初始化。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第13张图片
这样就完成了OLED 的引脚配置。

USART1 串口配置

平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第14张图片
首先点开USART1,在mode中选择Asynchronous。
然后如果需要更改波特率,可以在图中的3位置更改。

UART4 串口配置

与USART1类似,不多介绍。

8个引脚用于连接矩阵键盘

这里主要是配置GPIO,与前面屏幕配置类似,不再过多介绍。

4.代码生成

在Project Manager中可以将代码生成。
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第15张图片
首先是对工程的命名,其次选择编译器,这里用的是MDK,然后在Code Generator 中选择将各个文件分别保存为.c /.h文件.
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第16张图片
平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)_第17张图片

最后点击右上角的GENERATE CODE就可以得到工程文件啦。

由于篇幅限制,下篇再介绍如何设计代码以及pid、上位机通信协议的移植以及oled屏幕使用和矩阵键盘的使用代码。
如果有帮助不妨点个赞~

你可能感兴趣的:(pid,远程控制,stm32,stm32,pid)