0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HPM知识库 | 力位混合控制库使用指南

先楫半导体HPMicro 2026-03-02 12:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

力位混合控制(Hybrid Force-Position Control)是一种结合力控制和位置控制的阻抗控制方法,广泛应用于机器人关节控制、柔顺装配、人机交互等场景。本库实现了基于PD+前馈的阻抗控制算法,集成于HPM MCL电机控制库中。

控制原理

1. 阻抗控制模型

力位混合控制的核心思想是让关节表现出期望的机械阻抗特性,即弹簧-阻尼系统特性。控制律如下:

fe5ab6be-15ec-11f1-96ea-92fbcf53809c.png

其中:

fe6f2612-15ec-11f1-96ea-92fbcf53809c.png

2. 物理意义

该控制律模拟了一个虚拟的弹簧-阻尼系统:

fe7f0d66-15ec-11f1-96ea-92fbcf53809c.pngfe8969f0-15ec-11f1-96ea-92fbcf53809c.png


3. 临界阻尼条件

为获得无超调的快速响应,通常采用临界阻尼设计:

fe9aba52-15ec-11f1-96ea-92fbcf53809c.png

其中 J 为关节等效转动惯量。对于未知惯量的系统,可简化为:

fea72f9e-15ec-11f1-96ea-92fbcf53809c.png


系统架构

力位混合控制作为位置/力外环,输出力矩指令给FOC电流内环:

feb4e3aa-15ec-11f1-96ea-92fbcf53809c.png

力矩到电流的转换公式:

febf22b6-15ec-11f1-96ea-92fbcf53809c.pngfeccc93e-15ec-11f1-96ea-92fbcf53809c.png


API说明

1. 数据结构

配置结构体

typedefstruct{ floatkp; /* 位置刚度 (N·m/rad) */ floatkd; /* 阻尼系数 (N·m·s/rad) */ floattau_ff; /* 前馈力矩 (N·m) */ floatq_des; /* 期望位置 (rad) */ floatdq_des; /* 期望速度 (rad/s) */ floattau_max; /* 最大输出力矩 (N·m) */ floattau_min; /* 最小输出力矩 (N·m) */ floatspeed_lpf_alpha; /* 速度低通滤波系数 (0-1) */ floatspeed_deadzone; /* 速度死区 (rad/s) */}mcl_hybrid_ctrl_cfg_t;

状态结构体

typedefstruct{ floatq_actual; /* 实际位置 (rad) - 输入 */ floatdq_actual; /* 实际速度 (rad/s) - 输入 */ floattau_output; /* 输出力矩 (N·m) - 输出 */ floatpos_error; /* 位置误差 (rad) - 输出 */ floatvel_error; /* 速度误差 (rad/s) - 输出 */ floatspeed_lpf; /* 滤波后速度 (rad/s) - 内部 */}mcl_hybrid_ctrl_state_t;


2. 核心函数

fedbad8c-15ec-11f1-96ea-92fbcf53809c.png


使用示例

1. 参数初始化

以下为bldc_foc示例中的初始化代码,适用于空载直驱电机

voidmotor0_hybrid_ctrl_init(void){ /* 初始化配置结构体 */ mcl_hybrid_ctrl_init(&motor0.hybrid_ctrl_cfg); /* 清零状态结构体 */ memset(&motor0.hybrid_ctrl_state,0,sizeof(motor0.hybrid_ctrl_state)); /* 设置PD参数 - 空载直驱电机参数较小 */ mcl_hybrid_ctrl_set_kp(&motor0.hybrid_ctrl_cfg,0.06f); mcl_hybrid_ctrl_set_kd(&motor0.hybrid_ctrl_cfg,0.001429f); /* 设置初始期望位置和速度 */ mcl_hybrid_ctrl_set_position(&motor0.hybrid_ctrl_cfg,0.0f); mcl_hybrid_ctrl_set_velocity(&motor0.hybrid_ctrl_cfg,0.0f); /* 设置力矩限幅,防止过流 */ mcl_hybrid_ctrl_set_limits(&motor0.hybrid_ctrl_cfg, -0.5f,0.5f); /* 设置速度滤波:alpha=0.003(强滤波),死区=0.1 rad/s */ mcl_hybrid_ctrl_set_speed_filter(&motor0.hybrid_ctrl_cfg,0.003f,0.1f);}


2. 控制循环

ADC中断(PWM周期触发,20kHz)中执行控制算法:

voidisr_adc(void){ uint32_tstatus; mcl_user_value_tuser_current; status =hpm_adc_get_status_flags(&hpm_adc_u); if((status & BOARD_BLDC_ADC_TRIG_FLAG) !=0) { hpm_adc_clear_status_flags(&hpm_adc_u, BOARD_BLDC_ADC_TRIG_FLAG); /* 编码器数据处理 */ hpm_mcl_encoder_process(&motor0.encoder, motor0.cfg.mcl.physical.time.mcu_clock_tick / PWM_FREQUENCY); if(hybrid_ctrl_mode) { /* 步骤1:获取编码器反馈 */ hpm_mcl_encoder_get_absolute_theta(&motor0.encoder, &motor0.hybrid_ctrl_state.q_actual); motor0.hybrid_ctrl_state.dq_actual = hpm_mcl_encoder_get_speed(&motor0.encoder); /* 步骤2:执行力位混合控制算法 */ mcl_hybrid_ctrl_step(&motor0.hybrid_ctrl_cfg, &motor0.hybrid_ctrl_state); /* 步骤3:力矩转电流,发送给FOC电流环 */ user_current.enable =true; /* kt = 0.053 N·m/A(电机转矩常数) */ user_current.value = motor0.hybrid_ctrl_state.tau_output /0.053f; hpm_mcl_loop_set_current_q(&motor0.loop, user_current); } /* 执行FOC电流环 */ hpm_mcl_loop(&motor0.loop); }}


3. 用户交互

主循环中的模式选择和位置输入:

if(user_mode ==2) { /* 初始化力位混合控制 */ motor0_hybrid_ctrl_init(); hybrid_ctrl_mode =true; /* 禁用速度环,由力位混合控制接管 */ user_speed.enable =false; hpm_mcl_loop_set_speed(&motor0.loop, user_speed); printf("\r\nHybrid control mode\r\n"); printf("kp=%.3f, kd=%.3f, tau_limit=%.3f\r\n", (double)motor0.hybrid_ctrl_cfg.kp, (double)motor0.hybrid_ctrl_cfg.kd, (double)motor0.hybrid_ctrl_cfg.tau_max); while(1) { /* 读取用户输入的目标位置(度) */ position =atoi(input_data); /* 角度转弧度:deg * (π/180) ≈ deg * 0.01745 */ mcl_hybrid_ctrl_set_position(&motor0.hybrid_ctrl_cfg, (float)position *0.00157079632f); /* 实际为 deg * π/180 / 10 */ printf("Pos: %d deg, Tau: %.4f Nm, Pos_err: %.4f rad\r\n", position, (double)motor0.hybrid_ctrl_state.tau_output, (double)motor0.hybrid_ctrl_state.pos_error); }}


参数调节指南

1. 参数含义与调节

位置刚度 kp

位置刚度决定了关节对位置偏差产生的恢复力矩:

fee5b836-15ec-11f1-96ea-92fbcf53809c.pngfef604c0-15ec-11f1-96ea-92fbcf53809c.png

阻尼系数 kd

阻尼系数决定了关节对速度的阻尼力矩:

ff0e3522-15ec-11f1-96ea-92fbcf53809c.png

推荐按临界阻尼设计:

ff1b9dd4-15ec-11f1-96ea-92fbcf53809c.pngff25e35c-15ec-11f1-96ea-92fbcf53809c.png

力矩限幅

保护电机和驱动器,防止过流:

ff38d05c-15ec-11f1-96ea-92fbcf53809c.png

根据电机额定电流和转矩常数计算最大力矩:

ff440cd8-15ec-11f1-96ea-92fbcf53809c.png

速度滤波

速度信号通常噪声较大,建议使用低通滤波:

ff5169b4-15ec-11f1-96ea-92fbcf53809c.png

α 越小,滤波越强(推荐0.003-0.1)

死区用于消除静止时的小幅抖动

2. 不同应用场景的参数配置

空载直驱电机(测试用)

mcl_hybrid_ctrl_set_kp(&cfg,0.06f);mcl_hybrid_ctrl_set_kd(&cfg,0.001429f);mcl_hybrid_ctrl_set_limits(&cfg, -0.5f,0.5f);mcl_hybrid_ctrl_set_speed_filter(&cfg,0.003f,0.1f);

特点:惯量小,无减速器,参数需要较小以避免过激响应。

带减速器的关节电机

假设减速比 N=100N=100,电机端转矩常数 kt=0.1kt=0.1 N·m/A,最大电流3A:

/* 输出端等效刚度 = 电机端刚度 × 减速比² */mcl_hybrid_ctrl_set_kp(&cfg,50.0f);mcl_hybrid_ctrl_set_kd(&cfg,14.0f); /* ≈ 2*sqrt(50) *//* 输出端最大力矩 = 电机端力矩 × 减速比 */mcl_hybrid_ctrl_set_limits(&cfg, -30.0f,30.0f); /* 0.1 × 3 × 100 */mcl_hybrid_ctrl_set_speed_filter(&cfg,0.05f,0.01f);

柔顺人机交互

需要较低刚度,允许人手推动:

mcl_hybrid_ctrl_set_kp(&cfg,5.0f);mcl_hybrid_ctrl_set_kd(&cfg,4.5f); /* ≈2*sqrt(5) */mcl_hybrid_ctrl_set_limits(&cfg, -5.0f,5.0f);

高精度定位

需要较高刚度和强阻尼:

mcl_hybrid_ctrl_set_kp(&cfg,200.0f);mcl_hybrid_ctrl_set_kd(&cfg,28.0f); /* ≈2*sqrt(200) */mcl_hybrid_ctrl_set_limits(&cfg, -50.0f,50.0f);


3. 参数整定步骤

ff60691e-15ec-11f1-96ea-92fbcf53809c.png


注意事项

电机转矩常数:需要根据实际电机参数设置,可从电机规格书获取或通过标定测量

编码器精度:位置和速度反馈精度直接影响控制效果

安全限幅:务必设置合理的力矩限幅,防止失控

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

    关注

    3601

    文章

    2169

    浏览量

    278946
  • 混合控制
    +关注

    关注

    0

    文章

    11

    浏览量

    7098
  • HPM
    HPM
    +关注

    关注

    2

    文章

    54

    浏览量

    8303
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    鸿蒙智能体开发知识库---创建知识库

    在小艺智能体平台页面,通过【工作空间】-【知识库】-【新建知识库】,进入新建知识库流程。 若勾选【授权知识库用于知识问答,授权后该
    发表于 03-06 10:18

    开发知识库测试添加知识库

    文档类型的知识要等待数据校验完成后才能上架 可以点击知识名称查看知识详情 等待后端处理完成可以点击知识列表的上架 在智能体中知识库的位置点
    发表于 03-06 15:07

    基于知识库的智能策略翻译技术

    提出基于知识库的策略翻译方法,设计策略翻译组成结构,分析策略知识及其表示形式,建立动态可扩展的策略知识库,开发可扩展的策略编译器和策略组装器。实例测试表明,该
    发表于 04-22 09:42 11次下载

    一种基于解释的知识库综合

    知识库的解释出发,对概念和概念间关系的解释进行了分析,定义了知识库系统的最小概念集合,设计了生成最小概念集合的方法,提出了基于解释的知识库综合算法,讨论了该
    发表于 05-07 20:44 16次下载

    面向抗攻击能力测试的攻击知识库设计

    论文在对攻击知识和攻击知识库进行综合分析的基础上,针对网络设备的抗攻击能力测试要求,提出了一种面向抗攻击测试的攻击知识库设计方案。该方案既着眼于被测目标的
    发表于 08-12 09:05 17次下载

    基于双向混合推理机的知识库系统

    针对目前知识库系统推理效率不高和信息可信度不强的特点,本文结合正向推理和反向推理的优势,取长补短,提出了一种双向混合推理机。本文还设计了一个原型系统,采用知识
    发表于 07-26 17:57 33次下载

    领域知识库的研究与设计

    领域知识库的构建有利于知识的检索和共享。分析了领域知识库应具备的条件,指出构建领域知识库的有效方法;介绍了构建知识库的一般步骤,并设计出领域
    发表于 08-29 14:39 0次下载

    NXP NFC知识库

    NXP NFC知识库
    发表于 12-30 17:32 49次下载

    TI StellarisWare图形使用指南

    TI StellarisWare图形使用指南
    发表于 10-29 10:29 3次下载
    TI StellarisWare图形<b class='flag-5'>库</b><b class='flag-5'>使用指南</b>

    本体知识库的模块与保守扩充

    模块化是软件工程的一种方法,近年来被引入到本体领域,用以支持本体的重用和本体的整合。已有的工作没有讨论同时含有TBox和ABox的本体知识库的模块化的相关问题。在定义本体知识库的模块和知识库的保守
    发表于 11-24 09:58 0次下载

    STM32 LL使用指南

    STM32 LL使用指南
    发表于 01-23 17:31 229次下载

    虚拟仪器知识库文件的结构组成和知识库文件自动生成器的设计与应用

    在前几章中,重点介绍了VISA规范、仪器驱动程序规范及软面板规范,这些构成了虚拟仪器及系统设计的关键部分。为了将VXI产品更有效地集成到虚拟仪器系统中去,VXI总线即插即用系统联盟还定义了虚拟仪器知识库文件的结构。本章介绍了虚拟仪器知识库文件的结构组成,并重点介绍了
    发表于 12-05 14:21 2次下载
    虚拟仪器<b class='flag-5'>知识库</b>文件的结构组成和<b class='flag-5'>知识库</b>文件自动生成器的设计与应用

    如何基于亚马逊云科技LLM相关工具打造知识库

    了解其核心组件、快速部署指南以及LangChain集成及其在电商的应用场景。 通用场景:基于企业内部知识库例如IT/HR信息的问答 制造行业:装备维保知识库问答和售后客服 金融行业:智能客服和智能报告生成 教育行业:面向学生和面
    的头像 发表于 11-23 17:53 2157次阅读
    如何基于亚马逊云科技LLM相关工具打造<b class='flag-5'>知识库</b>

    32基于ARM微控制器GD32E50x固件使用指南

    电子发烧友网站提供《32基于ARM微控制器GD32E50x固件使用指南.pdf》资料免费下载
    发表于 05-16 18:12 12次下载

    HPM知识库 | [EtherCAT] 从站运行过程中报错(错误码:0x1A\\0x1B\\0x2C)的代码分析

    HPM知识库先楫半导体官方公众号全新上线「HPM知识库」专栏。我们将在这里不定期更新技术文档、开发指南与实战教程,打造先楫MCU开发的“一站
    的头像 发表于 03-13 08:34 243次阅读
    <b class='flag-5'>HPM</b><b class='flag-5'>知识库</b> | [EtherCAT] 从站运行过程中报错(错误码:0x1A\\0x1B\\0x2C)的代码分析