IT技术之家

首页 > 嵌入式

嵌入式

从零开始,用CubeMX让M2006电机转起来,大疆C板控制M2006电机_操气的小虫儿_cubemx控制电机

发布时间:2022-10-24 17:59:24 嵌入式 0次 标签:经验分享 自动化 stm32 单片机 arm
硬件环境Robomaster 开发板C型STLink V2XT30电源M2006电机+C610电调CubeMX配置基本的配置请参考《RoboMaster开发板C型嵌入式软件教程文档》中第0章和第14章。https://github.com/RoboMaster/Development-Board-C-Examples/blob/master/RoboMaster%E5%BC%80%E5%8F%91%E6%9D%BFC%E5%9E%8B%E5%B5%8C%E5%85%A5%E5...

发现网上很少有关于这个的文章,到处找,搜索引擎试了个遍,还在Robomaster的论坛里找了找,最终也是没有找到类似的文章。还好在B站上找到了一个视频教程,帮助很多,致敬前辈!,视频链接在文末。但是这个视频有些长,一个多小时,想看完还是要有点耐心的,所以想着写个文章。官方虽然给的有例程,但是对于新手来说又略显复杂,而且C板的教程里忽略了一个细节,直接按照C板教程里做会发现电机不转,我就是卡在了这里,搞了两三天也没搞定,还好前辈的视频里说了这个问题,具体在视频1:08:20提及,这个问题搞定后我的2006电机终于转了起来,随后写下这篇文章。

硬件环境

Robomaster 开发板C型

STLink V2

XT30电源

M2006电机+C610电调

我是通过SWD把C板和STLinkV2连接起来的,?四根线对应连接就可以了,STLinkV2的电路板上能看到引脚名称。

《ROBOMASTER开发板C型用户手册》

?

CubeMX配置

基本的配置请参考《RoboMaster开发板C型嵌入式软件教程文档》中第0章和第14章。

https://github.com/RoboMaster/Development-Board-C-Examples/blob/master/RoboMaster%E5%BC%80%E5%8F%91%E6%9D%BFC%E5%9E%8B%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3.pdfhttps://github.com/RoboMaster/Development-Board-C-Examples/blob/master/RoboMaster%E5%BC%80%E5%8F%91%E6%9D%BFC%E5%9E%8B%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3.pdf需要注意的是,配置完成后,CAN1_RX和CAN1_TX是这样的,

?但在开发板原理图中CAN1_RX和CAN1_TX分别对应的是PD0和PD1,

?所以要在Pinout view中修改到正确的位置,否则电机不转。

?程序代码

while循环里的代码,为什么这样请参考《Robomaster C610无刷电机调速器使用说明》中CAN通信协议部分。

while (1)
  {
		CAN_TxHeaderTypeDef pHeader1;
		pHeader1.StdId = 0x200;       //标识符:0x200
		pHeader1.IDE = CAN_ID_STD;    //帧类型:标准帧
		pHeader1.RTR = CAN_RTR_DATA;  //帧格式:DATA
		pHeader1.DLC = 0x08;          //DLC:8字节
		
		uint8_t aData[8];
		aData[0] = 200 >> 8;          //电调ID:1,控制电流值高8位
		aData[1] = 200;               //电调ID:1,控制电流低8位
		
		HAL_CAN_AddTxMessage(&hcan1, &pHeader1, aData, 0);
  }

还要搞一个函数,还没搞懂这个函数是干嘛的,但是必须要用,否则电机不转。

void can_filter_init(void)
{
    CAN_FilterTypeDef can_filter_st;
    can_filter_st.FilterActivation = ENABLE;
    can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK;
    can_filter_st.FilterScale = CAN_FILTERSCALE_32BIT;
    can_filter_st.FilterIdHigh = 0x0000;
    can_filter_st.FilterIdLow = 0x0000;
    can_filter_st.FilterMaskIdHigh = 0x0000;
    can_filter_st.FilterMaskIdLow = 0x0000;
    can_filter_st.FilterBank = 0;
    can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
    HAL_CAN_ConfigFilter(&hcan1, &can_filter_st);
    HAL_CAN_Start(&hcan1);
    HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);

    can_filter_st.SlaveStartFilterBank = 14;
    can_filter_st.FilterBank = 14;
    HAL_CAN_ConfigFilter(&hcan2, &can_filter_st);
    HAL_CAN_Start(&hcan2);
    HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
};

致敬:

从零开始,用cube MX让2006电机转起来,CAN通信协议(RoboMaster战队培训日常)_哔哩哔哩_bilibili