This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: CONTROLSUITE, TMS320F28069, DRV8305

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

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

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

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

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

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

实现对电机的平稳控制。

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

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

  • 请问有过上述应用的吗。

    我看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

  • 你现在既然用了速度传感器,那么为何还要用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
  • 感谢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中变量的实时变化?

  • 现在有以下几个问题:

    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 controller
    CTRL_runOnLine(handle,pAdcData,pPwmData);

    两个函数中实现的。

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

    ERIC:

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