ODrive移植keil(二)—— ODrive的程序架构

目录

  • 一、移植说明
  • 二、支持的驱动板
  • 三、程序架构说明
    • 3.1、从main开始
    • 3.2、TIM8更新中断
    • 3.3、AD转换的专题说明


ODrive、VESC和SimpleFOC 教程链接汇总:请点击

一、移植说明

  • 上一节教程的移植主要体现在硬件上,软件改动很小并且仍然为VScode版本,只是降低了进口芯片的使用量,并没有降低ODrive代码的难度。

  • 本节及之后的教程将把odrive移植到keil环境下,为了降低移植难度,同时也为了让大家更容易学习掌握移植后的代码,本次移植,只移植电机的核心控制功能,实现常用的一些功能。移植后的代码不用FreeRTOS系统,所有通信协议做为非核心功能也不再移植。

  • 移植没有采用HAL库,而是使用ST标准库,因为当前国产芯片多采用标准库,所以标准库的代码更容易移植到国产芯片上,最终可以实现电机驱动器的完全国产化。

  • 国外的电机驱动技术领先国内这是不争的事实,“洋务运动”一直都在,只是在不同的领域不同的范围,
    ODrive移植keil(二)—— ODrive的程序架构_第1张图片


二、支持的驱动板

本次移植,支持以下几种驱动板
ODrive移植keil(二)—— ODrive的程序架构_第2张图片
ODrive移植keil(二)—— ODrive的程序架构_第3张图片
ODrive移植keil(二)—— ODrive的程序架构_第4张图片

ODrive购买链接:某宝购买

三、程序架构说明

本次代码在v0.5.6版本上移植,v0.5.4之前的架构和当前架构差别较大,请大家注意版本,

就像盖房子,多层一般用砖混结构,高层必须用框架结构,

想要学习代码,要先了解程序架构,不同体量不同目标的代码采用不同的架构,

3.1、从main开始

ODrive移植keil(二)—— ODrive的程序架构_第5张图片
ODrive移植keil(二)—— ODrive的程序架构_第6张图片

初始化配置主要就是以上这些,
创建 rtos_main 主线程,进入这个函数,下图:

ODrive移植keil(二)—— ODrive的程序架构_第7张图片
ODrive移植keil(二)—— ODrive的程序架构_第8张图片

在主线程中又创建了2个线程(如果AXIS_COUNT=2),上图:
创建线程的具体函数如下,老外似乎很喜欢这种层层调用的复杂感。

ODrive移植keil(二)—— ODrive的程序架构_第9张图片

最终进入到真正的主循环,下图:

ODrive移植keil(二)—— ODrive的程序架构_第10张图片

主循环中做的工作很少,特别是进入“电机闭环”模式后,电机基本进入死循环状态,下图:

ODrive移植keil(二)—— ODrive的程序架构_第11张图片

main函数主要是初始化和创建线程,并最终执行一个简单的状态切换工作。

3.2、TIM8更新中断

驱动器的大部分工作都是在TIM8更新中断中处理,大概是因为定时器可以精确定时,这样在执行相关函数时,可以实现周期性运算。
ODrive移植keil(二)—— ODrive的程序架构_第12张图片

进入中断后,会先读编码器,下图:

ODrive移植keil(二)—— ODrive的程序架构_第13张图片

大部分工作都是在ControlLoop 这个软件触发 的中断中进行,下图:
为什么要用软件触发,不在TIM8更新中断中直接执行这些代码,我一直没想明白。

ODrive移植keil(二)—— ODrive的程序架构_第14张图片

上图可以看到,有两次电流采样,第一次是在下臂的PWM高电平(MOS打开)时采样,采样值用于电流变换,
第二次是在下臂的PWM低电平(MOS关闭)时采样,采样值用于校准电流。

control_loop_cb 函数中别有洞天,老外确实喜欢层层调用,难道这就是高级。下图:

这部分代码会让人看得很无助,因为所有的代码都在此时执行,比如最下面的开环控制,都已经闭环了难道它还在运行,它运行的意义是什么?

ODrive移植keil(二)—— ODrive的程序架构_第15张图片
除了main中少得可怜的工作量和几个通信线程,更新中断几乎执行了电机正常运行时的所有工作,真的是“你喜欢干活就会有干不完的活”。

3.3、AD转换的专题说明

Lowside模式下,电流采样由PWM触发,是整个代码中最精巧的部分,重点说明。

ODrive移植keil(二)—— ODrive的程序架构_第16张图片

ODrive移植keil(二)—— ODrive的程序架构_第17张图片
ODrive移植keil(二)—— ODrive的程序架构_第18张图片
ODrive移植keil(二)—— ODrive的程序架构_第19张图片

上面三个ADC的配置是由STM32CubeMX配置生成的代码,实际关于AD的配置还有一个在主线程中,下图:

ODrive移植keil(二)—— ODrive的程序架构_第20张图片
ODrive移植keil(二)—— ODrive的程序架构_第21张图片

综上,
ADC1的规则通道转换所有闲杂的ADC,比如温度检测,不需要时效,软件触发后将一直在后台转换;
ADC1的注入通道转换Vbus,由TIM1触发。
ADC2的规则通道转换M1_B相,由TIM8触发;ADC2的注入通道转换M0_B相,由TIM1触发。
ADC3的规则通道转换M1_C相,由TIM8触发;ADC3的注入通道转换M0_C相,由TIM1触发。

ADC转换结果在TIM8更新中断里读取,不是常用的ADC转换结束触发中断,下图:

ODrive移植keil(二)—— ODrive的程序架构_第22张图片


ADC的转换比较复杂,我将在之后移植的时候再详细分析。



(完)

你可能感兴趣的:(ODrive,架构,odrive,电机驱动器,stm32)