ODrive、VESC和SimpleFOC 教程链接汇总:请点击
一、移植说明
-
上一节教程的移植主要体现在硬件上,软件改动很小并且仍然为VScode版本,只是降低了进口芯片的使用量,并没有降低ODrive代码的难度。
-
本节及之后的教程将把odrive移植到keil环境下,为了降低移植难度,同时也为了让大家更容易学习掌握移植后的代码,本次移植,只移植电机的核心控制功能,实现常用的一些功能。移植后的代码不用FreeRTOS系统,所有通信协议做为非核心功能也不再移植。
-
移植没有采用HAL库,而是使用ST标准库,因为当前国产芯片多采用标准库,所以标准库的代码更容易移植到国产芯片上,最终可以实现电机驱动器的完全国产化。
-
移植不是为了代替VScode版本。移植的终极目的是掌握电机控制核心技术,并实现百分之百的国产化。
-
国外的电机驱动技术领先国内这是不争的事实,“洋务运动”一直都在,只是在不同的领域不同的范围,
二、支持的驱动板
购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
三、程序架构说明
本次代码在v0.5.6版本上移植,v0.5.4之前的架构和当前架构差别较大,请大家注意版本,
就像盖房子,多层一般用砖混结构,高层必须用框架结构,
想要学习代码,要先了解程序架构,不同体量不同目标的代码采用不同的架构,
3.1、从main开始
初始化配置主要就是以上这些,
创建 rtos_main 主线程,进入这个函数,下图:
在主线程中又创建了2个线程(如果AXIS_COUNT=2),上图:
创建线程的具体函数如下,老外似乎很喜欢这种层层调用的复杂感。
最终进入到真正的主循环,下图:
主循环中做的工作很少,特别是进入“电机闭环”模式后,电机基本进入死循环状态,下图:
main函数主要是初始化和创建线程,并最终执行一个简单的状态切换工作。
3.2、TIM8更新中断
驱动器的大部分工作都是在TIM8更新中断中处理,大概是因为定时器可以精确定时,这样在执行相关函数时,可以实现周期性运算。
进入中断后,会先读编码器,下图:
大部分工作都是在ControlLoop 这个软件触发 的中断中进行,下图:
为什么要用软件触发,不在TIM8更新中断中直接执行这些代码,我一直没想明白。
上图可以看到,有两次电流采样,第一次是在下臂的PWM高电平(MOS打开)时采样,采样值用于电流变换,
第二次是在下臂的PWM低电平(MOS关闭)时采样,采样值用于校准电流。
MOS关闭时的采样可以理解为没有电流流过时的运放输出电压,这个采样值作为校准值。一般的代码都是在上电初始化的时候,校准一下电流,之后的代码运行都以这个校准值为参考。ODrive的校准方式,初始化时校准,每次中断时再校准一次,校准值一直在更新,可以理解为动态校准。我也是第一次见到这种校准方式,它为什么要用这种校准方式,这种校准方式有什么优点,不清楚。
control_loop_cb 函数中别有洞天,老外确实喜欢层层调用,难道这就是高级。下图:
这部分代码会让人看得很无助,因为所有的代码都在此时执行,比如最下面的开环控制,都已经闭环了难道它还在运行,它运行的意义是什么?
除了main中少得可怜的工作量和几个通信线程,更新中断几乎执行了电机正常运行时的所有工作,真的是“你喜欢干活就会有干不完的活”。
3.3、AD转换的专题说明
Lowside模式下,电流采样由PWM触发,是整个代码中最精巧的部分,重点说明。
上面三个ADC的配置是由STM32CubeMX配置生成的代码,实际关于AD的配置还有一个在主线程中,下图:
综上,
ADC1的规则通道转换所有闲杂的ADC,比如温度检测,不需要时效,软件触发后将一直在后台转换;
ADC1的注入通道转换Vbus,由TIM1触发。
ADC2的规则通道转换M1_B相,由TIM8触发;ADC2的注入通道转换M0_B相,由TIM1触发。
ADC3的规则通道转换M1_C相,由TIM8触发;ADC3的注入通道转换M0_C相,由TIM1触发。
ADC转换结果在TIM8更新中断里读取,不是常用的ADC转换结束触发中断,下图:
ADC的转换比较复杂,我将在之后移植的时候再详细分析。
驱动板购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技
欢迎加入技术交流群:923734429 (入群申请写:CSDN)
(完)