匠芯创M6800方案独创HCL硬件电流环,实现精准高效电机控制

描述

 

一直以来,传统的伺服产品选择将硬件电流环放在FPGA里,这样的硬件方案需要消耗MCU更多引脚资源用于和FPGA进行数据传输,双芯片占用板子面积,导致PCB布局布线困难;再者,使用FPGA后也会增加产品成本,不利于市场竞争,始终为行业和客户所困扰。

匠芯创科技M6800系列产品独创Hardware Current Loop(HCL)硬件电流环。创新性地采用独立于CPU的运行模式,使其有效提升电流环带宽,释放更多的算力资源。可实现单颗M6800方案取代MCU+FPGA的架构,是实现伺服电机控制的电流环算法硬件化的关键一环。

 

 

01

HCL介绍

 

 

功能模块:

Clarke变换

Park变换

防积分饱和PID

Ipark变换

死区补偿

SVPWM计算和处理

 

特点:

HCL将软件电流环算法固化在芯片里,且独立于CPU运行,有效提升系统整体执行效率;

通过内部测试,整个硬件电流环执行周期仅为200ns,完全做到PWM占空比立即更新,从而大大提高了电流环的带宽,充分提升系统的快速响应和鲁棒性;

支持增量式编码器和绝对式编码器,单圈分辨率高达16777216ppr。

 

02

HCL操作步骤

 

第一步 初始化HCL

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

void HCL_Init(void) { U16 INV_PWM_TBPRD = 10000;hcl_cmu_init(); hcl_set_opm(0, HCL_OPM2);//Mode2,电角度选择编码器反馈的电角度 hcl_set_posm(0, TA_POS);//选择绝对式编码器
hcl_set_udm0(0, 0); //Mode0 D轴电压 hcl_set_uqm0(0, 1475); //Mode0 Q轴电压 0.045 hcl_set_epwmprd(0, INV_PWM_TBPRD);//电流环周期100us hcl_set_maxduty(0, (INV_PWM_TBPRD - 5));//设置最大占比 hcl_set_minduty(0, 5);//设置最小占空比//PWM时间常数,3.2768 = _IQ(1)/ INV_PWM_TBPRD hcl_set_timeconst(0, _IQ(1.0)); hcl_set_curcal(0, _IQ10(1.0)); //电流增益校正 //set qaxi-pid _iq kp = _IQ(0.1983); _iq ki = _IQ(0.0244);
hcl_set_qpidkp(0, kp);//设置q轴pid比例系数初值 hcl_set_qpidki(0, ki); //设置q轴pid积分系数初值 hcl_set_qpidmax(0, _IQ( 0.9)); //设置q轴pid输出最大值 hcl_set_qpidmin(0, _IQ(-0.9)); //设置q轴pid输出最小值 hcl_set_intgsep(0, _IQ( 0.9));//0.9 hcl_set_iqref(0, _IQ(0.0)); //设置q轴pid给定初值
//set daxi-pid hcl_set_dpidkp(0, kp); //设置d轴pid比例系数初值 hcl_set_dpidki(0, ki); //设置d轴pid积分系数初值 hcl_set_dpidmax(0, _IQ( 0.125)); //设置d轴pid输出最大值 hcl_set_dpidmin(0, _IQ(-0.125)); //设置d轴pid输出最小值 hcl_set_idref(0, _IQ(0)); //设置d轴pid给定初值 hcl_dtcmp_en(0);//死区补偿打开 hcl_set_dtcomp(0, 0);//死区补偿值为0 hcl_set_dtflt(0, 262); //死区补偿滤波时间 hcl_en(0);//打开硬件电流环}

 

第二步 初始化ADC

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

void ADC_Init(void){//初始化ADC0 adc_q1_trig_sample_num(0, SMP_1_NODE); //设置ADC0队列1有一个采样点 adc_q1_node0_set(0, ADCCH4); //设置转换通道 adc_hcl_en(0); //使能HCL自动获取ADC0转换值 adc_pre_set(0, 0x1); //ADC0预充设置为1 adc_smp_rate_set(0, SMP_RATE_1MHZ); //设置ADC0采样频率 adc_q1_cvra_en(0); //使能EPWM事件A作为ADC0转换触发信号 adc_q1_int_en(0); //使能ADC0队列1转换结束中断 adc_en(0); //使能ADC0
//初始化ADC1 adc_q1_trig_sample_num(1, SMP_1_NODE); //设置ADC1队列1有一个采样点 adc_q1_node0_set(1, ADCCH5); //设置转换通道 adc_hcl_en(1); //使能HCL自动获取ADC1转换值 adc_pre_set(1, 0x1); //ADC1预充设置为1 adc_smp_rate_set(1, SMP_RATE_1MHZ); //设置ADC1采样频率 adc_q1_cvra_en(1); //使能EPWM事件A作为ADC1转换触发信号 adc_en(1); //使能ADC1}

 

第三步 在EPWM中断服务程序里面给硬件电流环赋值;本例中采样EPWM0,中断周期为100us,将速度环PID输出值赋给硬件环即可,剩下的电流环算法自动由硬件完成,无需CPU干预。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

//EPMW0周期中断服务程序void EPWM_IRQHandler_isr(void) { u32 epwm_sts; epwm_sts = Glb_Pwmcs_Regs.GLB_EPWM_INT_STS.all;//判断是否epwm0中断 if((epwm_sts & EPWM0_INT_PEND) == EPWM0_INT_PEND) {pi_spd0.Ref = speed_ref; //速度环PID给定值 pi_spd0.Fbk = speed_fack; //速度环PID反馈值 pi_cal(&pi_spd0); //速度环PID计算hcl_set_idref(0,0); //硬件电流环Id轴的给定给定为0 hcl_set_iqref(0,pi_spd0.Out); //硬件电流环Iq轴的给定为速度环的pid输出值(*EPWM[0]).PWM_EVNT_CLR.bit.PWM_INT_CLR = 0x1 //清除中断标志}}

 

Hardware Current Loop(HCL)硬件电流环从硬件配置方案和软件性能上,全方位提升算力,实现运动控制系统性优化升级,为提升终端产品竞争力提供坚实的技术支持与成本优势。

未来,我们将持续完善 M6800系统化解决方案,为更多行业客户提供可持续、长周期的技术和生态支持。

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分