TI中文支持网
TI专业的中文技术问题搜集分享网站

关于28035 sensorless ADC采样的问题

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

congcong zhang1:

回复 Igor An:

非常感谢您的回复,可是我还有一个疑问,

原来的程序里是 20000之后 才进入mainISR,那么之前offset计算的时候 AD采样到的结果是什么 是0吗?

这时没有进入主中断,电机是不是并没有稳定运行,那么利用这时候采集的采样结果来算offset 算出来的意义是什么? 

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

user4729463:

回复 congcong zhang1:

按我这样理解的:

电流有负值得,采样电流,最后都把电流转成电压采样,如何采样负的电流?电路会设置一个偏值电压,比如-10A对应-1V,电路设置一个1V的电压偏置电压.

我觉得offset是计算电路无电流的电压,也即偏置电压.最后在MainISR会减去这个偏置电压

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

congcong zhang1:

回复 user4729463:

感谢您的回复,

您的回复我能理解,可是在这个例程里面,是20000次之后,才进入mainISR  那么进入主中断之前采样的结果,并不是电流是0时候对应的数值的采样结果。而是完全就是0,因为没进入主中断,电流就没有按照那个周期来。     我认为这里offset得到的结果应该是0。    不知道我的表述是否清楚。

望您不吝赐教。

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

congcong zhang1:

回复 user4729463:

明白了,感谢您的回复。

那如果我们最近想要实时测量相电压,可以用这样的方法吗? 

目前我的想法是:

由于中性点没有接地,所以相电压ad采出来的都是正值,硬件中有没有设置偏置电压,能让ad采出来的电压通过运算变为有正有负的实际值,或者说能不能测到中心点的电压是多少,这样采样值减去这个值不就可以得到有正有负的实际值了吗。

或者您有更好的实时采样相电压的思路也请您不吝赐教

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

congcong zhang1:

回复 user4729463:

刚才修改了程序做了测试,确实与您所说的相同,实际的采样值并不是0,得到的offset确实是在0.5附近的一个值。

应该就是硬件设计的问题使这个采样的结果不是0。

再次感谢您的回复。

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

congcong zhang1:

回复 user4729463:

针对这个硬件问题,您能跟我们分享一下硬件上这个偏置电压是怎么实现的吗?

刚刚在硬件电路上找到了Vref,但是没太看懂原理,您看看能不能给我们讲解一下…

这里的Vref是不是就是提供的偏置电压? 如果我没找对,您方便分享的话,能不能讲解一下您的硬件电路,这里是怎么实现的…

28035的HVACI_sensorless例程中  关于相电流的偏置量的求法问题 程序截取如下:

interrupt void OffsetISR(void)
{
// Verifying the ISR
IsrTicker++;
// DC offset measurement for ADC

if (IsrTicker>=5000)
{ offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset
offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset
offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset }

if (IsrTicker > 20000)
{
EALLOW;
PieVectTable.ADCINT1=&MainISR; EDIS;
}
// Enable more interrupts from this timer
AdcRegs.ADCINTFLG.bit.ADCINT1=1;
// Acknowledge interrupt to recieve more interrupts from PIE group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

主中断中 对于A相电流标幺值是这么计算的 

clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.

1、

这里的offset是在采样5000-20000次采样得到的,程序在20000次之后才进入mainISR,那么这里计算出来的offsetA 有什么实际意义呢 20000次之前没进主中断函数,那采样的结果是不是0,计算的offset 为什么是0.5呢。

个人的理解这个公式的含义是   offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); 利用加权的方法 讲整个相电流周期内的所有采样结果求和再求平均,得到的是相电流的中值,从而在主中断函数中 采样结果减去这个中值,才会得到有正有负的相电流结果。

不知道我的这个理解对不对。

2、

我们目前想采样得到相电压,但是采样得到的值肯定都是正值,而实际的相电压,应该是相对于电机中性点的 有正有负的值。 如果想要得到有正负的相电压值,是不是也可以用这种先测量offset的方法, 可是想要做到实时的变化,那么offset就不应该只是在进入主中断之前完成初始化,这里如何做到offset实时变化 希望大神能指出一些思路。  

当然,如果我的上述理解有偏差,那么想要得到有正负的相电压值,还可以用什么样的方法?

期盼各位的回复,望各位不吝赐教。

user4729463:

回复 congcong zhang1:

相电压,TI的例子有计算

赞(0)
未经允许不得转载:TI中文支持网 » 关于28035 sensorless ADC采样的问题
分享到: 更多 (0)