目录
本节介绍的adc外设高级用法用于电机电流控制。
从前面几节可知,电机力矩来自于转子的q轴受磁力,而磁场强度与电流成正比,也就是说电机力矩与q轴电流成正相关,控制了q轴电流就是控制了电机力矩。从前文电流控制内容可知,q轴电流从三个相线电流计算得到,三个相线电流通过电流采样单元连接到stm32的adc接口得到。这里要注意,本文全文没有提到过dq轴电压或相线的电压,因为相线电阻会随着温度而改变,而电流才是决定磁场强度。
采样时刻
从电机控制电路来看,相线的电流采样并不是随时都适合采的。
首先看采样单元位于下桥的电路(低侧采样),当下桥关闭时,流经低侧电流采样单元的电流为0,而电机绕组是一个电感,其电流不能突变,电机相线实际是有电流存在的,因此低侧采样只能在下桥打开或者上桥关闭(互补PWM)的状态下进行,但是不要在功率管刚打开或者关闭的时刻采样,因为开关动作时电流存在波动。回顾前文推导SVPWM内容,我们使用的是七段式SVPWM,在一个PWM周期内加入了000零矢量以及111零矢量,因此不管功率管是低电平导通还是高电平导通,在一个PWM周期内总是都存在3个下桥功率管全导通的时段,只要在该时段中间进行采样即可。
再看采样单元位于相线的电路(在线采样),不管上下功率管是否关闭,由于采样单元位于相线,相线电感电流不能突变,因此始终有电流流过,照理说可以随时采样,但是功率管在刚打开或者关闭的时候(此时定时器计数位于比较线)电流会有波动,所以最好在定时器计数上下溢出时即pwm三角波极值点的时候采样,此时电流比较稳定。
总结上面分析的采样时刻示意图如下图,注意图中配置的PWM模式为Mode1,并且配置有效电平为高电平,可以查看上一节关于PWM模式和有效电平的注释。
电机电流的采样时刻非常重要,但是如果不了解adc外设的高级用法,你虽然知道在应该哪个时刻采样电流,就会绕一个非常大的弯子去实现在特定时刻采样(比如煞费苦心地配置定时器中断或者精心设计一个延时,想尽可能在特定时刻进行采样,等等)。
在介绍采样方式前,先放出stm32cube中的adc配置项的解释,见下图:
触发采样
adc可以被定时器输出事件从硬件层面上触发采样,这样就可以自动在某些时刻进行采样了。这里要使用上节未进行介绍的高级定时器的重复计数器(Repetition Counter)以及输出事件(Trigger Event Selection)。adc外部触发源可以设置为定时器的输出事件,定时器每产生一个输出事件都会触发一次adc采样。定时器输出事件来源之一是定时器更新事件,定时器计数上下溢出可以产生定时器更新事件,重复计数器控制了定时器上下溢出多少次才产生一次定时器更新事件。示意图如下:
对于在线采样,由于所有极值点都可以进行采样,因此重复计数器参数不管设置多少都可以,只是影响到采样频率。
对于低侧采样,由于要保证在上桥关闭或者下桥打开状态下进行采样,采样时刻要么全是上极值点要么全是下极值点,因此重复计数器必须为奇数。要注意,pwm模式1或者模式2会影响采样时刻位于上极值点还是下极值点,举个例子,pwm模式1时,当定时器计数值大于比较线时,控制上桥的pwm正通道会输出无效电平,因此需要在上极值点采样,那么定时器起始计数值应当设置为大于0,这样可以跳过第一个下极值点,并且设置重复计数器为1,这样每次adc采样都会在定时器计数值上极值点被触发。
在stm32cube中,定时器触发adc采样功能需要设置高级定时器的配置项为:
adc通道分为两种,常规通道和注入通道,注入通道就是在常规通道采样时可以插队,注入通道采样完毕后,常规通道继续其未完成的采样。在stm32中,只有注入通道才能被高级定时器TIM1的输出事件触发,因此需要配置注入通道而不是常规通道:
同步采样
stm32的adc有多个通道对应多个IO口,有两种方式可以采集adc多个通道,分别是采样序列和同步采样。
采样序列:
多个adc通道可以配置到采样序列中,当adc被定时器触发采样时,采样序列中的多个通道会按照序列顺序自动依次采样,整个序列采样完成后产生一个采样完成中断。但是这个采样方式的多个通道不是同时进行的,有先后顺序的,在采集电机电流时,总是希望几个相线电流能够同时被采样到,因此同步采样更加好。有些stm32的adc只有一个,只能采用采样序列方式。
同步采样:
同步采样需要多个adc,配置为主adc和从adc。当主adc被定时器触发采样时,从adc也会同时进行采样,全部adc采样完成后产生一个采样完成中断。在stm32f1中,最多可以配置双adc同步模式;在stm32f4中,可以配置三adc同步模式。
以电机电流在线采样双采样单元为例,在stm32cube中,首先打开adc1的通道0和adc2的通道1,对应电路上的两个采样单元:
配置adc1为双同步注入模式,此时adc1即为主adc:
配置adc2:
stm32cube生成代码后,在main函数的while(1)前调用
c
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADCEx_Calibration_Start(&hadc2);
HAL_ADCEx_InjectedStart_IT(&hadc1);
HAL_ADCEx_InjectedStart(&hadc2);
开启双adc同步采样,配合定时器触发采样,就可以在硬件层面上实现特定时刻自动双adc同步采样。
至此,实现FOC的最重要的两个外设(定时器和adc)已经介绍完毕,你可以根据自己的电路环境,以及本文提供的stm32cube定时器和adc外设配置说明图,对配置项删减,尝试实现FOC控制。
你也可以等等再写代码,先了解一下接下来要介绍的cmsis-dsp库,因为反park变换、park变换、clark变换、pid控制器等等常用的功能,在cmsis-dsp库中都有。
点击查看本文开源的完整FOC工程