小时候玩航模了解到无刷电机,又从方波控制了解到FOC控制,在接触了一些开源项目的时候,感叹做的真好,不论是方波的还是Foc的启动都是那么丝滑,软件做的虽然好,但在这几年电机驱动芯片和部分型号的单片机价格都居高不下,做一个低成本的Foc驱动器利用网上开源资料已经不够用了。

ky_motor Foc 测试视频

假期趁着有时间做一套Foc驱动器,从硬件到软件,从夏天到冬天,真是不容易,总算差不多了。

开发板:​​​​​​​开发板链接

硬件选用了STM32F103单片机,程序内容并不是很多,103c8,103rb都可以满足需求,为了后期可以扩展资源,我选用了rbt6,价格大约16元一颗,不是用的ST电机库,因此程序可以移植到国产芯片上,不过我没有移植过,毕竟我不太相信国产芯片(个人观点)。

驱动芯片选用的EG2134,没什么可说的,就是图便宜,一颗大约1.5元,比国产的峰绍还要便宜个几毛钱,这难道不是我选它的理由吗?

运放选用的是LM324,也是几毛钱的物料,追求更好的效果可以选用精度更高的运放,而不是我选用的这个玩具级,运放采样做的是一个差分输入的方式,看电流波形还可以。

Mos用的是Irlr7843,性能很好的一颗mos,以前做航模的时候总用这个mos,就是假货比较多,我这个板子也没打算跑太大的电流,因此这个Mos不论从价格还是从性能,都能满足我的需求。

三个控制按键,复位,开始,停止。实际的程序样式也是按start电机开始转动,按stop电机停止转动,复位键用于debug调试使用。预留一个电位器接口,用来调速。

电阻采样用了三颗0.05R的采样电阻,通过三电阻采样的方式保证了电流采样的精度(当然,运放有些拉跨)。

剩下的就是辅助电路了,预留了IIC接口,SPI接口,后期方便加传感器或者OLED。

硬件介绍完了,剩下的就是软件部分了,当然也是最精彩的部分了,篇幅有限,我简单介绍一下功能,后面有时间我会在专栏里给大家详细的讲解一下Foc的控制方法。

使用了SMO 滑膜观测器,SMO代码精简,性能稳定,值得多花一些时间对其进行改进。比如,在反电势滤波方法上。SMO参数调整相对来说比较简单,实际调试电机过程中能很快的调出让电机稳定运行的参数。有没有参数更容易调整的观测器?有的,对传统滑模观测器添加一个自适应律,得到自适应滑模观测器。当然,最重要的还是我比较擅长SMO,其他的都不重要。

控制模式上写了三个模式,Hallloop(霍尔闭环),SMOloop(滑膜闭环),Openloop(开环)这三个模式。我先把这部分代码贴上来,后期测试的视频我在传上来。

Openloop

void Motor_IFStart(void)
{Angle_Acc(Angle);AngleSin_Cos.IQAngle = Angle.Set;//角度pi_iq.Ref = IqStart; //启动电流设置ADC_Sample();//采集电流 得到UV电流AngleSin_Cos.IQSin = _IQsinPU(AngleSin_Cos.IQAngle);AngleSin_Cos.IQCos = _IQcosPU(AngleSin_Cos.IQAngle);/**************Clark变换****************/ClarkI.As = AdcValue.PhaseUCurr;ClarkI.Bs = AdcValue.PhaseVCurr;CLARK_MARCO(ClarkI);//clark变换 /**************Park变换****************/   ParkI.Alpha = ClarkI.Alpha;ParkI.Beta  = ClarkI.Beta;ParkI.Sine  = AngleSin_Cos.IQSin;ParkI.Cosine = AngleSin_Cos.IQCos;PARK_MARCO(ParkI);//Park变换 /************d轴控制器*******************/    pi_id.Ref = 0; //给定idpi_id.Fbk = ParkI.Ds;  //反馈id     PI_MACRO(pi_id);//  d轴控制器/************q轴控制器*******************/    pi_iq.Fbk = ParkI.Qs;  //反馈iq     PI_MACRO(pi_iq);//  q轴控制器 /************PARK逆变换*******************/     IparkU.Ds = pi_id.Out;IparkU.Qs = pi_iq.Out;IparkU.Sine = AngleSin_Cos.IQSin;//查表得到正弦值IparkU.Cosine=AngleSin_Cos.IQCos;//查表得到余弦值PARKinv_MARCO(IparkU) Svpwm.Ualpha = IparkU.Alpha;Svpwm.Ubeta =  IparkU.Beta;SMO_Angle(ClarkI.Alpha,ClarkI.Beta,IparkU.Alpha,IparkU.Beta); //滑膜估算角度SVPWM_Gen(&Svpwm); //得到占空比PWM_CMP(); //得到PWM比较值
}

SMOloop

void SMO_SpeedLoop(void)
{  PWMZD_count++;if(PWMZD_count==25){PWMZD_count=0; SMO_Speedcale();pi_spd.Ref = SpeedRef;pi_spd.Fbk = Speed_estPare.Speed_RPM;PI_SPEED_MACRO(pi_spd);//速度环PI  } AngleSin_Cos.IQAngle =  IQAtan_Pare.IQAngle;//估算角度pi_iq.Ref = pi_spd.Out; //速度输出ADC_Sample();//采集电流 得到UV电流AngleSin_Cos.IQSin = _IQsinPU(AngleSin_Cos.IQAngle);AngleSin_Cos.IQCos = _IQcosPU(AngleSin_Cos.IQAngle);/**************Clark变换****************/ClarkI.As = AdcValue.PhaseUCurr;ClarkI.Bs = AdcValue.PhaseVCurr;CLARK_MARCO(ClarkI);//clark变换 /**************Park变换****************/   ParkI.Alpha = ClarkI.Alpha;ParkI.Beta  = ClarkI.Beta;ParkI.Sine  = AngleSin_Cos.IQSin;ParkI.Cosine = AngleSin_Cos.IQCos;PARK_MARCO(ParkI);//Park变换 /************d轴控制器*******************/    pi_id.Ref = 0; //给定idpi_id.Fbk = ParkI.Ds;  //反馈id     PI_MACRO(pi_id);//  d轴控制器/************q轴控制器*******************/    pi_iq.Fbk = ParkI.Qs;  //反馈iq     PI_MACRO(pi_iq);//  q轴控制器 /************PARK逆变换*******************/     IparkU.Ds = pi_id.Out;IparkU.Qs = pi_iq.Out;IparkU.Sine = AngleSin_Cos.IQSin;//查表得到正弦值IparkU.Cosine=AngleSin_Cos.IQCos;//查表得到余弦值PARKinv_MARCO(IparkU) Svpwm.Ualpha = IparkU.Alpha;Svpwm.Ubeta =  IparkU.Beta;SMO_Angle(ClarkI.Alpha,ClarkI.Beta,IparkU.Alpha,IparkU.Beta); //滑膜估算角度SVPWM_Gen(&Svpwm); //得到占空比PWM_CMP(); //得到PWM比较值
}

Hallloop

void Mode_Hall_loop(void)
{PWMZD_count++;if(PWMZD_count==25){PWMZD_count=0;Hall_Three_Speedcale(); pi_spd.Ref = SpeedRef;pi_spd.Fbk = Hall_Three.Speed_RPM;PI_SPEED_MACRO(pi_spd);//速度PI控制器 }ThreeHallanglecale();//得到角度AngleSin_Cos.IQAngle = Hall_Three.ele_angleIQ;ADC_Sample();//采集电流 得到UV电流AngleSin_Cos.IQSin = _IQsinPU(AngleSin_Cos.IQAngle);AngleSin_Cos.IQCos = _IQcosPU(AngleSin_Cos.IQAngle);/*****************************************************************************//**************Clark变换****************/ClarkI.As = AdcValue.PhaseUCurr;ClarkI.Bs = AdcValue.PhaseVCurr;CLARK_MARCO(ClarkI);//clark变换 /**************Park变换****************/   ParkI.Alpha = ClarkI.Alpha;ParkI.Beta  = ClarkI.Beta;ParkI.Sine  = AngleSin_Cos.IQSin;ParkI.Cosine = AngleSin_Cos.IQCos;PARK_MARCO(ParkI);//Park变换 /************d轴控制器*******************/    pi_id.Ref = 0; //给定idpi_id.Fbk = ParkI.Ds;  //反馈id     PI_MACRO(pi_id);//  d轴控制器/************q轴控制器*******************/    pi_iq.Ref = pi_spd.Out; //速度输出pi_iq.Fbk = ParkI.Qs;  //反馈iq     PI_MACRO(pi_iq);//  q轴控制器 /************PARK逆变换*******************/     IparkU.Ds = pi_id.Out;IparkU.Qs = pi_iq.Out;IparkU.Sine = AngleSin_Cos.IQSin;//查表得到正弦值IparkU.Cosine=AngleSin_Cos.IQCos;//查表得到余弦值PARKinv_MARCO(IparkU) Svpwm.Ualpha = IparkU.Alpha;Svpwm.Ubeta =  IparkU.Beta;SMO_Angle(ClarkI.Alpha,ClarkI.Beta,IparkU.Alpha,IparkU.Beta); //滑膜估算角度SVPWM_Gen(&Svpwm); //得到占空比PWM_CMP(); //得到PWM比较值}

增加了一个上位机接口,用于观测电流波形Iabc,SMO和speed。上位机用的是VOFA,一个开源的上位机。

这是Iabc的波形。

这是SMO波形 

这是 速度speed波形

整体测试还算好吧,后续还有很多工作需要做。最后是测试视频

STM32f103 SMO滑膜观测器的 无感无刷FOC驱动DIY相关推荐

  1. 无刷电机无感六步方波驱动原理整理以及过零现象产生分析

    无刷电机无感六步方波驱动原理整理以及过零现象产生分析 1.序言 近期在琢磨关于无刷电机驱动,发现在谈论无感六步方波驱动时,都只是提及到会有这么一个过零现象,而没有具体分析为什么,根据本人有限的电磁学理 ...

  2. ACM6753(18V/3A三相无感BLCD无刷直流电机驱动IC)

    概述 ACM6753是一款18V/3A三相无感BLCD(无刷直流)电机驱动IC.180˚正弦,集成驱动算法+预驱+MOS ,内置电流检测. 产品指标和特性 • 供电电压范围:5V-24V • 上侧MO ...

  3. 筋膜枪无感无刷热敷PCBA方案

    普通按摩功能的筋膜枪随处可见,随着客户需求的增加以及产品差异化竞争的需要,带热敷功能的无刷无感筋膜枪产品受到市场的热捧.热敷可以扩张血管.改善局部血液循环.缓解局部肌肉痉挛,加强局部氧气和营养物质的供 ...

  4. 无尽的悲伤 无感无感

    小时候,我们常常幻想: 要是想那些大人那样多好! 多自由,想去哪去哪,想怎么花钱怎么花钱. 可以不用每天窝在幼儿班.学校, 让阿姨管着我们睡午觉, 让老师管着我们上自习, 小时候,我们常常幻想: 外面 ...

  5. [硬件基础] 有刷、有感和无刷无感电机对比

    原文地址: [转] 有刷.有感和无刷无感电机的使用心得  作者: -工控老鬼 一.有刷马达的原理 要讲清这一问题,那就应粗略地了解一下有刷马达的工作原理.接下来用一个三电极.二磁极内转子有刷马达作为演 ...

  6. 基于stm32F103HAL库+cubemx+freertos无感无刷电机BLDC控制程序开发

    基于stm32F103HAL库+cubemx+freertos无感无刷电机BLDC控制程序开发 最近在做一个舵机控制项目,控制对象为大功率无感无刷电机,网上搜遍了资源,貌似这方面的资源真得十分匮乏.大 ...

  7. 有刷、有感和无刷无感电机的使用心得

    一.有刷马达的原理 要讲清这一问题,那就应粗略地了解一下有刷马达的工作原理.接下来用一个三电极.二磁极内转子有刷马达作为演示. 二.无刷电机工作原理 首先,无刷电机不是直流电机,模型虽然是直流电池供电 ...

  8. diy无感无刷电机霍尔安装_新型无感无刷电机驱动的制作方法

    本实用新型涉及,具体为新型无感无刷电机驱动. 背景技术: 无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品.无刷电机是指无电刷和换向器(或集电环)的电机,又称无换向器电机.早在十九纪诞 ...

  9. 无感FOC滑膜观测器学习

    无感FOC滑膜观测器学习 ctime:2020-02-04 20:40:32 +0900|1580816432 标签(空格分隔): 技术 硬件 目标是要通过滑膜观测器来获取电机转子位置 根据电机的数学 ...

最新文章

  1. java8 lambda 表达式详解
  2. python正规教育机构-长沙python培训机构哪家好
  3. python类和对象详解_Python公开课 - 详解面向对象
  4. [数字图像处理]图像去噪初步(1)--均值滤波器
  5. MySQL中count方法和sum方法查询条件错误时返回结果
  6. 计算机组成原理——指令流水线
  7. 原 Linux搭建SVN 服务器2
  8. 一行python代码值多少钱_一行python代码
  9. linux系统管理:认识安装linux(一)
  10. oracle大数据量迁移,分批量导入样例(fetch...bulk collect)以及forall结合使用
  11. appium安装教程
  12. TCL语言学习笔记一
  13. Oracle导入Excel中数据
  14. 【Python爬虫实战】【天天基金网】想要低风险+心动收益?5分钟学会筛选优质债券基金
  15. python实现有趣的数学逻辑程序
  16. 参加计算机培训典型材料,计算机应用专业典型学员事迹材料
  17. 统计字符出现的次数(输出由多到少)
  18. navicat连接数据报10060错误
  19. 电商搜索“优化商品排序”实践方案
  20. Arduino ESP32利用PWM实现板载LED呼吸灯效果

热门文章

  1. 音视频基础知识-时间戳的理解
  2. 锦溪:恬淡如少女的千年古镇
  3. 广东财经大学理工科毕业论文word模版
  4. 考早了!华为认证推出“一试双证”,IE直接补贴3000元
  5. 【图形设计】数据流图(DFD)简介
  6. TTS离线语音合成应用方案【一】
  7. 开启和关闭远程Windows系统3389端口
  8. C++(标准库):26---STL迭代器之(迭代器的5大种类(输出迭代器、输入迭代器、向前迭代器、双向迭代器、随机访问迭代器))
  9. signal 11 (SIGSEGV), code 2 (SEGV_ACCERR)的原因和解决办法
  10. python:自然常数 e =2.71828