大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

1.首先,我们先了解一下大疆开发板A型的资料,官方有提供

官网:RoboMaster 机甲大师赛

芯片型号STM32F427IIH6大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第1张图片

2.了解M3508直流无刷电机的资料,官网有提供

 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第2张图片

 3.于是我找到了C620电调的资料,官网有提供

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第3张图片

 4.好了,现在控制芯片和控制方式都清楚了,接下来按照说明手册接好线后就可以开始配置STM32CubeMX

1)新建new project,选择开发板A型的芯片

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第4张图片

2)打开外部高速时钟

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第5张图片

这是我的时钟树配置

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第6张图片

3)我选择用can总线指令控制,所以根据开发版A型原理图打开相应的接口

其中can1为电调专用接口,can2为DJI OnboardSDK和Robomaster UWB定位系统用

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第7张图片

 我这里选择can1,并在原理图中找到引脚,在STM32CubeMX中打开

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第8张图片

 打开接收中断

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第9张图片

按照C620手册要求CAN的通信速率的1Mbps配置

71.42857142857143ns∗(10 +3+1) = 1000ns = 1us=1mbps

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第10张图片

 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第11张图片

4)为了兼容大疆的驱动文件,把can1和can2的参数配置成一样

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第12张图片

 5)开启24V电源

开发板A型24V输出电源默认关闭,只有12V可用,由M3508电机使用手册可知,电机的额定电压是24V

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第13张图片

 根据开发板A型原理图找到控制24V输出电源的引脚

在STM32CubeMX中配置

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第14张图片

6) 常规配置及生成代码

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第15张图片

注意生成路径不要有中文 

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第16张图片

5. 配置工程文件(keil5MDK)

1)移植大疆给的CAN驱动库文件

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第17张图片

2) 在工程中手动添加移植文件的路径

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第18张图片

 3)把移植文件添加到工程,并编译一下看看有没有出错

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第19张图片

 6.调用函数驱动M3508

1)包含驱动的头文件

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第20张图片

#include "bsp_can.h"
#include "CAN_receive.h"

 2)初始化CAN总线的屏蔽滤波器并开启24V输出电源

 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第21张图片

	can_filter_init();
	
	HAL_GPIO_WritePin(GPIOH, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH, GPIO_PIN_3, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH, GPIO_PIN_4, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH, GPIO_PIN_5, GPIO_PIN_SET);
	
	HAL_Delay(10);

3)调用函数

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第22张图片

CAN_cmd_chassis(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4);
HAL_Delay(10);

 要注意的是输入电流值不得超过规定范围

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第23张图片

 最后编译工程烧录到开发板,电机就能动啦!刚开始建议固定好电机,调的速度不要太高!注意安全!

7.PID控制

1)移植官方PID文件

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第24张图片2)把移植文件添加到工程

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第25张图片2)包含头文件 ,并编译一下看看有没有出错 

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第26张图片

#include "pid.h"

3)声明PID数据结构体,电机数据指针和目标速度变量及PID的三个参数

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第27张图片

pid_type_def motor_pid;	//声明PID数据结构体
const motor_measure_t *motor_data;//声明电机结构体指针
int set_speed = 0;//目标速度
const fp32 PID[3]={P,I,D};

这里PID需要自行调参,文章最后有推荐调参工具

4)初始化PID和对应电机的数据指针

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第28张图片

PID_init(&motor_pid,PID_POSITION,PID,16000,2000);//结构体,计算模式,参数,最大输出,最大积分输出
motor_data = get_chassis_motor_measure_point(0); //获取电机数据指针编号范围(0~3)

 5)使用PID公式并将计算出的电流发送至CAN总线

大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制_第29张图片

PID_calc(&motor_pid,motor_data->speed_rpm,set_speed);//结构体,实际速度,设定速度
CAN_cmd_chassis(motor_pid.out,motor_pid.out,motor_pid.out,motor_pid.out);//PID输出
HAL_Delay(2);

8.调参工具

1)STM32CubeMonitor

2)STMStudio

下载官网:STMicroelectronics: Our technology starts with you - STMicroelectronics


如果对你有帮助,谢谢你的点赞支持!

你可能感兴趣的:(单片机,stm32,物联网,c++)