FOC(笔记二)

 接上篇文章:FOC算法(笔记一)_马鞍波和三角波调制合成-CSDN博客

        前面已经对FOC的开环控制进行了介绍,下面对FOC的闭环控制进行介绍。

本次使用的电机参数如下图所示:

一、HALL传感器

1.1、霍尔传感器的角度、速度计算

        因为本次使用的是120°安装的三相霍尔编码器,所以霍尔德精度是非常低的,如下图所示的,每圈只能检测6次,对角度的精度是比较低的,所以较低速度情况下如无法获得电机的角度和角速度信息的。

        所以通过计算上一个60°的电机的转速,作为下一个60°来临之前的速度,乘以ADC检测时间就可以算出中间检测时间。

(1) 如下图所示的,通过判断霍尔三相GPIO的电平可以判断当前霍尔的角度在第几个60°。 

(2)一般电机三相的0角度为Ud=1、Uq=0电平的时候转子所在位置,所以转子的0°和霍尔德0°,也即是如下图所示0x50位置所示的0°,两个是不一样的,所以需要对角度进行补偿,具体补偿如下代码所示:

#define PHASE_SHIFT_ANGLE (float)(220.0f/360.0f*2.0f*PI)

(3)只知道是多少个60°,精度太低,所以通过定时器对三相霍尔德编码器进行霍尔(HALL)模式的检测,当有上升沿、下降沿的时候就触发定时器的中断,之后通过中断的时间和60°角度计算出来电机的转速,后面在ADC检测中使用角度自增的时候,直接用速度乘以ADC检测时间就可以计算出来每次ADC检测角度的增量。从而平滑的获得角度递增的锯齿波结果。

(4)上面(3)中计算出来的速度是电机的角速度,在速度闭环控制的时候,使用的机械速度,并且两者都是弧度制的,所以应该将角速度转化为机械速度(转/min、r/min)角速度(°/s)/360°/60s*极对数.

2.2、霍尔编码器嵌入式程序

        如下面代码所示的是TIM4定时器的编码器模式,在检测到三相上有电平变化的时候产生中断,中断中调用下面的回调函数,回调函数中计算速度(机械角度频率,转/分钟,rmp/min),ADC一个检测周期角度增加值。

(1)HallTemp = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1);
(2)HallThetaAdd = (PI/3)/(HallTemp/3200000)/10000;          
(3)HallSpeed = (PI/3)*2/(HallTemp/3200000)*60/(2*PI);

(1)获得触发定时器中断的时间。

(2)计算ADC一个检测周期的角度增加值HallThetaAdd,PI/3表示一个编码器触发周期的角度;HallTemp/3200000表示定时器的计时时间,单位秒,(计数次数/TIM时钟频率);10000标志ADC检测的频率,除以频率等于乘以ADC检测一次时间。

(3)计算电机的速度(rmp/min),2表示电机的极对数,将电角度转化为机械角度;60是将秒转化为分钟;(2*PI)标志一圈的弧度,将弧度转化为圈。

//转子0角度和霍尔零角度的差值补偿
#define PHASE_SHIFT_ANGLE (float)(220.0f/360.0f*2.0f*PI)

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
	if(htim == &htim4)
	{
		HallTemp = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1);
		HallThetaAdd = (PI/3)/(HallTemp/3200000)/10000;          //电角度的速度增量,除以10000是为了提前乘以ADC采样时间。
		HallSpeed = (PI/3)/(HallTemp/3200000)*30/(2*PI);         //角度的计算,60/计数时间,然后将电角度转化为机械角度
    
//    /* 一介低通滤波器,对于高频噪声滤波效果好,运算量小 */
//    HallSpeed_filter = HallSpeed;
//    HallSpeed_filter = (1-(HallTemp/16000))*HallSpeed_last+(HallTemp/16000)*HallSpeed_filter;
//    HallSpeed_last = HallSpeed_filter;
    
    /* 角度的判断,只能60增加的判断 */
	HallReadTemp = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8);
	HallReadTemp |= HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)<<1;
	HallReadTemp |= HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)<<2;
    if(HallReadTemp==0x05) 
    {
      HallTheta = 0.0f+PHASE_SHIFT_ANGLE;
    }
    else if(HallReadTemp==0x04)
    {
      HallTheta = (PI/3.0f)+PHASE_SHIFT_ANGLE;
    }
    else if(HallReadTemp==0x06)
    {
      HallTheta = (PI*2.0f/3.0f)+PHASE_SHIFT_ANGLE;
    }
    else if(HallReadTemp==0x02)
    {
      HallTheta = PI+PHASE_SHIFT_ANGLE;
    }
    else if(HallReadTemp==0x03)
    {
      HallTheta = (PI*4.0f/3.0f)+PHASE_SHIFT_ANGLE;
    }
    else if(HallReadTemp==0x01)
    {
      HallTheta = (PI*5.0f/3.0f)+PHASE_SHIFT_ANGLE;
    }
    if(HallTheta<0.0f)
    {
      HallTheta += 2.0f*PI;
    }
    else if(HallTheta>(2.0f*PI))
    {
      HallTheta -= 2.0f*PI;
    }	
	}
}

        下面是对上面回调函数中计算的数据的使用。

HallTheta = HallTheta + HallThetaAdd;    //区间角度+角度变化值
if(HallTheta < 0.0f)
{
	HallTheta += 2.0f*PI;
}
else if(HallTheta > (2.0f*PI))
{
	HallTheta -= 2.0f*PI;
}
g_SC.theta = HallTheta;           //当前的角度值
g_SpPI.Speed_now = HallSpeed;     //当前编码器速度

二、电流环闭环

2.1、电流闭环整体框架

        

2.2、电流闭环simulink模型

2.3、电流环PI控制

2.3.1、PI控制器输入输出的限幅

2.3.2、PI控制的Kp、Ki的计算和调整

三、速度环闭环

3.1、速度闭环整体系统框图

3.2、速度闭环simulink模型

3.3、速度环PI控制器

3.3.1、PI控制器输入输出的限幅

3.3.2、PI控制器的Kp、Ki的计算和调整

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024安全行业大模型技术应用态势发展报告

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/dH9bu

蒙特卡洛抽样方法

目录 认识该方法 认识该方法 不断抽样逐渐逼近 计算Π 打点&#xff0c;落在圆&#xff08;1/4&#xff09;的概率 抽样点越多&#xff0c;Π的值越准确 蒙特卡洛不在于精确&#xff0c;也不在于找到最准确的数值。如下图所示&#xff0c;Π就等于红

Git代码管理工具 — 3 Git基本操作指令详解

目录 1 获取本地仓库 2 基础操作指令 2.1 基础操作指令框架 2.2 git status查看修改的状态 2.3 git add添加工作区到暂存区 2.4 提交暂存区到本地仓库 2.5 git log查看提交日志 2.6 git reflog查看已经删除的记录 2.7 git reset版本回退 2.8 添加文件至忽略列表 1 获…

006-三台交换机堆叠

三台交换机堆叠 链形连接和环形连接 链形配置IRF与环形配置IRF的区别 三个交换机链形配置IRF与三个交换机环形配置IRF的主要区别体现在以下几个方面&#xff1a; 物理位置要求&#xff1a; 链形连接&#xff1a;对成员设备的物理位置要求相对较低&#xff0c;主要适用于成员…

鸿蒙语言基础类库:【@system.app (应用上下文)】

应用上下文 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import app from system.app;app.getInfo …

Scrapy框架实现数据采集的详细步骤

需求描述&#xff1a; 本项目目标是使用Scrapy框架从宁波大学经济学院网站&#xff08;nbufe.edu.cn&#xff09;爬取新闻或公告详情页的内容。具体需求如下&#xff1a; 1、通过遍历多个页面&#xff08;共55页&#xff09;构建翻页URL。 2、使用scrapy自带的xpath从每页的…

C++基础(二十):常见C++11的新特性

1979年&#xff0c;贝尔实验室的本贾尼等人试图分析unix内核的时候&#xff0c;试图将内核模块化&#xff0c;于是在C 语言的基础上进行扩展&#xff0c;增加了类的机制&#xff0c;完成了一个可以运行的预处理程序&#xff0c;称之为C with classes。语言的发展就像是练功打怪…

项目三层架构详情

三层架构 三层架构就是为了符合“高内聚&#xff0c;低耦合”思想&#xff0c;把各个功能模块划分为表示层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;和数据访问层&#xff08;DAL&#xff09;三层架构&#xff0c;各层之间采用接口相互访问&#xf…

UDP网络通信(发送端+接收端)实例 —— Python

简介 在网络通信编程中&#xff0c;用的最多的就是UDP和TCP通信了&#xff0c;原理这里就不分析了&#xff0c;网上介绍也很多&#xff0c;这里简单列举一下各自的优缺点和使用场景 通信方式优点缺点适用场景UDP及时性好&#xff0c;快速视网络情况&#xff0c;存在丢包 与嵌入…

Windows终端远程登陆Linux服务器(SSH+VScode)

W i n d o w s 终端远程登陆 L i n u x 服务器&#xff08; S S H V S c o d e &#xff09; \huge{Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09;} Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09; 文章目录 写在前面通过SSH远程连接L…

Postman下载及使用说明

Postman使用说明 Postman是什么&#xff1f; ​ Postman是一款接口对接工具【接口测试工具】 接口&#xff08;前端接口&#xff09;是什么&#xff1f; ​ 前端发送的请求普遍被称为接口 ​ 通常有网页的uri参数格式json/key-value请求方式post/get响应请求的格式json 接…

@google/model-viewer 导入 改纹理 (http-serve)

导入模型 改纹理 效果图 <template><div><h1>鞋模型</h1><model-viewerstyle"width: 300px; height: 300px"id"my-replace-people"src"/imgApi/Astronaut.glb"auto-rotatecamera-controls></model-viewer>&…

网络分层及通信过程

网络分层体系 主流的理论体系中主要包含三种网络分层模型&#xff0c;即ISO的七层网络模型、TCP/IP的四层网络模型以及结合两种模型优点的五层网络模型&#xff0c;关于网络模型&#xff0c;主要起到对网络体系的一个整体认识&#xff0c;作为网络知识学习的开始&#xff0c;这…

【Python进阶】正则表达式、pymysql模块

目录 一、正则表达式的概述 1、基本介绍 2、快速使用re模块 二、正则的常见规则 1、匹配单个字符 2、原始字符串 3、匹配多个字符 4、匹配开头和结尾 5、匹配分组 三、Python与MySQL交互 1、pymysql模块的安装 2、pymysql的操作步骤 3、connection对象 4、cursor…

【Git从入门到精通】——Git常用命令总结

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

购物系统 (GUI)

一、前言 1 研究背景 随着电子商务的快速发展&#xff0c;越来越多的消费者选择在网上购物。为了提高用户体验、提升交易效率和管理便捷性&#xff0c;许多企业和个人开始开发和使用各种类型的购物系统商城。而基于Java Swing的购物系统商城正是应运而生的一种应用。Java Swi…

C++中链表的底层迭代器实现

大家都知道在C的学习中迭代器是必不可少的&#xff0c;今天我们学习的是C中的链表的底层迭代器的实现&#xff0c;首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别&#xff0c;为什么顺序表的底层迭代器更加容易实现&#xff0c;而链表的底层迭代器…

更换Mac硬盘后如何将数据恢复到新驱动器?

在本文中&#xff0c;我们将分享几种在用新 Mac 硬盘替换旧 Mac 硬盘后从旧 Mac 硬盘恢复数据的方法。 您是否最近由于存储空间不足或损坏问题而必须更换新的Mac硬盘&#xff1f;是否要将受影响驱动器中的数据恢复到新驱动器&#xff1f;我们可以帮忙&#xff01;但是&#xf…

线性代数|机器学习-P24加速梯度下降(动量法)

文章目录 1. 概述2. 引入3. 动量法梯度下降 1. 概述 我们之前学的最速梯度下降[线搜索方法] 公式如下&#xff1a; x k 1 x k − s k ∇ f ( x k ) \begin{equation} x_{k1}x_k-s_k\nabla f(x_k) \end{equation} xk1​xk​−sk​∇f(xk​)​​ 但对于这种方法来说&#xff…

手机数据恢复篇:如何从 Android 设备内恢复数据

如何从 Android 内部存储恢复数据&#xff1f; 要从 Android 内部存储恢复已删除的文件&#xff0c;您需要一个 Android 内部存储恢复应用或程序。请继续阅读以获取可靠的 Android 数据恢复软件&#xff0c;并让它帮助您从 Android 手机的内部存储恢复数据。 是否有可能恢复 An…