本帖最后由 zyz0926 于 2024-12-26 18:06 编辑
所谓的SDFM模块,即为Sigma-Delta 滤波器,是一个设计用于电机控制系统的高级数字滤波装置,
拥有四个独立的输入通道。在电机控制应用中,这些输入通道通常用于电流测量和解算器位置解码,每个输入通道都能独立地接收来自 Sigma Delta 调制器的比特流,即可看做为数字量采样。
在目前的电机应用中,SDFM一般是用于三相电流采样,由于场景的特殊性,各相电流采样具有同步性要求,同时又要求电流采样的实时性要求很高。但是由于Sigma-Delta采样原理,决定了同步信号触发后,SDFM取得前两个数据的存在问题。
SDFM单个滤波器的原理结构图如下图所示:
SDFM的三个关键参数即为:模块时钟SD_CLK, 过采样率OSR,偏移地址SH,SD_CLK决定了模块的计算速度,过采样率OSR决定了一次电流计算需要多少个bit位,OSR越高,数据精度越高。比如20M时钟下,OSR=250,则一次完整的Sigma-Delta 采样需要的时间为250/20 =12.5us.
所以一般电流采样需要提前触发,不然处理时间过长,无法保证计算的精确度以及响应度。当前电机控制领域,嵌入式软件开发上,通用的方案为:设计1路PWM,向上计数,同时设计两个事件。
第一个事件,触发中断处理程序,该事件以CMPA触发,即cnt=cmpa时,触发中断响应,进入中断后,中断开始即取得电流采样数据。
第二个事件,用于触发PWM的SOCA或者SOCB的同步事件,该事件以CMPB触发,即cnt=cmpb时,触发该同步事件。
SDFM的模块相应的寄存器可以选择PWM1到PWM7的SOCA或者SOCB的同步事件来作为其电流采样的同步开始信号。
这样,即可提前规划好CMPA以及CMPB的数值,达到正确且合适的电流采样时机。
这里举个实际的三相电机SDFM配置案例来说明情况:
芯片主频240M,系统时钟240M,AHB时钟240M,即PWM的时钟配置240M,不分频。SDFM模块时钟,SD_CLK=20M。过采样率OSR=250.
以PWM1中断作为伺服程序服务中断,PWM1向上计数,中断频率设计为16K。PWM的周期值prd=240M/16K=15000. 此时设计
EPwm1Regs.CMPA.bit.CMPA = (3*SD_OSR*(DSP28_SYSCLK/SD_CLK)) + IPM_delaytime/2;
EPwm1Regs.CMPB.bit.CMPB = (0*SD_OSR*(DSP28_SYSCLK/SD_CLK)) + IPM_delaytime/2;
配置中断触发时间为cnt=cmpa,中断开始时即开始采用电流采样值。
EPwm1Regs.ETSEL.bit.INTSEL = 4; // =4 CMPA Enable interrupt
使能SOCB转换,同步事件为cnt=cmpb。
EPwm1Regs.ETSEL.bit.SOCBEN = 1; // 使能SOCB
EPwm1Regs.ETSEL.bit.SOCBSEL = 6; // 向上计数, cnt=cmpb
EPwm1Regs.ETPS.bit.SOCBPRD = 1; // Generate pulse on 1st event
EPwm1Regs.ETCLR.bit.SOCB = 1; // Clear SOCA flag
同时开始SDFM模块下的同步触发,选择PWM1SOCB作为触发源 Sdfm1Regs.SDSYNC2.bit.WTSYNCLR = 1;
Sdfm1Regs.SDSYNC2.bit.SYNCSEL = 1; //syn sellect = 1:PWM1SOCB,=13:PWM4SOCB
Sdfm1Regs.SDSYNC2.bit.WTSYNCLR = 0;
这样配置的结果示意图如下:
如此配置,就可以做到提前触发,目标时间间隔后获取SDFM结果寄存器数值。
|