目录
ODrive、VESC和SimpleFOC 教程链接汇总:请点击
说明
电机驱动器中,通过PWM触发ADC,保证在下臂MOS打开的时候采样电流,这本是个难度极高的技术活。随着各芯片厂家的技术迭代,现在几乎所有单片机都有这个功能,可以说已经烂大街了。即便如此,在具体的电机驱动器程序中,PWM触发ADC采样仍然很容易出问题,主要是配置复杂。
一、PWM
- 官方代码中,高级定时器TIM1和TIM8分别输出互补PWM信号,驱动两路电机,本次移植,只移植了M0,所以我们只讲TIM1的配置。
- 电流采样,需要事先校准,一般在上电初始化的时候。
- ODrive的校准就与众不同,它设置在了下臂PWM为低电平(MOS关闭)时。
1.1、基本配置
上面的配置,
1、PWM频率是24KHz,
2、更新中断频率是48KHz,但是RepetitionCounter = 2,所以进入更新中断的频率是48/(1+2)=16KHz,
PWM波形如下图:
1.2、观察中断
在中断函数中设置一个脉冲,由GPIO8输出,下图:
1.3、电流变换频率
进入中断,其中一半的次数是电流变换,另一半的次数是校准,所以电流变换频率是8KHz,下图:
1.4、校准频率
8KH在,下图:
TIM_CounterMode_CenterAligned3,TIM_OCMode_PWM2,有没有想过为什么会这样配置,
正常我们会使用 TIM_CounterMode_CenterAligned1,TIM_OCMode_PWM1,但是这样的配置会在下臂关闭的时候更新中断,
而CenterAligned3/PWM2的配置刚好可以在下臂打开的时候更新中断,
通过这个地方,可以想象最初的ODrive很可能在更新中断中只做电流变换,没有校准,不是现在的样子。
1.5、control_loop_cb()
官方代码中,进入电流变换所属的中断后触发软件中断,然后在软件中断中执行大部分功能,下图:
本次移植,没有使用软件中断,用control_loop_cb()函数 代替软件中断后执行的函数,
当前例程不涉及到这部分,所以不再细说。
二、ADC采样
ODrive同时使用了ADC1/ADC2/ADC3,
在官方代码中:
ADC1的规则组采样ADC0----ADC16,上电初始化时软件触发后一直DMA后台转换,
ADC1的注入组采样电源电压,由TIM1更新触发
ADC2的规则组采样M1的B相,由TIM8更新触发
ADC2的注入组采样M0的B相,由TIM1更新触发
ADC3的规则组采样M1的C相,由TIM8更新触发
ADC3的注入组采样M0的C相,由TIM1更新触发
2.1、AD值错位问题
ADC1多通道规则转换时,如果使用DMA方式,经常会发生AD值错位的现象,比如第一个AD值的高字节放入的是低字节的数据,而低字节是第二个AD值的高字节数据,以此类推,转换值全部失效。
《SimpleFOC移植STM32F405RGT6》的时候,ADC_SoftwareStartConv 方式会发生了AD值错位现象,用DMA中断的方式解决了。
这次移植和上次一样的方法,但又发生了错位。最终用TIM2更新触发的方式解决了。
2.2、规则组转换
ADC1规则组移植时只转换了这4个通道,下图:
假如电源电压12V,经过分压后是0.64V,对应的AD值是794(0x31A),
ADC1的注入组也转换电源电压,此处主要验证ADC1规则组的转换值。
2.3、注入组转换
ADC1的注入组采样电源电压,
ADC2的注入组采样M0的B相,
ADC3的注入组采样M0的C相,
刚上电时,或者下臂MOS关闭时,Vo的理论输出值=1.65V,
2.4、观察AD转换值
发送指令“A”,读取ADC1规则组 四个通道的转换结果,
发送指令“B”,读取注入组 三个通道的转换结果,下图:
驱动板购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技
欢迎加入技术交流群:923734429 (入群申请写:CSDN)
(完)