官网:RoboMaster 机甲大师赛
这是我的时钟树配置
其中can1为电调专用接口,can2为DJI OnboardSDK和Robomaster UWB定位系统用
我这里选择can1,并在原理图中找到引脚,在STM32CubeMX中打开
打开接收中断
按照C620手册要求CAN的通信速率的1Mbps配置
71.42857142857143ns∗(10 +3+1) = 1000ns = 1us=1mbps
开发板A型24V输出电源默认关闭,只有12V可用,由M3508电机使用手册可知,电机的额定电压是24V
根据开发板A型原理图找到控制24V输出电源的引脚
在STM32CubeMX中配置
注意生成路径不要有中文
#include "bsp_can.h"
#include "CAN_receive.h"
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);
CAN_cmd_chassis(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4);
HAL_Delay(10);
要注意的是输入电流值不得超过规定范围
最后编译工程烧录到开发板,电机就能动啦!刚开始建议固定好电机,调的速度不要太高!注意安全!
#include "pid.h"
pid_type_def motor_pid; //声明PID数据结构体
const motor_measure_t *motor_data;//声明电机结构体指针
int set_speed = 0;//目标速度
const fp32 PID[3]={P,I,D};
这里PID需要自行调参,文章最后有推荐调参工具
PID_init(&motor_pid,PID_POSITION,PID,16000,2000);//结构体,计算模式,参数,最大输出,最大积分输出
motor_data = get_chassis_motor_measure_point(0); //获取电机数据指针编号范围(0~3)
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);
下载官网:STMicroelectronics: Our technology starts with you - STMicroelectronics
如果对你有帮助,谢谢你的点赞支持!