赞
踩
假设磁链圆的最大矢量值为1,但因FOC控制中需要设定PWM死区时间,以及PWM载波频率对AD采样时间的影响,使PWM占空比值最大不能达到100%,需要留出时间给ADC采样电机电流,所以矢量的最大值不能达到1。
因FOC中使用Q15格式处理小数,所以设定矢量为1时(PWM最大占空比100%) MAX_MODULE = 32767;若PWM占空比最大为97%,则MAX_MODULE = 0.97 × 32767;
Circle_Limitation函数在FOC流程框架图中,在PID控制器之后,而PID控制器是单独对Vd,Vq进行PID控制的,所以为了使Vd,Vq合成的电压矢量小于等于单位圆的边,即Vd² + Vq² ≤ MAX_MODULE²。
其原理公式如下,若Vd,Vq合成的矢量大于圆的最大矢量,则将其乘以一个缩放倍数i²,使其等于圆的最大矢量,i就是需要缩放的系数。
令 (vd² + vq² ) × i² = MAX_MODULE² ;
i = SQRT ( MAX_MODULE² / (vd² + vq²) );
STM32在计算开根号上比较费时,所以ST电机库中引入查表去查开根号值。
因Vd与Vq都是int_16类型,其最大值为S16_MAX (32767)
所以需要限制的范围满足Vd² + Vq² > MAX_MODULE² 也就是 ( MAX_MODULE² + 1 )~ ( 2 × S16_MAX ² );
即需要制表的值i = SQRT ( MAX_MODULE² / ( MAX_MODULE² + 1) ~ MAX_MODULE² / ( 2 × S16_MAX ² ) );
而i = SQRT ( MAX_MODULE² / (0) ~ 1 ) 这段内容则不需要进行制表,所以需要定制一个制表的开头位置。
START_INDEX 是为了求出在全段范围内,不需要进行限制的个数。
设定 MAX_MODULE² / (0) ~ MAX_MODULE² / (2 × S16_MAX ²) 需要制定count个值,
则不需要限制范围个数 START_INDEX = (MAX_MODULE²) / (2 × S16_MAX ²) x count;
则制表需要数据个数 n = count - START_INDEX;
将制表的范围用MIN,MAX表示:
MIN = SQRT( MAX_MODULE² / ( MAX_MODULE² + 1 ) ) × Q15;
MAX = SQRT( MAX_MODULE² / ( 2 × S16_MAX ² ) ) × Q15;
则制表数组每个数值 i = MIN + (MAX - MIN)/n × x;
设定count = 128, 当PWM占空比最大为100%时, MAX_MODULE = 32767;
START_INDEX = 64;
n = 128 - 64 = 64;
则列出表为:
uint16_t Circle_limit_table[65] = { 32768, 32515 ,32268 ,32026 ,31790 ,31558 ,31332 ,31111 ,30894 ,30682 ,
30474 ,30270 ,30070 ,29874 ,29682 ,29494 ,29309 ,29127 ,28949 ,28774 ,
28602 ,28434 ,28268 ,28105 ,27945 ,27787 ,27632 ,27480 ,27330 ,27183 ,
27038 ,26895 ,26755 ,26617 ,26481 ,26346 ,26214 ,26084 ,25956 ,25830 ,
25705 ,25583 ,25462 ,25342 ,25225 ,25109 ,24994 ,24882 ,24770 ,24660 ,
24552 ,24445 ,24339 ,24235 ,24132 ,24031 ,23930 ,23831 ,23733 ,23637 ,
23541 ,23447 ,23354 ,23262 ,23170 }; //i = sqrt(64/m)*Q15 Q15 = 32768
uint16_t MaxModule = 32767; /**< Circle limitation maximum allowed module */
uint8_t Start_index = 64; /**< Circle limitation table indexing start */
qd_t Circle_Limitation(qd_t Vqd) { uint16_t table_element; uint32_t uw_temp; int32_t sw_temp; qd_t local_vqd = Vqd; sw_temp = ( int32_t )( Vqd.q ) * Vqd.q + //temp = vq2 + vd2; ( int32_t )( Vqd.d ) * Vqd.d; uw_temp = ( uint32_t ) sw_temp; /* uw_temp min value 0, max value 32767*32767 */ if ( uw_temp > ( MaxModule * MaxModule )) { uw_temp = (uw_temp - 64) / (MaxModule * MaxModule / 64) + 1; /* wtemp min value pHandle->Start_index, max value 127 */ uw_temp -= Start_index; /* uw_temp min value 0, max value 127 - pHandle->Start_index */ table_element = Circle_limit_table[uw_temp]; sw_temp = Vqd.q * (int32_t)table_element; local_vqd.q = (int16_t)(sw_temp / 32768); sw_temp = Vqd.d * (int32_t)( table_element ); local_vqd.d = (int16_t)(sw_temp / 32768); } return ( local_vqd ); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。