资讯详情

【开源】STM32硬盘音圈电机闭环控制

文章目录

  • 什么是音圈电机?
  • 二、硬盘音圈电机
  • 三、音圈电机改装
  • 四、控制和代码设计
    • 4.1 pid实现控制对象
    • 4.2 参数调整
    • 4.3 其他应用
  • 总结

什么是音圈电机?

音圈电机(Voice Coil Motor)它是一种特殊形式的直接驱动电机。它具有结构简单、体积小、速度高、加速响应快等特点。其工作原理是将电线圈(导体)放置在磁场中,力的大小与施加在线圈上的电流成比例.基于此原理制造的音圈电机运动形式可以为直线或者圆弧(摘自百度百科) 音圈电机最常用的应用应该是喇叭,如下图所示,线圈可以随着磁场中电流的变化而变化 在这里插入图片描述

二、硬盘音圈电机

在硬盘上,音圈电机可以根据磁道信息判断磁头的位置,并在很短的时间内准确定位在计算机指令指定的磁道上。作者不知道他使用了什么定位算法,但有一件事可以确定,定位需要位置反馈。

三、音圈电机改装

作者在淘宝上买了十多块硬盘,音圈电机拆卸如下图所示。位置反馈使用2000线光编码器,也可以使用电位器作为位置反馈,效果差,容易受到环境噪声的干扰。D将电机与编码器的连接部分打印出来。 组装在一起后,如下图所示

四、控制和代码设计

接下来,进入控制设计部分,简要介绍伺服闭环控制,伺服系统有电流环、速度环、位置环,三个环串联形成串联PID控制系统,最内环为电流环,最外环为位置环,外环输出为内环设定值。无论是定位还是控制速度,最终的控制都是电流,所以预计电流可以自由控制。在伺服系统中,三相电流需要根据相差120°可用于产生旋转磁场foc实现电流模式,即扭矩模式,在音圈电机中的情况要简单得多,不需要任何复杂的foc而旋转磁场,直接给电机供电是电流模式,大小和方向可以自由切换,笔者使用了这个项目TB67H450芯片驱动电机,可以根据输入的电压控制信号控制电机的电流。内部有一个比较器,可以保证电压和电流之间的对应关系。即使电机阻抗发生变化,内部比较器也会增加电压,实现电流恒定。这可能是直接的原理pwm控制没有这种效果。可以认为TB67H450芯片控制电流环,程序只能实现速度环和位置环

4.1 pid实现控制对象

将pid抽象控制器TargetPID类,结构中的数据是操作成员的变量,外部接口函数是变量操作的方法,使用c模仿c 简单实现面向对象的思想,方便创造多个思想pid控制对象,实现速度环、位置环,甚至多个伺服电机

typedef struct { 
             float goal_val;     float input_val;     float out_val;     float last_out_val;     float integral_i;      float Kp;     float Ki;     float Kd;      /* interface */  float (*getFeedbackVal)();      }TargetPID; float PID_Control(TargetPID *target); void PID_SetGoalVal(TargetPID *target, float goal_val); void PID_SetPidPara(TargetPID *target, float kp, float ki, float kd); 

pid使用绝对式控制器算法pid算法,输入被控对象

/** * @brief pid控制核心函数 * @param target 控制对象 * @return pid控制输出量 */ float PID_Control(TargetPID *target) { 
          float bias = 0; target->input_val = target->getFeedbackVal(); //采集输入 bias = target->goal_val - target->input_val; target->integral_i += bias; target->out_val = target->Kp * bias + target->Ki * target->integral_i + target->Kd * (bias - target->last_out_val); target->last_out_val = bias; if (target->integral_i > MAX_INTEGRAL_VAL) //积分限幅 { 
           target->integral_i = MAX_INTEGRAL_VAL; } if (target->integral_i < -MAX_INTEGRAL_VAL) { 
           target->integral_i = -MAX_INTEGRAL_VAL; } if (target->out_val > MAX_OUT_VAL) //输出限幅 { 
           target->out_val = MAX_OUT_VAL; } if (target->out_val < -MAX_OUT_VAL) { 
           target->out_val = -MAX_OUT_VAL; } return target->out_val; } 

4.2 参数调整

创建速度环和位置环对象后,在主函数循环执行pid控制函数就可以实现位置闭环,麻烦的是参数调整,先给一个居中的位置值作为位置环目标值,先从速度环开始,从很小的数开始慢慢往上加,位置环也是如此,用手触碰电机,其鲁棒性较好即可,实际调整发现参数范围很广都可以稳定运行,根据需要调整位置环比例可得到不同位置环刚度。

4.3 其他应用

为了实现一些比较好玩的功能,在此系统中,我使用的都是纯比例控制。 1、实现阻尼效果: 将位置环比例、积分、微分都设为0,调整速度环比例,慢慢加大阻尼效果增强,因为位置环比例为0时,相当于位置环没有工作,处于速度模式,且速度环的目标值为0,用手拨动电机能感受到明显阻尼,速度越大阻力越大 2、作为体感遥控器使用 使用编码器的位置输出去控制其他执行器,比如机械爪,在机械爪安装传感器,并将夹持力反馈到音圈电机,人就能感受到机械爪夹到了物体,在工业或娱乐游戏场景可以应用

总结

最后展示下最终的控制效果,正弦位置测试 对了,项目代码已全部开源GitHub下载地址,上面提到力控机械爪项目后面会陆续更新。 以上就是本篇博客的全部内容,若文中有不足之处,欢迎大家的批评指正!

标签: 电机加装传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台