基于STM32F103C6T6的AB相霍尔编码电机的PID转速调节(CubeMx-HAL库)(未完成-持续更新)

这篇博客详细记录了使用STM32F103C6T6微控制器,通过CubeMx和HAL库实现AB相霍尔编码电机的PID转速控制过程。博主分享了硬件电路设计、编码器配置、PWM频率计算、串口和CAN通信设置,以及PID算法和低通滤波的软件实现。目前PID调节还在调试中。

基于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 */

  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值