您的当前位置:首页正文

pmsm3_1 电流采样程序的讲解

2023-03-17 来源:易榕旅网


问题一电流采样

硬件上用的是霍尔传感器.

图一是霍尔传感器的输入输出特性曲线。找了图上的两点(1V,-10A)和(2V,5A),算出来斜率为1/15=0.066。

图一是霍尔传感器的输入输出特性曲线

DSP中采样最大值为3.3V,对应的寄存器值为4096,所以采样后寄存器中的值对应的电压值为3.3V/4096。

程序中电流采样计算如下: DatQ15 = ((AdcMirror.ADCRESULT2 + AdcMirror.ADCRESULT3 +

AdcMirror.ADCRESULT4 + AdcMirror.ADCRESULT5 + AdcMirror.ADCRESULT6 + AdcMirror.ADCRESULT7 + AdcMirror.ADCRESULT8)/7) - p->ImeasAOffset; Tmp = _IQ15mpy(p->ImeasAGain,DatQ15); p->ImeasA = _IQ15div(Tmp,_IQ15(BASE_CURRENT)); “p->ImeasAOffset”是初始时化后就进行的一次采样,保存为偏移值。“p->ImeasAGain”是在结构体ILEG2DCBUSMEAS设置的值,为_IQ15(383.3856)。BASE_CURRENT为基准电流值,为1.5A 我计算的“p->ImeasAGain”值步奏如下: 设采样结果寄存器中的值为P,第一次采样得到的偏移值为Offset,实际采样的电流为I,则应该有这样的关系式(因为第一次已经减去了偏移,相当于图1的坐标变成了以原点为起点的了吧?如图2所示?):应该为:

3.3V1(POffset)I,照这样算出来的ImeasAGain4096153.3V*15=0.012,这与程序中的_IQ15(383.3856)相差的太大了。不知道计算错在

4096哪里,请师兄帮忙指点下!!!

0

图2 减去偏移后的输入输出特性曲线

另外,还有一个问题,发现硬件上霍尔电流的输入输出端接反了,那应该在每一个采样算出来的电流值再乘以(-1)吧??

问题二中断时间

程序中的主要运算都是在PWM定时器的下溢中断进行的,看不懂程序中是如何计数器赋计数周期的值,因此一直没搞懂每隔多久进行一次下溢中断。

在程序一开始的初始化中有定义“float32 T = 0.001/ISR_FREQUENCY;”

ISR_FREQUENCY定义为了14,是不是指的就是下溢中断周期为14Khz呢??,因为在程序中有“pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2;”,这句话是不是就把“SYSTEM_FREQUENCY”、“T”、“pwm1.PeriodMax”联系到一起了,最终只要改变T的值就改变了下溢中断周期了呀?

然后真正决定下溢中断时间的是不是“pwm1.update(&pwm1);”这条语句中呀?在这个函数中有下面一段程序:

Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15 MPeriod = (int16)(Tmp>>16) + (int16)(p->PeriodMax>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)

EPwm1Regs.TBPRD = MPeriod; EPwm2Regs.TBPRD = MPeriod; EPwm3Regs.TBPRD = MPeriod;

是不是这几句程序决定了下溢周期啊?是的话,下溢周期该如何计算呢?其中,MfuncPeriod的注释是Period scaler,它的值为0x7FFF。

希望师兄指点指点!!!谢谢!!

DatQ15 = ((AdcMirror.ADCRESULT2 + AdcMirror.ADCRESULT3 +

AdcMirror.ADCRESULT4 + AdcMirror.ADCRESULT5 + AdcMirror.ADCRESULT6 + AdcMirror.ADCRESULT7 + AdcMirror.ADCRESULT8)/7) - p->ImeasAOffset;

Tmp = _IQ15mpy(p->ImeasAGain,DatQ15); p->ImeasA = _IQ15div(Tmp,_IQ15(BASE_CURRENT)); //Convert to PU,324387 = _IQ15(BASE_CURRENT)

p->RealA =

_IQ15div(_IQ15mpy(_IQ15(1055.1296),DatQ15),_IQ15(BASE_CURRENT));

//p->NewA = (0.0048828125*(AdcMirror.ADCRESULT2 + AdcMirror.ADCRESULT3 + AdcMirror.ADCRESULT4 + AdcMirror.ADCRESULT5 + AdcMirror.ADCRESULT6 + AdcMirror.ADCRESULT7 + AdcMirror.ADCRESULT8)/7) - 10;

p->NewA =0.00644*DatQ15; DatQ15 = ((AdcMirror.ADCRESULT9 + AdcMirror.ADCRESULT10 +

AdcMirror.ADCRESULT11 + AdcMirror.ADCRESULT12 + AdcMirror.ADCRESULT13 + AdcMirror.ADCRESULT14 + AdcMirror.ADCRESULT15)/7) - p->ImeasBOffset;

Tmp = _IQ15mpy(p->ImeasBGain,DatQ15); p->ImeasB = _IQ15div(Tmp,_IQ15(BASE_CURRENT)); //Convert to PU p->RealB =

_IQ15div(_IQ15mpy(_IQ15(1055.1296),DatQ15),_IQ15(BASE_CURRENT));

//p->NewB = (0.0048828125*(AdcMirror.ADCRESULT9 +

AdcMirror.ADCRESULT10 + AdcMirror.ADCRESULT11 + AdcMirror.ADCRESULT12 +

AdcMirror.ADCRESULT13 + AdcMirror.ADCRESULT14 + AdcMirror.ADCRESULT15)/7) - 10;

p->NewB = _IQ15mpy(_IQ15(211.02592),DatQ15);

因篇幅问题不能全部显示,请点此查看更多更全内容