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

在lab05b中增加绝对编码器信息

现在需要利用TI的无传感器FOC控制算法,实现伺服控制功能。

对电机的电流、转速和位置进行精确控制,特别是低速性能。

TI的FAST无传感器控制策略显然是无法实现的。这里希望在Instaspin算法的基础上,增加绝对位置编码器信息。

FOC控制的电角度由绝对位置编码器提供。

现在我在28069上通过SPI已经可以读到准确的绝对位置数据,

但我不知道如何将编码器数据,转换为FOC的电角度信息,融合到lab05b的例程中。

实现对电机的平稳控制。

你们是否有过类似应用,该如何实现,是否有一些参考帖子。谢谢

希望得到TI工程师的回复,谢谢~

ming chen3:

请问有过上述应用的吗。

我看lab12b是针对有传感器系统,但是对ENC部分代码不是很了解。

有类似的说明文档吗?

void ENC_setup(ENC_Handle encHandle, const int16_t sample_period, const uint16_t num_pole_pairs, const uint16_t num_enc_slots, const uint32_t enc_zero_offset, const float_t full_scale_freq, const float_t speed_update_freq, const float_t speed_cutoff){ ENC_Obj *enc; float_t temp; float_t speed_cutoff_radians; int16_t i; // create an object pointer for manipulation enc = (ENC_Obj *)encHandle; // setup the encoder sample rate enc->sample_count = 0; enc->sample_period = sample_period; // copy the parameters into the data structure enc->num_enc_slots = num_enc_slots; enc->num_pole_pairs = num_pole_pairs; enc->enc_zero_offset = enc_zero_offset; enc->full_scale_freq = full_scale_freq; enc->delta_enc = 0; enc->prev_enc = 0; // initialize the electrical angle enc->enc_elec_angle = 0; // compute the gain which translates the mech into the elec angle enc->mech_angle_gain = (_iq)((((uint32_t)1)<<24)/(4*num_enc_slots));

// compute the speed gain temp = ((float_t)num_pole_pairs*speed_update_freq*ENC_SPEED_SCALING_FACTOR) / (4.0*(float_t)num_enc_slots*full_scale_freq*(float_t)sample_period); enc->speed_gain = (int32_t) temp; // compute the rpm gain temp = (float_t)((full_scale_freq*60.0)/num_pole_pairs); enc->rpm_gain = (int32_t) temp; // compute the speed coefficients and initialize the low-pass filtered output enc->speed_cutoff = speed_cutoff; speed_cutoff_radians = ENC_2PI*speed_cutoff; temp = speed_cutoff_radians/(speed_update_freq+speed_cutoff_radians); enc->speed_lpf_cx = (int32_t) (ENC_SPEED_COEFF_SCALING*temp); enc->speed_lpf_cy = ENC_SPEED_COEFF_SCALING – enc->speed_lpf_cx; enc->speed_lpf_out = 0; // setup the encoder log enc->log_state = ENC_LOG_STATE_IDLE; enc->run_flag = 0; enc->trigger_idx = 0; enc->trigger_delta = 0; enc->log_idx = 0; enc->post_trigger_len = ENC_LOG_LEN>>1; enc->post_trigger_cnt = enc->post_trigger_len; for (i=0; i<ENC_LOG_LEN; i++) { enc->log[i] = 0; } return;} // end of ENC setup function

void ENC_calcElecAngle(ENC_Handle encHandle, uint32_t posnCounts){ ENC_Obj *enc; uint32_t temp; // create an object pointer for manipulation enc = (ENC_Obj *) encHandle; // compute the mechanical angle temp = posnCounts*enc->mech_angle_gain; // add in calibrated offset temp += enc->enc_zero_offset; // convert to electrical angle temp = temp * enc->num_pole_pairs; // wrap around 1.0 (Q24) temp &= ((uint32_t) 0x00ffffff); // store encoder electrical angle enc->enc_elec_angle = (_iq)temp; // update the slip angle enc->enc_slip_angle = enc->enc_slip_angle + enc->incremental_slip; // wrap around 1.0 (Q24) enc->enc_slip_angle &= ((uint32_t) 0x00ffffff); // add in compensation for slip temp = temp + enc->enc_slip_angle; // wrap around 1.0 (Q24) temp &= ((uint32_t) 0x00ffffff); // store encoder magnetic angle enc->enc_magnetic_angle = (_iq)temp; return;} // end of ENC_calc_elec_angle() function

现在需要利用TI的无传感器FOC控制算法,实现伺服控制功能。

对电机的电流、转速和位置进行精确控制,特别是低速性能。

TI的FAST无传感器控制策略显然是无法实现的。这里希望在Instaspin算法的基础上,增加绝对位置编码器信息。

FOC控制的电角度由绝对位置编码器提供。

现在我在28069上通过SPI已经可以读到准确的绝对位置数据,

但我不知道如何将编码器数据,转换为FOC的电角度信息,融合到lab05b的例程中。

实现对电机的平稳控制。

你们是否有过类似应用,该如何实现,是否有一些参考帖子。谢谢

希望得到TI工程师的回复,谢谢~

Eric Ma:

回复 ming chen3:

你现在既然用了速度传感器,那么为何还要用InstaSPIN 呢,直接用普通芯片岂不更划算?然后用

C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensored

这里面的例程。

我看lab12b是针对有传感器系统,但是对ENC部分代码不是很了解。

ENC的代码是针对增量式编码器的,即使用QEP模块,关于QEP你可以看看文档说明:

http://www.ti.com/product/TMS320F28069/technicaldocuments

TMS320x2806x Piccolo Technical Reference Manual (Rev. G) 

如果你要在InstaSPN上添加传感器,那么需要将你SPI计算出来的那个角度换算成电角度,然后替换InstaSPIN那个角度就可以。
注意是换算成电角度,而且标幺化。
ERIC

现在需要利用TI的无传感器FOC控制算法,实现伺服控制功能。

对电机的电流、转速和位置进行精确控制,特别是低速性能。

TI的FAST无传感器控制策略显然是无法实现的。这里希望在Instaspin算法的基础上,增加绝对位置编码器信息。

FOC控制的电角度由绝对位置编码器提供。

现在我在28069上通过SPI已经可以读到准确的绝对位置数据,

但我不知道如何将编码器数据,转换为FOC的电角度信息,融合到lab05b的例程中。

实现对电机的平稳控制。

你们是否有过类似应用,该如何实现,是否有一些参考帖子。谢谢

希望得到TI工程师的回复,谢谢~

ming chen3:

回复 Eric Ma:

感谢Eric的回答。

是这样的,我之前参照launchpad-28069和DRV8305做了一块板子。运行正常。

现在想在Instaspin中增加编码器信息,实现电流和速度的精确控制。可以在现有平台实现。

现在我在lab05a和lab05b中,可以读到绝对编码器数据,但我不知道如何实现相位对齐和将编码器数据转换为电角度数据。

现在有以下几个问题:

1.在实现电机电角度和编码器的相位对齐时,我看手册中说可以通过使用Rsonline功能。

这个Rsonline就是向电机绕组中注入直流电流,电机可以在某一位置对齐。我将此位置的编码器角度置零。

这个Rsonline功能在做相位对齐时,是否与电机三相绕组UVW的连接相序有关系?

这个Rsonline功能在做相位对齐时,具体的原理是怎样的,是按照电机驱动板上电机线ABC接口,A进BC出的方式注入电流的吗?是否需要与电机绕组链接相序对应起来?

2.我已经将编码器数据转换为IQ(24)格式,根据电机的极对数8pole pairs,得到8个从iq(0)到Iq(1)线性变换的电角度数据。

我将SPI读取计算完的电角度信息,在lab05a将ctrl.h中的下述语句屏蔽掉,改成我计算的电角度。

// generate the motor electrical angle //angle_pu = EST_getAngle_pu(obj->estHandle);

电机转一会就会自己停下来,我怀疑是否是电机电角度计算错误,或是相位未对齐,还是有其他原因?

3.在lab05a中声明变量_iq angle_pu= _IQ(0.0);将计算的电角度信息赋给angle_pu.

在ctrl.h中通过extern _iq angle_pu;将电角度信息传递到头文件ctrl.h中,这样传递变量使用是否会有什么问题?

因为FOC的程序主体都是在ctrl.h的

// run the online controller

CTRL_runOnLine_User(handle,pAdcData,pPwmData);

// run the online controller CTRL_runOnLine(handle,pAdcData,pPwmData);

两个函数中实现的。

如何在watch Windows中检测到ctrl.h中变量的实时变化?

现在需要利用TI的无传感器FOC控制算法,实现伺服控制功能。

对电机的电流、转速和位置进行精确控制,特别是低速性能。

TI的FAST无传感器控制策略显然是无法实现的。这里希望在Instaspin算法的基础上,增加绝对位置编码器信息。

FOC控制的电角度由绝对位置编码器提供。

现在我在28069上通过SPI已经可以读到准确的绝对位置数据,

但我不知道如何将编码器数据,转换为FOC的电角度信息,融合到lab05b的例程中。

实现对电机的平稳控制。

你们是否有过类似应用,该如何实现,是否有一些参考帖子。谢谢

希望得到TI工程师的回复,谢谢~

Eric Ma:

回复 ming chen3:

现在有以下几个问题:

1.在实现电机电角度和编码器的相位对齐时,我看手册中说可以通过使用Rsonline功能。

这个Rsonline就是向电机绕组中注入直流电流,电机可以在某一位置对齐。我将此位置的编码器角度置零。

这个Rsonline功能在做相位对齐时,是否与电机三相绕组UVW的连接相序有关系?

这个Rsonline功能在做相位对齐时,具体的原理是怎样的,是按照电机驱动板上电机线ABC接口,A进BC出的方式注入电流的吗?是否需要与电机绕组链接相序对应起来?

ERIC:

C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensorless_2833x

关于对齐,你可以看看上面这个算法, lsw =0 的时候,往Id 注入一个角度0的矢量,把电机的转子定位在这个0位置,这样就实现对齐了。RS online calibration 也是相同的原理。

2.我已经将编码器数据转换为IQ(24)格式,根据电机的极对数8pole pairs,得到8个从iq(0)到Iq(1)线性变换的电角度数据。

我将SPI读取计算完的电角度信息,在lab05a将ctrl.h中的下述语句屏蔽掉,改成我计算的电角度。

// generate the motor electrical angle//angle_pu = EST_getAngle_pu(obj->estHandle);

电机转一会就会自己停下来,我怀疑是否是电机电角度计算错误,或是相位未对齐,还是有其他原因?

ERIC:

应该是你换算出问题了。你要先用无传感模式跑,然后读取FAST的角度和你换算出来的角度,两者一致的时候,你的电角度就对了。这个时候才把这个角度替换FAST吧。

3.在lab05a中声明变量_iq angle_pu= _IQ(0.0);将计算的电角度信息赋给angle_pu.

在ctrl.h中通过extern _iq angle_pu;将电角度信息传递到头文件ctrl.h中,这样传递变量使用是否会有什么问题?

因为FOC的程序主体都是在ctrl.h的

// run the online controller

CTRL_runOnLine_User(handle,pAdcData,pPwmData);

// run the online controllerCTRL_runOnLine(handle,pAdcData,pPwmData);

两个函数中实现的。

如何在watch Windows中检测到ctrl.h中变量的实时变化?

ERIC:

是可以在源文件中定义,然后在.h文件声明,然后再观察窗看。

现在需要利用TI的无传感器FOC控制算法,实现伺服控制功能。

对电机的电流、转速和位置进行精确控制,特别是低速性能。

TI的FAST无传感器控制策略显然是无法实现的。这里希望在Instaspin算法的基础上,增加绝对位置编码器信息。

FOC控制的电角度由绝对位置编码器提供。

现在我在28069上通过SPI已经可以读到准确的绝对位置数据,

但我不知道如何将编码器数据,转换为FOC的电角度信息,融合到lab05b的例程中。

实现对电机的平稳控制。

你们是否有过类似应用,该如何实现,是否有一些参考帖子。谢谢

希望得到TI工程师的回复,谢谢~

li josh:

回复 Eric Ma:

关注下

赞(0)
未经允许不得转载:TI中文支持网 » 在lab05b中增加绝对编码器信息
分享到: 更多 (0)