上一节教程的移植主要体现在硬件上,软件改动很小并且仍然为VScode版本,只是降低了进口芯片的使用量,并没有降低ODrive代码的难度。
本节及之后的教程将把odrive移植到keil环境下,为了降低移植难度,同时也为了让大家更容易学习掌握移植后的代码,本次移植,只移植电机的核心控制功能,实现常用的一些功能。移植后的代码不用FreeRTOS系统,所有通信协议做为非核心功能也不再移植。
移植没有采用HAL库,而是使用ST标准库,因为当前国产芯片多采用标准库,所以标准库的代码更容易移植到国产芯片上,最终可以实现电机驱动器的完全国产化。
ODrive购买链接:某宝购买
本次代码在v0.5.6版本上移植,v0.5.4之前的架构和当前架构差别较大,请大家注意版本,
就像盖房子,多层一般用砖混结构,高层必须用框架结构,
想要学习代码,要先了解程序架构,不同体量不同目标的代码采用不同的架构,
初始化配置主要就是以上这些,
创建 rtos_main 主线程,进入这个函数,下图:
在主线程中又创建了2个线程(如果AXIS_COUNT=2),上图:
创建线程的具体函数如下,老外似乎很喜欢这种层层调用的复杂感。
主循环中做的工作很少,特别是进入“电机闭环”模式后,电机基本进入死循环状态,下图:
main函数主要是初始化和创建线程,并最终执行一个简单的状态切换工作。
驱动器的大部分工作都是在TIM8更新中断中处理,大概是因为定时器可以精确定时,这样在执行相关函数时,可以实现周期性运算。
进入中断后,会先读编码器,下图:
大部分工作都是在ControlLoop 这个软件触发 的中断中进行,下图:
为什么要用软件触发,不在TIM8更新中断中直接执行这些代码,我一直没想明白。
上图可以看到,有两次电流采样,第一次是在下臂的PWM高电平(MOS打开)时采样,采样值用于电流变换,
第二次是在下臂的PWM低电平(MOS关闭)时采样,采样值用于校准电流。
control_loop_cb 函数中别有洞天,老外确实喜欢层层调用,难道这就是高级。下图:
这部分代码会让人看得很无助,因为所有的代码都在此时执行,比如最下面的开环控制,都已经闭环了难道它还在运行,它运行的意义是什么?
除了main中少得可怜的工作量和几个通信线程,更新中断几乎执行了电机正常运行时的所有工作,真的是“你喜欢干活就会有干不完的活”。
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的转换比较复杂,我将在之后移植的时候再详细分析。
(完)