情况描述:
(1)之前采用28335控制PMSM,我用的霍尔电流传感器量程是【-50A,50A】,传感器对应输出【-4V,4V】电压,我外部作了一个电平转换电路,将【-4V,4V】转换成【0V,3V】用以28335端口进行AD采样。程序中的这块#define BASE_CURRENT 10我也没有改,采样语句也没在例程的基础上进行更改:
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; 速度电流双闭环PI控制,发现实际速度跟踪指令速度效果良好。
(2)昨天偶尔逛论坛,看到有位大神说, BASE_CURRENT的定义数值应该是电流传感器所能测出的最大电流,也即对于传感器: #define BASE_CURRENT 50 ,这样的话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;这条语句也需要改了,因为现在的基准值是50A了。我是这样想的,不管怎么定义,我首先需要明确我的电流的真实值是多少,那就推理一遍呗:从两头考虑:【-50A,50A】变换成【0,4096】(线性对应),那么若采样数字量为x,则实际电流应该为(x*0.00024414-0.5)*100,当然offset差不多就是0.5,校准的事情先不考虑,,就是(x*0.00024414-offset)*100,这是真实值,基准值是50,考虑到3到3.3的一个系数0.909,那么标幺值应该是(x*0.00024414-offset)*2*0.909
(3)说到这里我也就明白了,TI官方例程为使用者考虑的十分便利,也就是说只要你把 BASE_CURRENT 定义成你所使用的电流传感器的最大量程值,主程序中的这句话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不需要改动的。这个我理解了。那么问题又来了,(1)中所叙述的#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909肯定是不对应的,这时候为什么对于速度控制,跟踪效果还那么好呢?
(4)讲的这里我又进行了思考,主程序中好像没有一条语句出现过BASE_CURRENT (无感器程序中有,是有关滑膜速度辨识模块的,但我这里带传感器不用辨识,这些语句被我删了,这里说的是有传感器速度电流双闭环PI控制) 。也就是说,BASE_CURRENT 是不是对于控制算法根本就没用,它存在的意义就是便于我们怎么根据采样值,让我们知道实际值是多少。实际上BASE_CURRENT 你想定义多大就多大,程序语句clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;不用变
(5)如果(4)说的是对的,我们再看回(1),刚才说过了(1)中#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不对应的,那么我这样改:define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909*5,即还把10当做基准值,(这时候可能会出现clarke1.As计算得到的标幺值>1,但假如是所用电机功率很小不会超过10A,或者空载运行。)这样的编程语句是正确的吗?假如是正确的,那么基准值是10,采样结果乘以5和不乘以5速度跟踪都能实现,岂不是有点不对劲?
最近被这个标幺的事情搞得有点迷了,越想越糊涂。以上的五条,恳请大神予以指教,指点迷津。谢谢。
user5229665:
回复 Igor An:
你好,你所说的我明白了,尤其是你所提到的带宽以及完全归一化的概念,使我受益匪浅。感谢回答!
刚我又想了一会了,有个疑问:0.909是不是可以不乘了?以下是个人鄙见:
(1)首先说说为什么例程中要加0.909。下面进行一般意义上的讨论:对于一个电流传感器,其量程是【-I0,I0】,输出电压为【-u0,u0】,首先需要硬件电路进行电平转换,将【-u0,u0】变换到AD采样电压范围之内。例程是根据官方套件写的,套件中的硬件实际上把偏置电压设为1.65V的,这样实质上是认为AD采样口的电压范围为【0,3.3】的,然后把【0,3.3】采样成【0,4096】的数字量。
以上说的是机理,下面根据采得的AdcResult反推实际电流。AdcResult是数字量,对应电压为AdcResult*0.00024414*3.3(28035),AdcResult*0.00024414*3(28335),再反推,忽略u0,直接看两头,【-I0,I0】线性映射到【0,3,3】,这其中肯定有个关系式,如果把实际电流当成x,,映射区域当成y,则y=1.65+(1.65/ I0)*x,将y=AdcResult*0.00024414*3.3(或3.0)带入,反解出实际电流:(AdcResult*0.00024414-0.5)*2*I0(28035),(AdcResult*0.00024414-0.55)*2*0.909*I0(28335).若把I0就定义成Base_Curr,则:两种情况下的标幺值为:(AdcResult*0.00024414-offset)*2(28035),(AdcResult*0.00024414-offset)*2*0.909(28335),且两种情况下的offset是不一样的。这个是与例程中一致的,当然前提正如您所说,隐含条件是BASE_CURR = I0
(2)下面从繁琐的数学推理中抽象出来,重新审视(1)。也就是说,例程中的
#ifdef DSP2833x_DEVICE_H clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr. clarke1.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909; // Phase B curr. #endif // ((ADCmeas(q12)/2^12)-offset)*2*(3.0/3.3) 这些语句是针对官方套件写的,而官方套件中的硬件电路设计是服务于28035的,偏执电压为1.65,即转化成【0 3.3】。这是硬件前提。在这个前提之上,TI同时为了方便用户,如果用户使用的是28035,就不用乘0.909,用的是28335,就要乘0.909.对于使用28335,这个乘0.909可以抽象理解为:硬件是认为AD电压采样范围是【0 3.3】,而实际芯片的采样范围是【0 3】,所以需要一个换算系数
(3)下面只讨论28335的电流采样。在(2)的基础上,假如我在硬件电路中就把偏置电压设成1.5V,也就是专门为28335设计一个电平转换电路:将对于一个电流传感器,其量程是【-I0,I0】,输出电压为【-u0,u0】,电平转换到【0, 3】,再数字化为【0 4096】。按照(1)的方法再反推一遍:采样值AdcResult,对应的端口电压:AdcResult*0.00024414*3,再反推,忽略u0,直接看两头,【-I0,I0】线性映射到【0,3】(这是与1中不同之处),这其中肯定有个关系式,如果把实际电流当成x,,映射区域当成y,则y=1.5+(1.5/ I0)*x,将y=AdcResult*0.00024414*3带入,反解出实际电流:(AdcResult*0.00024414-0.5)*2*I0, 把I0就定义成Base_Curr,则:标幺值为:(AdcResult*0.00024414-offset)*2,
这时是不是就不用乘0.909了?也就是说,如果外部硬件电路设计得当,并非28335的电流采样就要乘0.909。
敬请指教!万分感谢!
情况描述:
(1)之前采用28335控制PMSM,我用的霍尔电流传感器量程是【-50A,50A】,传感器对应输出【-4V,4V】电压,我外部作了一个电平转换电路,将【-4V,4V】转换成【0V,3V】用以28335端口进行AD采样。程序中的这块#define BASE_CURRENT 10我也没有改,采样语句也没在例程的基础上进行更改:
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; 速度电流双闭环PI控制,发现实际速度跟踪指令速度效果良好。
(2)昨天偶尔逛论坛,看到有位大神说, BASE_CURRENT的定义数值应该是电流传感器所能测出的最大电流,也即对于传感器: #define BASE_CURRENT 50 ,这样的话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;这条语句也需要改了,因为现在的基准值是50A了。我是这样想的,不管怎么定义,我首先需要明确我的电流的真实值是多少,那就推理一遍呗:从两头考虑:【-50A,50A】变换成【0,4096】(线性对应),那么若采样数字量为x,则实际电流应该为(x*0.00024414-0.5)*100,当然offset差不多就是0.5,校准的事情先不考虑,,就是(x*0.00024414-offset)*100,这是真实值,基准值是50,考虑到3到3.3的一个系数0.909,那么标幺值应该是(x*0.00024414-offset)*2*0.909
(3)说到这里我也就明白了,TI官方例程为使用者考虑的十分便利,也就是说只要你把 BASE_CURRENT 定义成你所使用的电流传感器的最大量程值,主程序中的这句话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不需要改动的。这个我理解了。那么问题又来了,(1)中所叙述的#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909肯定是不对应的,这时候为什么对于速度控制,跟踪效果还那么好呢?
(4)讲的这里我又进行了思考,主程序中好像没有一条语句出现过BASE_CURRENT (无感器程序中有,是有关滑膜速度辨识模块的,但我这里带传感器不用辨识,这些语句被我删了,这里说的是有传感器速度电流双闭环PI控制) 。也就是说,BASE_CURRENT 是不是对于控制算法根本就没用,它存在的意义就是便于我们怎么根据采样值,让我们知道实际值是多少。实际上BASE_CURRENT 你想定义多大就多大,程序语句clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;不用变
(5)如果(4)说的是对的,我们再看回(1),刚才说过了(1)中#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不对应的,那么我这样改:define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909*5,即还把10当做基准值,(这时候可能会出现clarke1.As计算得到的标幺值>1,但假如是所用电机功率很小不会超过10A,或者空载运行。)这样的编程语句是正确的吗?假如是正确的,那么基准值是10,采样结果乘以5和不乘以5速度跟踪都能实现,岂不是有点不对劲?
最近被这个标幺的事情搞得有点迷了,越想越糊涂。以上的五条,恳请大神予以指教,指点迷津。谢谢。
Igor An:
回复 user5229665:
芯片的AD转换的机制就是3.3V对应4096,无论外围电路如何设计。
所以,在你提到的情况中,还是需要乘0.909的。
情况描述:
(1)之前采用28335控制PMSM,我用的霍尔电流传感器量程是【-50A,50A】,传感器对应输出【-4V,4V】电压,我外部作了一个电平转换电路,将【-4V,4V】转换成【0V,3V】用以28335端口进行AD采样。程序中的这块#define BASE_CURRENT 10我也没有改,采样语句也没在例程的基础上进行更改:
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; 速度电流双闭环PI控制,发现实际速度跟踪指令速度效果良好。
(2)昨天偶尔逛论坛,看到有位大神说, BASE_CURRENT的定义数值应该是电流传感器所能测出的最大电流,也即对于传感器: #define BASE_CURRENT 50 ,这样的话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;这条语句也需要改了,因为现在的基准值是50A了。我是这样想的,不管怎么定义,我首先需要明确我的电流的真实值是多少,那就推理一遍呗:从两头考虑:【-50A,50A】变换成【0,4096】(线性对应),那么若采样数字量为x,则实际电流应该为(x*0.00024414-0.5)*100,当然offset差不多就是0.5,校准的事情先不考虑,,就是(x*0.00024414-offset)*100,这是真实值,基准值是50,考虑到3到3.3的一个系数0.909,那么标幺值应该是(x*0.00024414-offset)*2*0.909
(3)说到这里我也就明白了,TI官方例程为使用者考虑的十分便利,也就是说只要你把 BASE_CURRENT 定义成你所使用的电流传感器的最大量程值,主程序中的这句话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不需要改动的。这个我理解了。那么问题又来了,(1)中所叙述的#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909肯定是不对应的,这时候为什么对于速度控制,跟踪效果还那么好呢?
(4)讲的这里我又进行了思考,主程序中好像没有一条语句出现过BASE_CURRENT (无感器程序中有,是有关滑膜速度辨识模块的,但我这里带传感器不用辨识,这些语句被我删了,这里说的是有传感器速度电流双闭环PI控制) 。也就是说,BASE_CURRENT 是不是对于控制算法根本就没用,它存在的意义就是便于我们怎么根据采样值,让我们知道实际值是多少。实际上BASE_CURRENT 你想定义多大就多大,程序语句clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;不用变
(5)如果(4)说的是对的,我们再看回(1),刚才说过了(1)中#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不对应的,那么我这样改:define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909*5,即还把10当做基准值,(这时候可能会出现clarke1.As计算得到的标幺值>1,但假如是所用电机功率很小不会超过10A,或者空载运行。)这样的编程语句是正确的吗?假如是正确的,那么基准值是10,采样结果乘以5和不乘以5速度跟踪都能实现,岂不是有点不对劲?
最近被这个标幺的事情搞得有点迷了,越想越糊涂。以上的五条,恳请大神予以指教,指点迷津。谢谢。
user5229665:
回复 Igor An:
28335的AD采样量程是0-3V,难道不是3V对应4096吗?
情况描述:
(1)之前采用28335控制PMSM,我用的霍尔电流传感器量程是【-50A,50A】,传感器对应输出【-4V,4V】电压,我外部作了一个电平转换电路,将【-4V,4V】转换成【0V,3V】用以28335端口进行AD采样。程序中的这块#define BASE_CURRENT 10我也没有改,采样语句也没在例程的基础上进行更改:
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; 速度电流双闭环PI控制,发现实际速度跟踪指令速度效果良好。
(2)昨天偶尔逛论坛,看到有位大神说, BASE_CURRENT的定义数值应该是电流传感器所能测出的最大电流,也即对于传感器: #define BASE_CURRENT 50 ,这样的话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;这条语句也需要改了,因为现在的基准值是50A了。我是这样想的,不管怎么定义,我首先需要明确我的电流的真实值是多少,那就推理一遍呗:从两头考虑:【-50A,50A】变换成【0,4096】(线性对应),那么若采样数字量为x,则实际电流应该为(x*0.00024414-0.5)*100,当然offset差不多就是0.5,校准的事情先不考虑,,就是(x*0.00024414-offset)*100,这是真实值,基准值是50,考虑到3到3.3的一个系数0.909,那么标幺值应该是(x*0.00024414-offset)*2*0.909
(3)说到这里我也就明白了,TI官方例程为使用者考虑的十分便利,也就是说只要你把 BASE_CURRENT 定义成你所使用的电流传感器的最大量程值,主程序中的这句话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不需要改动的。这个我理解了。那么问题又来了,(1)中所叙述的#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909肯定是不对应的,这时候为什么对于速度控制,跟踪效果还那么好呢?
(4)讲的这里我又进行了思考,主程序中好像没有一条语句出现过BASE_CURRENT (无感器程序中有,是有关滑膜速度辨识模块的,但我这里带传感器不用辨识,这些语句被我删了,这里说的是有传感器速度电流双闭环PI控制) 。也就是说,BASE_CURRENT 是不是对于控制算法根本就没用,它存在的意义就是便于我们怎么根据采样值,让我们知道实际值是多少。实际上BASE_CURRENT 你想定义多大就多大,程序语句clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;不用变
(5)如果(4)说的是对的,我们再看回(1),刚才说过了(1)中#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不对应的,那么我这样改:define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909*5,即还把10当做基准值,(这时候可能会出现clarke1.As计算得到的标幺值>1,但假如是所用电机功率很小不会超过10A,或者空载运行。)这样的编程语句是正确的吗?假如是正确的,那么基准值是10,采样结果乘以5和不乘以5速度跟踪都能实现,岂不是有点不对劲?
最近被这个标幺的事情搞得有点迷了,越想越糊涂。以上的五条,恳请大神予以指教,指点迷津。谢谢。
user5283999:
回复 user5229665:
您好,前辈!看了您的提问很精彩!我现在有个问题,麻烦您能解答。首先我认为采样结果出来是(0,4096),然后又乘以0.00024414,也就是乘以1/4096,相当于还原为(0,1),然后减去offetA/offetB(它的值应该是0.5),得出结果为(-0.5,0.5),然后乘以2,得出(-1,1),相当于电流标幺化成为(-1,1),但是clark1.As定义的是Q24的定点型数据,然而推算出来的是浮点型的,这样能直接赋值吗??描述可能有误,菜鸟一只,期待您的回复,不胜感激!
情况描述:
(1)之前采用28335控制PMSM,我用的霍尔电流传感器量程是【-50A,50A】,传感器对应输出【-4V,4V】电压,我外部作了一个电平转换电路,将【-4V,4V】转换成【0V,3V】用以28335端口进行AD采样。程序中的这块#define BASE_CURRENT 10我也没有改,采样语句也没在例程的基础上进行更改:
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; 速度电流双闭环PI控制,发现实际速度跟踪指令速度效果良好。
(2)昨天偶尔逛论坛,看到有位大神说, BASE_CURRENT的定义数值应该是电流传感器所能测出的最大电流,也即对于传感器: #define BASE_CURRENT 50 ,这样的话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;这条语句也需要改了,因为现在的基准值是50A了。我是这样想的,不管怎么定义,我首先需要明确我的电流的真实值是多少,那就推理一遍呗:从两头考虑:【-50A,50A】变换成【0,4096】(线性对应),那么若采样数字量为x,则实际电流应该为(x*0.00024414-0.5)*100,当然offset差不多就是0.5,校准的事情先不考虑,,就是(x*0.00024414-offset)*100,这是真实值,基准值是50,考虑到3到3.3的一个系数0.909,那么标幺值应该是(x*0.00024414-offset)*2*0.909
(3)说到这里我也就明白了,TI官方例程为使用者考虑的十分便利,也就是说只要你把 BASE_CURRENT 定义成你所使用的电流传感器的最大量程值,主程序中的这句话clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不需要改动的。这个我理解了。那么问题又来了,(1)中所叙述的#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909肯定是不对应的,这时候为什么对于速度控制,跟踪效果还那么好呢?
(4)讲的这里我又进行了思考,主程序中好像没有一条语句出现过BASE_CURRENT (无感器程序中有,是有关滑膜速度辨识模块的,但我这里带传感器不用辨识,这些语句被我删了,这里说的是有传感器速度电流双闭环PI控制) 。也就是说,BASE_CURRENT 是不是对于控制算法根本就没用,它存在的意义就是便于我们怎么根据采样值,让我们知道实际值是多少。实际上BASE_CURRENT 你想定义多大就多大,程序语句clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;不用变
(5)如果(4)说的是对的,我们再看回(1),刚才说过了(1)中#define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909是不对应的,那么我这样改:define BASE_CURRENT 10和clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909*5,即还把10当做基准值,(这时候可能会出现clarke1.As计算得到的标幺值>1,但假如是所用电机功率很小不会超过10A,或者空载运行。)这样的编程语句是正确的吗?假如是正确的,那么基准值是10,采样结果乘以5和不乘以5速度跟踪都能实现,岂不是有点不对劲?
最近被这个标幺的事情搞得有点迷了,越想越糊涂。以上的五条,恳请大神予以指教,指点迷津。谢谢。
user5805327:各位前辈分析的很好,我马克下本帖,以便不时之需,回来查看。