STM32f103 SMO滑膜观测器的FOC驱动DIY

news2025/2/23 23:28:43

        小时候玩航模了解到无刷电机,又从方波控制了解到FOC控制,在接触了一些开源项目的时候,感叹做的真好,不论是方波的还是Foc的启动都是那么丝滑,软件做的虽然好,但在这几年电机驱动芯片和部分型号的单片机价格都居高不下,做一个低成本的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; //给定id
     pi_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; //给定id
     pi_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; //给定id
     pi_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波形

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【878. 第 N 个神奇数字】

来源:力扣(LeetCode) 描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b ,返回第 n 个神奇的数字。因为答案可能很大,所以返回答案 对 109 7 取模 后的值。 示…

亚马逊气候友好型承诺所有认证

【亚马逊气候友好型承诺所有认证】 亚马逊与广泛的外部认证合作,包括政府机构、非营利组织和独立实验室,以帮助我们区分更具可持续性的产品。亚马逊专注于信誉良好、透明且专注于保护自然世界的认证。我们将定期评估和重新评估认证环境,以确保…

若依框架的暴力破解漏洞

文章目录 漏洞描述漏洞复现修复建议漏洞描述 由于图片验证码未做好前后台的统一校验,可重复利用验证码,以及无登录错误次数限制等,导致攻击者可对账号与密码进行的穷举测试,从而获取网站登录访问权限 漏洞复现 第一步 抓包获取登录数据包,默认口令Admin123 第二步 发…

win10系统下使用openvino部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、main.cpp四、效果五、后记前言 上一篇介绍过使用onnxruntime实现模型推理部署,但在我的机器上视频效果仍不理想,本篇介绍使用openvino完成模型推理部署。   openvino是Inte…

Windows OpenGL ES 图像透明度

目录 一.OpenGL ES 图像透明度 1.原始图片2.效果演示 二.OpenGL ES 图像透明度源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Open…

linux下gcc编程11-window下clion编译调试nginx+集成lua-nginx-module+安装开源x-waf

nginx模块 nginx作为项目的7层代理入口,对于http请求的过滤,如sql注入,xss攻击等过滤功能较弱,研究了下开源的一些waf,完全开源的https://github.com/xsec-lab/x-waf,利用lua来过滤请求,同时拥…

TuckER 论文笔记

Modeling Relation Paths for Representation Learning of Knowledge Bases- Introduction- Background- Algorithm- Experiment- Conclusion- CodeIvana Balazevic, Carl Allen, Timothy M.Hospedales - Introduction TuckERuckER是一个相对简单但功能强大的线性模型&#xf…

网络营销中 SEO 的作用

与其有时间去阅读各种SEO知识,不如多做一些实际的测试和练习。在百度官方发布的网页质量白皮书中,其实重点介绍了网页速度对SEO优化的影响,前面也出现了一种叫做闪电算法的算法,对于移动排名1.5秒内加载首屏即可打开的网页&#x…

2022亚马逊云科技re:Invent科创风尚,抢占下一个万亿赛道

新风向:重塑科技创投格局 面向未来增长,聚焦投资风向,演绎全新技术。11月28日至12月2日,2022亚马逊云科技re:Invent即将重磅来袭,在美国拉斯维加斯再度盛启。改变世界的全新云技术、不同领域的优选实践,都…

【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解

文章目录一、AnyLogic介绍二、设置2.1 设置中文三、新建项目四、行人库介绍五、创建新行人六、切换3D视角七、增加墙八、行人密度图一、AnyLogic介绍 二、设置 2.1 设置中文 三、新建项目 四、行人库介绍 点击面板,选择第三个图标,就是行人库 行人库分…

react--编程式导航、antd的使用

编程式 1. 借助路由对象中的history 获取: this.props.history.push(/xx/xx) | this.props.history.replace(/xx/xx) 2. 传递sreach参数 this.props.history.push(/xx/xx?xxx100&xx111) 3. 传state参数 this.props.history.push(/xx,{id:1,title:…

web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

ISO 5659-2塑料 烟生成 第2 部分:单室法测定烟密度试验方法

本标准适用于测定塑料燃烧时所产生烟雾的比光密度,并以最大比光密度为试验结果。它用于评定在规定条件下塑料的发烟性能。 ISO5659-2 建筑材料阻燃防火测试-标准名称: ISO 5659-2: 塑料-生烟性测定-第2部分:单烟箱光…

echarts看板效果图:流光折线图、3d柱状图、3d饼图

前言 现在展厅的大看板是越花里胡哨越好,不过真的挺难做的。好在可以百度找到一些大神的作品进行参考。 下面的内容都是基于echarts 5.3.3 和 vue3 。另外demo都是参考别人的案例。 流光折线图 效果图 代码 <template><div id="demo"></div&g…

从零开始学JAVA(01):配置Java运行环境、实现HelloWorld

一、下载安装JDK 1、下载安装 Oracle | Cloud Applications and Cloud Platform 2、验证&#xff08;控制太输入java、java-version、javac&#xff09; 二、 实现HelloWorld 1、下载 Sublime Text Sublime Text - Text Editing, Done Right 2、编写HelloWorld.java文件 …

数据恢复方法有哪些?如何恢复误删照片

数据恢复方法有哪些&#xff1f;电脑文件数据的误删除&#xff0c;基本每个人都遇到过。当我们还是一个电脑小白的时候&#xff0c;说实话这是非常让人崩溃的事情&#xff0c;不过不用担心&#xff0c;今天小编就以自己的亲身经历告诉大家几种比较好用的数据恢复方法。 删除的文…

PyTorch深度学习基础之Tensor对象及其应用的讲解及实战(附源码 简单易懂 包括分段 映射 矩阵乘法 随机数等等)

觉得有帮助请点赞关注收藏 有问题可评论区留言~~~ Tensor对象是一个维度任意的矩阵&#xff0c;但是一个Tensor中所有元素的数据类型必须一致。torch包含的数据类型和普遍编程语言的数据类型类似&#xff0c;包含浮点型&#xff0c;有符号整型和无符号整形&#xff0c;这些类型…

typora免费安装版教程,支持Windows、Mac、Linux

大家好&#xff0c;我是可乐&#xff0c;本篇文章为大家介绍 Typora快捷键、Typora免费安装教程。 Typora是一款简单易用的Markdown编辑器。 目前 Typora 官方是不提供免费版下载了&#xff0c;需要一次性购买版权&#xff0c;支持正版的可以直接前往官网购买&#xff0c;89 …

深圳CPDA认证|学数据分析,其实就是寻找数据背后的规律

现如今&#xff0c;我们正处在一个互联网发展的时代&#xff0c;大大小小的企业对于数据分析相关岗位的需求正开始逐渐增加&#xff0c;因为所有的企业都有数据&#xff0c;企业需要让数据分析师通过整理、分析企业数据总结出企业目前的发展现状&#xff0c;并且也要为企业做出…

【c++】虚函数,纯虚函数,抽象类

这里写目录标题虚函数纯虚函数抽象类为什么抽象类不能创建对象&#xff1f;注意点&#xff1a;接口类如何设计虚析构总结&#xff1a;构造函数为什么不能是虚函数有虚函数的对象创建过程虚函数 虚函数&#xff1a;给成员函数前面加上virtual关键字。 1.派生类中定义虚函数必须…