电机控制单电阻采样机制是在一个 PWM 波形内采集两相电流 ADC 数据,但某些扇区边界条件下只能获得一路电流 ADC 数据, 需要对 PWM 波形进行变形用于构造电流采样区域。
<font color="#33b1c8"><strong>背景介绍</strong></font>
根据电机控制拓扑结构,单电阻采样在一个 PWM 控制周期内可以取得两相电流数据:
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-38996-1.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-38997-2.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
在扇区边沿无法获得两相电流信号。
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-38998-3.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
<font color="#33b1c8"><strong>波形产生</strong></font>
ST 专利的方法是在波形的中间部分产生变形波形,在变形后的波形上就可以得到两相电流 ADC 数据;
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-38999-4.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
当然还有目前比较流行的波形移位方法也可以做到相同效果。 波形如下:
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-39000-5.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
STM32 系列单片机 Timer 有足够的功能,可以产生上面两种波形,机制如下:
<font color="#33b1c8"><strong>PWM 波中间变形</strong></font>
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-39001-6.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
1. 设定 CCR4 的 DMA 通道,并且设定此时 Timer1 的 preload 为禁止状态;
<pre style="overflow-x:auto; background-color:#e9e9e9;">TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);</pre>
2. 在 CCR4 比较值部分产生 DMA 事件;
<pre style="overflow-x:auto; background-color:#e9e9e9;">DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(TIM1->CCR1));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(uint32_t)(hDmaBuff2);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 2u;
….
TIM_DMACmd(TIM1,TIM_DMA_CC4,ENABLE);
</pre>
3. 在 1 点上将 CCR1 数据直接修改为周期数据+1;
4. 在 2 点上将 CCR1 数据修改为 CCR1’的数据;
5. 时间计算上按照上面的图示设定,中间凹陷时间为两边补充波形时间之和。
<font color="#33b1c8"><strong>波形移位变形</strong></font>
<center><img src="http://mcu.eetrend.com/files/2018-04/wen_zhang_/100011075-39002-7.jpg&q…; alt="电机控制单电阻采样 PWM 变形信号产生"></center>
1. 设定 Timer1 的 update 事件的 DMA 通道
<pre style="overflow-x:auto; background-color:#e9e9e9;">DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(TIM1->CCR1));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(uint32_t)(hDmaBuff2);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 2u;
……
TIM_DMACmd(TIM1,TIM_DMA_Update,ENABLE);
</pre>
2. 在 1 点上更新 CCR1 数据为 CCR1 数据;
3. 在 2 点上更新 CCR1 数据为 CCR1’数据;
4. 保证前后的移位时间相同。
来源:<a href="http://www.21ic.com/stm32/experience/share/">ST意法半导体</a>