9. hpm_motor库测试demo

9.1. 依赖SDK1.10.0

9.2. 介绍

为了方便用户使用、了解电机库功能,针对电机库搭建测试demo。

1.0版本电机库仅包含轨迹规划算法。

hpm_motor 库说明2.0

9.3. 例程

9.3.1. 定义轨迹规划结构体变量

CMDGENE_PARA cmdpar;

9.3.2. 定义位置模式/速度模式

#define POS_MODE 1

9.3.3. 定义位移指令,速度指令数组

double poscmd[5000]={0};
double velcmd[5000]={0};

9.3.4. 定义10ms定时器

void timer_init(void)
{
    gptmr_channel_config_t config;

    gptmr_channel_get_default_config(BOARD_BLDC_TMR_MS, &config);
    config.cmp[0] = BOARD_BLDC_TMR_RELOAD;
    config.debug_mode = 0;
    config.reload = BOARD_BLDC_TMR_RELOAD+1;

    gptmr_enable_irq(BOARD_BLDC_TMR_MS, GPTMR_CH_CMP_IRQ_MASK(BOARD_BLDC_TMR_CH, BOARD_BLDC_TMR_CMP));
    gptmr_channel_config(BOARD_BLDC_TMR_MS, BOARD_BLDC_TMR_CH, &config, true);
    intc_m_enable_irq_with_priority(BOARD_BLDC_TMR_IRQ, 2);

}

9.3.5. 轨迹规划入口参数配置

    cmdpar.cmdgene_in_par.poscfgpar.q0 = 0;
    cmdpar.cmdgene_in_par.poscfgpar.q1 = MOVE_BASOLUTE_POS_R;
    cmdpar.cmdgene_in_par.poscfgpar.v0 = 0;
    cmdpar.cmdgene_in_par.poscfgpar.v1 = 0;
    cmdpar.cmdgene_in_par.poscfgpar.vmax = MOVE_SPEED;
    cmdpar.cmdgene_in_par.poscfgpar.amax = MOVE_ACC;
    cmdpar.cmdgene_in_par.poscfgpar.jmax = MOVE_JERK;
    cmdpar.cmdgene_in_par.poscfgpar.cyclecnt = CYCLE_CNT;
    cmdpar.cmdgene_in_par.poscfgpar.cycletype = MULTIPLE_MOVE_TYPE;
    cmdpar.cmdgene_in_par.poscfgpar.dwelltime = DWELLTIME_MS;
    cmdpar.cmdgene_in_par.poscfgpar.isr_time_s = ISR_TIME_S;

    cmdpar.cmdgene_in_par.velcfgpar.q0 = 0;
    cmdpar.cmdgene_in_par.velcfgpar.Tv = CONSTANT_SPEED_TIME_S;
    cmdpar.cmdgene_in_par.velcfgpar.v0 = 0;
    cmdpar.cmdgene_in_par.velcfgpar.v1 = 0;
    cmdpar.cmdgene_in_par.velcfgpar.vmax =MOVE_SPEED;
    cmdpar.cmdgene_in_par.velcfgpar.amax = MOVE_ACC;
    cmdpar.cmdgene_in_par.velcfgpar.jmax = MOVE_JERK;
    cmdpar.cmdgene_in_par.velcfgpar.isr_time_s = ISR_TIME_S;

9.3.6. 轨迹规划调用函数

void libcall(void)
{
#ifdef POS_MODE
//位置模式下,轨迹规划函数生成位置/速度指令
   pos_cmd_gene(&cmdpar);
#else
//速度模式下,轨迹规划函数生成速度指令
   vel_cmd_gene(&cmdpar);
#endif
}

9.3.7. 中断执行函数

void isr_gptmr(void)
{

    volatile uint32_t s = BOARD_BLDC_TMR_MS->SR;
    BOARD_BLDC_TMR_MS->SR = s;

    if (s & GPTMR_CH_CMP_STAT_MASK(BOARD_BLDC_TMR_CH, BOARD_BLDC_TMR_CMP))
    {
       libcall();
       if(ii==5000)
       {
             return;
       }
       poscmd[ii] = cmdpar.cmdgene_out_par.poscmd;
       velcmd[ii] = cmdpar.cmdgene_out_par.velcmd;
       ii++;

    }
}
SDK_DECLARE_EXT_ISR_M(BOARD_BLDC_TMR_IRQ, isr_gptmr)

9.3.8. DEMO例程

int main (void)
{

   board_init();
   lib_params_cfg();
   timer_init();

}

9.4. 工程路径

  • 工程路径:lib_demo/software

9.5. 工程配置

9.6. 工程构建

  • windows下工程构建 WIN构建

9.7. 硬件设置

  • 本方案使用的hpm_6200_FourMotor_MB_RevA板。

  • 用户可以使用其他evk板

9.8. 工程运行

  • 运行工程

  • 将位置指令、速度指令保存至本地txt

  • excel绘图处理

工程运行

9.9. 测试内容

9.9.1. 速度模式下,速度10r/s,加速度100r/s/s,加加速度1000r/s/s/s

9.9.1.1. 代码配置

  • 将libcmdtest.c文件中将宏定义POS_MODE注释掉;

  • 修改libcmdtest.h文件中的MOVE_SPEED为10、MOVE_ACC为100、MOVE_JERK为1000。

  • 观测velcmd数组的值,测试结果如下:

测试结果

9.9.2. 速度模式下,速度10r/s,加速度10r/s/s,加加速度100r/s/s/s

9.9.2.1. 代码配置

  • 将libcmdtest.c文件中将宏定义POS_MODE注释掉;

  • 修改libcmdtest.h文件中的MOVE_SPEED为10、MOVE_ACC为10、MOVE_JERK为100。

  • 观测velcmd数组的值,测试结果如下:

测试结果

9.9.3. 位置模式下,速度10r/s,加速度100r/s/s,加加速度1000r/s/s/s,绝对位置20,运动模式:连续

9.9.3.1. 代码配置

  • 将libcmdtest.c文件中将宏定义POS_MODE打开;

  • 修改libcmdtest.h文件中的MOVE_RABSOLUTE_POS_r为20,MOVE_SPEED为10、MOVE_ACC为100、MOVE_JERK为1000。

  • 修改libcmdtest.c文件lib_params_cfg函数中cmdpar.cmdgene_in_par.poscfgpar.cycle的值为CONTINOUS_RONUD_MOVE_TYPE;

  • 观测velcmd和poscmd数组的值,测试结果如下:

测试结果

9.9.4. 位置模式下,速度10r/s,加速度100r/s/s,加加速度1000r/s/s/s,绝对位置20,运动模式:单次。

9.9.4.1. 代码配置

  • 将libcmdtest.c文件中将宏定义POS_MODE打开;

  • 修改libcmdtest.h文件中的MOVE_ABSOLUTE_POS_r为20,MOVE_SPEED为10、MOVE_ACC为100、MOVE_JERK为1000。

  • 修改libcmdtest.c文件lib_params_cfg函数中cmdpar.cmdgene_in_par.poscfgpar.cycle的值为SIGNLE_MOVE_TYPE;

  • 观测velcmd和poscmd数组的值,测试结果如下:

测试结果

9.9.5. 位置模式下,速度10r/s,加速度100r/s/s,加加速度1000r/s/s/s,相对位置20,运动模式:多次,运动次数:2。

9.9.5.1. 代码配置

  • 将libcmdtest.c文件中将宏定义POS_MODE打开;

  • 修改libcmdtest.h文件中的MOVE_ABSOLUTE_POS_r为20,MOVE_SPEED为10、MOVE_ACC为100、MOVE_JERK为1000,CYCLE_CNT为2。

  • 修改libcmdtest.c文件lib_params_cfg函数中cmdpar.cmdgene_in_par.poscfgpar.cycle的值为MULTIPLE_MOVE_TYPE;

  • 观测velcmd和poscmd数组的值,测试结果如下:

测试结果