基于STM32F103C6T6的AB相霍尔编码电机的PID转速调节(CubeMx-HAL库)(未完成-持续更新)
主要是记录一下,以后忘了再来看看,也记录记录自己做过的东西
首先是硬件电路图,一下是驱动板的硬件电路图(来自于实验室的某大佬比赛开的BTN驱动 再说一遍不是我开的)图省事直接拿过来用了,到程序调的差不多了我会开一版新的驱动和主控。
以前自己也开了一套MOS的H桥有刷驱动,但是自己手贱,明明知道自己设计的是12V的驱动,偏就直接要怼24V的大疆电池,依稀记得大一的时候,一个大二学长开的主控,也是被我怼的24V,还有不多几天就电赛了,学长是连夜修啊,惭愧。
来看看硬件的原理图

此处电机用的是AB相霍尔编码电机如下

然后就是接线,电机上都写的清楚,我也就不细说了
之后就是CubeMx的配置,时钟树如下

先是PWM输出口,一共开俩一个控制正转一个控制反转,我配置的PWM频率是1KHz就差不多,满占空比的CCR值是999,然后根据原理图做出以下配置。
至于PWM频率的计算,公式是这个 PWMf = TIMf/(ARR+1)*(PSC+1)

然后就是AB相编码器的配置,刚开始不知道芯片自带解算,可以直接读到电机旋转方向和计数值,用的中断触发然后判断另一相的状态,以此获取正反转和计数值,CubeMx是可以直接配置AB相编码器的啊,然后具体配置如下,当时为啥选8191为溢出值,啊这个没啥关系,一般我们采样间隔时间越长他的电机编码器的计数值就越大,让计数值不要超过这个溢出值就行。

然后就是串口啊,串口配置默认就行,后面调PID的三个初始化值会用到串口,实验室的大佬写了上位机的调参软件(对就是上面开驱动这个大佬),开了DMA

DMA

中断

关掉CubeMx默认生成的回调函数(大佬怎么说就怎么做,毕竟是人家写的上位机,不用调一次参,下载一遍程序是真的香)

然后是CAN这个CAN我是准备与主控连接的,主控通过CAN发送目标值,由驱动板进行PID调节。
此处CAN的频率为1MHz,为啥选1MHz,当时是希望兼容Robomaster的程序的(没错画电路板的那个大佬又写了Robomatser的整套程序)

CAN开一个接收中断用于处理主机发送过来的速度目标值

然后开个Freertos嗯,大佬说没有Freertos不好玩,开!
都是默认,也没有再添加线程,在程序里自己写添加线程

然后配置,导出工程


之后就是软件代码编写
首先移植大佬的调参器线程,嗯,也没有经过大佬同意我就不放调参器线程函数了
之后就是电机编码器的软件代码
MotorBoard_Encoder.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : MotorBoard_PID.c
* @brief : MotorBoard_PID program body
* @author : Lesterbor
* @time : 2021-09-14
******************************************************************************
* @attention : 此处的电机获取速度值 写在了freertos的默认线程中
*
*
*
******************************************************************************
*/
/* USER CODE END Header */
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "MotorBoard_Encoder.h"
#include "stdio.h"
#include "tim.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PT */
signed short Speed = 0;
/* USER CODE END PT */
/* Function definition -------------------------------------------------------*/
/* USER CODE BEGIN FD */
/**
* @Function name : MotorBoard_Encoder_Init
* @Introduce : 编码电机的PID调节初始化
* @Return : Null
*/
void MotorBoard_Encoder_Init(void){
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
}
/**
* @Function name : MotorBoard_Encoder_Getspeed
* @Introduce : 获取编码器的值
* @Return : 电机编码器值
*/
unsigned short MotorBoard_Encoder_GetSpeed(void){
return __HAL_TIM_GET_COUNTER(&htim2);
}
/**
* @Function name : MotorBoard_Encoder_SetZero
* @Introduce : 编码器清零
* @Return : NULL
*/
void MotorBoard_Encoder_SetZero(void){
__HAL_TIM_SET_COUNTER(&htim2,0);
}
/* USER CODE END FD */
/************************ (C) CopyRight Lesterbor ******END OF FILE******/
MotorBoard_Encoder.h
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : MotorBoard_Encoder.h
* @brief : Header for MotorBoard_Encoder.c file.
* This file provides code for the configuration
* of the MotorBoard_Encoder instances
* @author : Lesterbor
******************************************************************************
* @attention
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MOTORBOARD_ENCODER_H_
#define __MOTORBOARD_ENCODER_H_
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

这篇博客详细记录了使用STM32F103C6T6微控制器,通过CubeMx和HAL库实现AB相霍尔编码电机的PID转速控制过程。博主分享了硬件电路设计、编码器配置、PWM频率计算、串口和CAN通信设置,以及PID算法和低通滤波的软件实现。目前PID调节还在调试中。
最低0.47元/天 解锁文章
(未完成-持续更新)&spm=1001.2101.3001.5002&articleId=120330665&d=1&t=3&u=3e8b93b4ad1b42a2afc8c238e0f15364)
1891

被折叠的 条评论
为什么被折叠?



