FOC(笔记二)

news2024/9/21 12:39:39

 接上篇文章: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的计算和调整

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

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

相关文章

SpringCloud02_consul概述、功能及下载、服务注册与发现、配置与刷新

文章目录 ①. Euraka为什么被废弃②. consul简介、如何下载③. consul功能及下载④. 服务注册与发现 - 8001改造⑤. 服务注册与发现 - 80改造⑥. 服务配置与刷新Refresh ①. Euraka为什么被废弃 ①. Eureka停更进维 ②. Eureka对初学者不友好,下图为自我保护机制 ③. 阿里巴巴…

taro小程序terser-webpack-plugin插件不生效(vue2版本)

背景 最近在做公司内部的小程序脚手架&#xff0c;为了兼容老项目和旧项目&#xff0c;做了vue2taro,vue3taro两个模板&#xff0c;发现terser-webpack-plugin在vue2和vue3中的使用方式并不相同&#xff0c;同样的配置在vue3webpack5中生效&#xff0c;但是在vue2webpack4中就…

【Linux】:重定向和缓冲区

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来关于重定向和缓冲区的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精…

【题解】 栈和排序(栈 + 预处理 / 贪心)

https://www.nowcoder.com/practice/95cb356556cf430f912e7bdf1bc2ec8f?tpId196&tqId37173&ru/exam/oj 预处理最大值 #include <climits> // 包含标准整数类型的定义 #include <vector> // 包含标准vector容器的定义class Solution {public:/*** 栈排…

接着探索Linux的世界 -- 基本指令(文件查看、时间相关、打包压缩等等)

话不多说&#xff0c;直接进入主题 一、cat指令 -- 查看目标文件的内容 语法&#xff1a;cat [选项][文件] 功能&#xff1a; 查看目标文件的内容 -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 1、查看目标文件的内容 2、 -b 对非空输出行编号 3、-n 对…

论文浅尝 | 学会使用上下文学习来进行命名实体识别

笔记整理&#xff1a;王润哲&#xff0c;东南大学硕士&#xff0c;研究方向为大模型 链接&#xff1a;https://aclanthology.org/2023.acl-long.764.pdf 1. 动机 实体关系是知识图谱中不可或缺的一层重要信息&#xff0c;它们描述了实体之间的语义关系&#xff0c;这种连接使得…

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…

Visual Studio 安装程序无法执行修复或更新

一.问题场景 出现问题的场景&#xff1a;当你的VS已经安装但是无法在工具中下载新组件或者卸载了当时一直无法安装。 二.问题原因 如果计算机上的 Visual Studio 实例已损坏&#xff0c;则可能会出现此问题。 三.解决方法 如果之前尝试修复或更新 Visual Studio 失败&…

Qt5离线安装包无法下载问题解决办法

Qt5离线安装包无法下载问题解决办法 文章目录 Qt5离线安装包无法下载问题解决办法1、前言2、Qt5安装包下载办法 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt安装包官方下载地址 Qt5离线安装包目前在国内已经被墙…

Meta即将推出4000亿的Llama 3 超级AI模型,或将改写大语言模型竞争格局!|TodayAI

2024年4月&#xff0c;科技巨头Meta发布了其最新的AI大型语言模型——Llama 3&#xff0c;该模型基于一个至少比前代产品Llama 2大七倍的数据集&#xff0c;展现出前所未有的性能。在最初发布时&#xff0c;Llama 3提供了8B和70B两种参数规模的版本&#xff0c;并迅速超越了Goo…

SpringBoot新手快速入门系列教程十一:自动生成API文档,Springboot3.x集成SpringDoc

本次项目我们用Maven来做&#xff0c;最近发现gradle其实很多项目的支持比较差&#xff0c;所以项目还是用Maven来新建项目。对比了市面上的几种API生成第三方库&#xff0c;只有springdoc 是能够按照文档就能部署出来的。 官网&#xff1a; OpenAPI 3 Library for spring-bo…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(八)-通过无人机进行无线接入

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

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

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

gd32发送数据,定义参数,接收中断

void usart_receive_data(uint8_t ucch) {usart_data_receive(UART3); } void usart_send_data(uint8_t ucch) {usart_data_transmit(UART3,(uint8_t)ucch);while(usart_flag_get(UART3,USART_FLAG_TBE) RESET); } 这是在c文件中定义函数&#xff0c;之后在h文件中声明&#…

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符&#xff08;如Socket&#xff09;的状态变化&#xff0c;并能在某个文件描述符就绪时执行相应操作的技术。在Redis中&#xff0c;多路I/O复用技术主要用于处理客户端的连接请求和读写操作&#xff0c;以实现高并发…

eProsima Fast DDS getting started

系列文章目录 文章目录 系列文章目录preface**对象与数据结构**● Publish-Subscriber模块● RTPS模块**配置Attributes** Discovery传输控制前言0、安装cmake安装相关源码安装&#xff1a;- A foonathan_memory_vendor- C fastcdr- D tinyxml2- E asio- F openssl- G fastrtps…

贪心:交换论证法

目录 切蛋糕的最小总开销 切蛋糕的最小总开销 交换论证&#xff1a; 设横切的开销为 h&#xff0c;如果先横切&#xff0c;设需要横切 cnt_h 次。 设竖切的开销为 v&#xff0c;如果先竖切&#xff0c;设需要竖切 cnt_v 次。 先横切&#xff0c;再竖切&#xff0c;那么竖切…

模拟电路再理解系列(3)-共射极放大电路

1.三极管 共射极放大电路的主要器件是三极管&#xff0c;先来梳理一下这个经常见到的元器件 结构 三极管的三个极&#xff1a;基极&#xff0c;集电极&#xff0c;发射极 基极流经的电流来控制集电极和发射极之间的导通和关闭&#xff0c;之前看过一个形象的比喻&#xff0c…

51单片机9(使用左移实现流水灯编程)

一、序言&#xff1a;下面我们来给大家介绍一下这个流水灯&#xff0c;流水灯如何来实现&#xff1f;我们依然使用这个工程来完成它。 1、那要使用实现这个流水灯&#xff0c;那我们只需要让D1到D8逐个的点亮&#xff0c;那同样要实现它足够的点亮&#xff0c;也会涉及到延时&…

windows10 安装Anaconda

文章目录 1. 下载2. 安装3. 配置环境变量4. 检查是否安装成功 1. 下载 官网下载 https://www.anaconda.com/download 下载的最新版本&#xff0c;要求python的版本也高一些 清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 所有版本在这个网…