大疆M3508、M2006-PID控制的STM32F1移植

大疆M3508、M2006-PID控制的STM32F1移植

前言:

距离第一篇《PID与三环控制-以大疆M3508为例》已有半年的时间,很荣幸能与朋友们一起交流探讨,也是在交流中写出了第二篇关于CAN总线使用的《M3508CAN总线配置方法》这一篇入门小文章。感谢大家的支持。

提起来也惭愧,几位朋友曾问有没有STM32F1的电机控制程序,由于我使用F4板子,手头上并没有F1的程序。当时向一位朋友承诺,很快就会移植一个F1版本出来。

一转眼几个月过去,期间发生太多事,但最终得空移植出来。F1版本功能与F4版本无差别,有需要的朋友请到文末。

这次移植过程并不复杂,只是其中出现不少玄学问题令我无法理解,在这里也希望大佬们指点下我。


分析

按照之前程序的功能,咱们能分析出移植的重点在于CAN通信,除此之外,把串口外设时钟简单调整一下就可以实现原F4程序的功能。至于PID和报文处理等模块算是上层建筑,不需要怎么改动。

对于CAN通信,按照第二篇里所说的那样,可以分为以下几部分:

  • 如何配置1Mbps的总线速率
  • 接收中断回调
  • 过滤器配置

实施

移植环境选择

我手头上有STM32F1VET6的板子,恰好与组内成员使用的相同,就将其作为目标板。实际上,F1的芯片修改一下Flash下载算法基本上都可以用。

前一阵子总有人谈到他们用CubeMX进行配置,而我对于这个软件的印象还停留在它刚推出时BUG繁多,一直也就没有使用。看样子几年过去ST生态又完善了不少。这次也就试着上手用一用。

用了MX,自然也就要用HAL库,选择了最新的1.8.4版本。然而新版本HAL库却给CAN通信移植增加了难度。

1Mbps怎么得到?

在F4的168MHz主频下,想要给CAN配置出1Mbps并不是难事,按照先前文章里的说法,预分频系数、BS1、BS2的选择非常多。然而F1往往采用72M的sysclk,到了CAN挂载的APB1最大只有36MHz,看似控制三个数值得到1Mbps并不难,实际上却有隐性限制,也正是这里的玄学问题困扰了我两天之久

CubeMX的限制

CubeMX在进行CAN配置时可以直接设定三个参数:预分频系数、BS1、BS2,但并不是完全的随意组合。其中36M可以分为4*9、6*6、12*3等组合,但是MX对于一位传输的时间(Nominal Bit Time)有限制,动不动就会弹出阻止组合的消息框提示不能让传输一位的时间太短。
错误提示

这样一来,可选的组合更少了,一般来说,预分频系数不要设置得太小(不小于4),以保证tq够大从而使传输一位的时间足够长。虽然看似仍有多个组合可以选择,但这里也为后面挖下了大坑。

隐含的参数要求

将移植好的程序拿去用电机实测,发现并不能使用,接收中断不会被触发,发送报文时会进入Error_Handler。明显是CAN通信上有问题,尝试回环模式仍不能正常工作,意味着并不是外围硬件问题。在多次debug无果后,我修改了那三个参数,惊喜的发现回环模式下竟然可以正常工作了!

因为是CubeMX允许的组合,之前就没有考虑过会是参数设置的问题,可到这里还没完。回环模式测试通过后,拿到电机上实测发现还是不行!!

这我就不明白了呀,回环模式可以正常收发怎么普通模式就出问题了呢,但我又改了改三个参数,改成这样一个组合:prescaler=2,BS1=9,BS2=8。这时,一切正常,电机照常运行。

STM32F1和F4的CAN外设最高通信速率都是1Mbps,在如此逼近上限的工作情况下会出现问题是意料之内的,特别对于频率较低的F1,但其中的原理我却没能弄明白。

恳请懂得其中缘由的高人能指点一下原理。

接收中断

如果前面频率的配置带有那么一点点玄学意味的话,那么接收中断组织方式这方面的变化就靠谱多了。

查看参考手册,发现F4和F1在中断方面没有什么区别,都是四条中断线:transmit interruptFIFO 0 interruptFIFO 1 interrupterror and status change interrupt

这样,配置的步骤就可以分为:

  1. 开启NVIC中FIFO0的中断CAN1_RX0_IRQn,并设置优先级
  2. 为中断向量指向的函数CAN1_RX0_IRQHandler填入HAL提供的处理函数
  3. 使用HAL_CAN_ActivateNotification函数打开CAN的FIFO0中断
  4. 在回调函数HAL_CAN_RxFifo0MsgPendingCallback中填写要做的事

发送中断同理,具体中断回调函数内容请见第二篇文章。

过滤器设置

CubeMX没有提供过滤器的图形化配置,所以需要在使用之前加入配置信息。

总的来说,F1与F4在CAN硬件上没有太大区别,区别是F4有一主一从的CAN1、CAN2,一般的F1只有一个CAN1(互联型为两个)。相应的,F4配备了28个两个CAN共享的过滤器,而F1只有14个。

所以为从CAN设置过滤器起始在F1上就没有意义了。

filterInitType.FilterBank=0;//初始化过滤器0
	filterInitType.FilterMode=CAN_FILTERMODE_IDMASK//掩码模式
	filterInitType.FilterScale = CAN_FILTERSCALE_32BIT;
  filterInitType.FilterIdHigh = 0x0000;
  filterInitType.FilterIdLow = 0x0000;
  filterInitType.FilterMaskIdHigh = 0x0000;
  filterInitType.FilterMaskIdLow = 0x0000;//接收所有报文
  filterInitType.FilterFIFOAssignment = CAN_RX_FIFO0;//通过的报文放入FIFO0
  filterInitType.FilterActivation = ENABLE;
 // filterInitType.SlaveStartFilterBank = 14;
  if (HAL_CAN_ConfigFilter(&hcan, &filterInitType) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

如此,过滤器配置完毕。


技术新人,水平一般,如果发现文中错误请指出,十分感谢。

前两篇相关文章链接,欢迎批评指正:

《PID与三环控制-以大疆M3508、M2006为例》

《M3508、M2006电机CAN总线知识与配置方法》


程序:

F1、F4控制程序以及更多嵌入式、电机控制相关文章可以移步公众号,来找我聊聊天吧:

公众号

里面也有演示视频哦。


欢迎转载,请注明原文地址与作者:

作者:胡小安

原文链接:https://blog.csdn.net/qq_28039135/article/details/120714646

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值