之前有些网友试着用有刷的平均电流法采集三相,还搞了个闭环控制。求!结果直接把驱动板给干没了......

        做过仿真的朋友们都知道,无刷电机的相电流波形是介于方波和正弦波的。如果拿平均电流去测量,很不靠谱。

        这节内容为大家分享采集三相模拟量的通用配置思路。

        一、CubeMX的ADC初始化

        使能三个ADC通道,分别传输UVW线电流(Y型下等于相电流)

                

        四分频表示APB2总线/4,也就是说ADC频率为72Mhz/4 = 18Mhz 这是我们F1下ADC的基础频率。若用F407系列请自行计算。

        12倍原始采样率、右对齐、扫描转换模式开、EOC选择顺序转换、连续转换模式开、DMA连续请求开、常规采样开、

        cycle转换通道量为2.5/3(因型号不同),我这里设置的是2.5cycles,表示2.5个ADC基础周期采集一次rank1,由此我们可推算出各个通道的采样频率

        接着设置所有rank对应的通道(1,2,3)、采样周期为3个循环     

        (ARM架构上绝大部分三相采集都如此配置,可以记住,原因比较难解释)

           接着配置DMA, 虽然最终数据寄存器float是32位,但是我们用的是12位采样,DMA寄存器是uint16_t的,一次读两个字节刚合适,不要把概念搞混淆了。

           

          二、ADC的DMA中断处理逻辑

uint16_t g_adc_firstave_result[3];
//一次均值结果寄存//一次均值函数
int32_t ADC_GetSampleAvgN(int16_t *Data)
{uint32_t temp[ADC_CH_NUM] = {0,0,0};     //初始化结果寄存器int i,j;         //ij计数变量for(i=0;i<ADC_COLL;i++)   //COLL为每个ADC通道的DMA容量{   //在顺序DMA采集中 DMA寄存器的内容结构为 RANK1数据 RANK2数据 RANK3数据......以此类推          for(j=0;j<ADC_CH_NUM;j++)                   {    //NUM为参与顺序DMA的总通道数temp[j] += ADC_ConvValueHex[j+i*ADC_CH_NUM];//temp也按rank排序,把DMA寄存器中,每个独立通道的数据累加}}for(j=0;j<ADC_CH_NUM;j++){//对每个独立通道的累加值求均值temp[j] /= ADC_COLL;//把中间变量值传给最终结果Data[j] = temp[j];       }
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)  
{int32_t ADConv = 0 ; //停止DMA,保证数据时序完整性HAL_ADC_Stop_DMA(hadc);//进行一次滤波,并获取数据  ADC_GetSampleAvgN((int16_t*)g_adc_firstave_result);//重新让DMA工作HAL_ADC_Start_DMA(hadc,(uint32_t*)ADC_ConvValueHex, ADC_CH_NUM * ADC_COLL);
}

         三、定时器中断处理逻辑

 if(timeTickCurrent != 0)timeTickCurrent--;else {if(Motor_State==MOTOR_ENABLE){
//当电机运行时,读取实际的电流(相电流+偏置电流)for(uint8_t i=0; i<3; i++){adc_val_m1[i] = g_adc_firstave_result[i];   adc_amp[i] = adc_val_m1[i] - adc_amp_offset[i][ADC_AMP_OFFSET_TIMES];if(adc_amp[i] >= 0)    adc_amp_un[i] = adc_amp[i];							}
//U相电流
current[0] = ((float)(adc_amp_un[0] * VOLT_RESOLUTION)- 1650.0f)/4020.0f/SM_REST;
//V相电流
current[1] = ((float)(adc_amp_un[1] * VOLT_RESOLUTION)- 1650.0f)/4020.0f/SM_REST;
//Z相电流
current[2] = ((float)(adc_amp_un[2] * VOLT_RESOLUTION)- 1650.0f)/4020.0f/SM_REST;/*W*/Vofa_data(current[0],VOFA_CHANNEL1);
Vofa_data(current[1],VOFA_CHANNEL2);
Vofa_data(current[2],VOFA_CHANNEL3);//上传到上位机//一节低通滤波暂时不用//						current[0] = ((float)(1-FILTER_Q_CURRENT) * LS_Speed_hz) + (FILTER_Q_CURRENT * Speed_hz) ;
//						current[1]= ((float)(1-FILTER_Q_CURRENT) * LS_Speed_hz) + (FILTER_Q_CURRENT * Speed_hz) ;
//						current[2]= ((float)(1-FILTER_Q_CURRENT) * LS_Speed_hz) + (FILTER_Q_CURRENT * Speed_hz) ;}
if(Motor_State==MOTOR_DISABLE){//当电机停止的时候uint8_t i;//三个均值变量,用于寄存UVW三相的偏置电压uint32_t avg[3] = {0,0,0};//这里直接用了二维数组存放偏置量//结构为  通道1p1 通道1p2 通道1p3 ... 通道1pn//通道2p1 通道2p2 通道2p3 ... 通道2pn//以此类推adc_amp_offset[0][adc_amp_offset_p] = g_adc_firstave_result[0]; adc_amp_offset[1][adc_amp_offset_p] = g_adc_firstave_result[1];adc_amp_offset[2][adc_amp_offset_p] = g_adc_firstave_result[2];adc_amp_offset_p++;//若数据采集满,进行二次均值滤波if(adc_amp_offset_p >= ADC_AMP_OFFSET_TIMES){adc_amp_offset_p = 0;}//进行均值累加   for(i = 0; i < ADC_AMP_OFFSET_TIMES; i++)              {avg[0] += adc_amp_offset[0][i];avg[1] += adc_amp_offset[1][i];avg[2] += adc_amp_offset[2][i];}//进行平均并把数据重新传回offset最后一列,作为标准偏置for(i = 0; i < 3; i++)                             {avg[i] /= ADC_AMP_OFFSET_TIMES;adc_amp_offset[i][ADC_AMP_OFFSET_TIMES] = avg[i];  }}//我这里的偏置采集量设置的是50次,而采集一次相电流所需时间大概在1.5ms左右,所以在电机启动前需要一个至少大于75ms的delaytimeTickCurrent = TIMECNT_CURRENT;}

        四、相电流开环图像

        此时测量的是平均相电流图像,与仿真时的实时图像有所区别,一般不会有周期性的0出现,如果出现了,就得考虑以下采样频率是不是取的过大。

        在实际工程中,最常用的是平均电流做控制。在高精度场景下,也有用实时电流做控制的,但其相应的控制器响应要求更高,经典控制算法无法达到这种需求。

        其次,查看你的三相电流是不是满足波峰交替的,如果重合成了一条线,那你的DMA配置及处理过程必然有错误。

        

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ref存储对象和reactive深度响应式递归地对对象的嵌套属性进行响应式处理

ref 不会递归地对 对象 或 数组 中的每个属性或元素进行深度响应式处理。如果你需要递归处理嵌套属性&#xff0c;reactive 是更适合的选择。让我通过具体的例子来展示这一点。 例子&#xff1a;ref 存储对象和嵌套对象 1. 使用 ref 存储嵌套对象&#xff1a; import { createA…

小鹏汽车前端面经

前端基础与浏览器机制 (Front-End Fundamentals & Browser Mechanics) 这些问题涵盖了Web工作的基本原理&#xff0c;包括网络、渲染和浏览器特性。 1. 浏览器渲染与性能 (Browser Rendering & Performance) URL输入发生什么&#xff1f;(What happens when you type a…

利用DeepSeek编写go语言按行排序程序

听说google出品的go语言也是系统开发中常用的&#xff0c;性能到底怎么样&#xff0c;还是老办法&#xff0c;让DeepSeek写个程序跑一下&#xff0c;基于以往的经验&#xff0c;直接让它同时编写有缓冲和无缓冲版本。 package mainimport ("bufio""fmt"&qu…

《解构Angular组件变化检测:从自动到手 动的效能突破》

为何有时数据更新后视图却无动于衷?为何看似简单的操作会引发连锁式的性能损耗?要解开这些疑问,需要穿透表层的API调用,深入到框架设计的底层逻辑中去。变化检测的核心使命,是确保视图层能够准确反映数据层的当前状态。这种"数据-视图"的同步关系,是所有前端框…

书单 | AI编程+Python+Go三大核心领域书单

这份书单聚焦AI编程、Python开发、Go语言三大核心领域&#xff0c;精选6本本月 最具前瞻性的技术图书&#xff0c;为你构建"工具链业务层系统层"的全栈能力。 1、人人皆可Vibe编程&#xff1a;玩转氛围编程 作者&#xff1a;池志炜,薛志荣 本书围绕Vibe编程这一AI驱…

Kali Linux 2025.2基于MITRE ATTCK框架

从彻底革新的菜单结构到新增的13款尖端工具&#xff0c;再到首次支持智能手表Wi-Fi注入&#xff0c;Kali Linux 2025.2为红队、蓝队以及安全研究人员提供了更高效、更直观的工具生态。菜单结构大变革&#xff1a;基于MITRE ATT&CK框架Kali Linux 2025.2最引人注目的变化之一…

javacc实现简单SQL解析器

文章目录前言本章节源码需求1&#xff1a;实现一个最简单的select sql要求实现jj文件编译测试需求2&#xff1a;理解Token及其他属性说明javajj文件需求3&#xff1a;实现解析得到SQL语法树 & 精确点位资料获取前言 博主介绍&#xff1a;✌目前全网粉丝4W&#xff0c;csdn…

Odoo OWL前端框架全面学习指南 (后端开发者视角)

核心理念&#xff1a; 将您熟悉的Odoo后端MVCORM架构思想&#xff0c;完整映射到前端OWL组件化开发中&#xff0c;让您在熟悉的概念体系下&#xff0c;快速掌握新的技术栈。第一部分&#xff1a;核心概念映射与环境搭建内容摘要&#xff1a; 本部分旨在建立后端与前端最核心的概…

Java开发工具包,jdk,idea,VMware,rocketmq,redis,CentOS7

Java开发工具包&#xff0c;jdk&#xff0c;idea&#xff0c;VMware&#xff0c;rocketmq&#xff0c;redis&#xff0c;CentOS7 下载地址 通过网盘分享的文件&#xff1a;Java开发环境工具包 链接: https://pan.baidu.com/s/1eJqvPx5DYqtmXgmEtOl8-A?pwdcj1f 提取码: cj1f –…

macOS Python 安装

目录 一、确认系统环境 二、安装 &#xff08;一&#xff09;下载安装包 &#xff08;二&#xff09;安装过程 三、配置环境变量 四、验证安装 一、确认系统环境 在安装 Python 之前&#xff0c;我们先简单了解一下自己的 MACOS 系统。可以点击屏幕左上角的苹果菜单&…

MySQL 全方位解析:从基础到高可用架构

1. 介绍 (Introduction) 1.1. 什么是 MySQL&#xff1f; MySQL 是全球最受欢迎的开源关系型数据库管理系统 (Relational Database Management System, RDBMS)。它由瑞典的 MySQL AB 公司开发&#xff0c;现隶属于 Oracle 公司。MySQL 将数据存储在不同的、预先定义好结构的表中…

力扣热题100——滑动窗口

无重复字符的最长子串步骤 1&#xff1a;初始状态 字符串 s “abcabcbb”&#xff0c;哈希表 charSet 初始为空&#xff0c;双指针 left 0&#xff0c;right 0。 哈希表&#xff08;charSet&#xff09;&#xff1a; {} 字符串&#xff1a; a b c a b c b b 指…

SOD-YOLO:增强基于YOLO的无人机影像小目标检测

摘要 https://www.arxiv.org/pdf/2507.12727 小目标检测仍是目标检测领域中的一个挑战性问题。为应对这一挑战&#xff0c;我们提出了一种基于YOLOv8的增强模型SOD-YOLO。该模型在颈部&#xff08;neck&#xff09;中集成了ASF&#xff08;注意力尺度序列融合&#xff09;机制以…

监督微调-指令微调-偏好微调

有监督微调 有监督微调是使用输入及其标签对的典型情况。例如&#xff0c;判断邮件是垃圾邮件还是非垃圾邮件&#xff0c;判断情感是积极还是消极。根据文档的主要主题对其进行分类也是一种常见应用。模型会将输入文本的相应表示&#xff08;隐藏状态或嵌入向量&#xff09;作为…

楼宇自控系统对建筑碳中和目标的实现具重要价值

随着全球气候变化问题日益严峻&#xff0c;建筑行业作为碳排放的重要来源之一&#xff0c;其节能减排工作备受关注。楼宇自控系统&#xff08;Building Automation System&#xff0c;BAS&#xff09;作为智能建筑的核心组成部分&#xff0c;通过集成控制、监测和管理建筑内的各…

【YOLO学习笔记】YOLOv5详解

一、数据增强 mosaic仿射变换与透视变换Mixup mosaic代码位置仿射变换 与 透视变换​代码片段位置 二、网络结构 1. 网络不同尺寸 nsmlx与网络深宽度 yolov5 官方提供了5个目标检测的网络版本&#xff1a;yolov5n、yolov5s、yolov5m、yolov5l、yolov5x &#xff0c;早年是…

WebRTC前处理模块技术详解:音频3A处理与视频优化实践

一、WebRTC前处理模块概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;作为实时音视频通信的核心技术&#xff0c;其前处理模块是提升媒体质量的关键环节。该模块位于媒体采集与编码之间&#xff0c;通过对原始音频/视频数据进行优化处理&#xff0c;解决实时…

ssm复习

Spring Framework系统架构核心容器的学习IOC/DIIOC容器IOC使用对象时,由主动new产生的对象转换为由外部提供对象,此过程中对象的创建的控制权交由外部,此思想称为控制反转, (实现了自己new的解耦) 对象创建的控制权Spring提供一个容器,称为IOC容器 用来充当IOC思想的外部Bea…

ESP32:2.搭建UDP服务器

硬件&#xff1a;ESP32-Devkit-V4 MODEL:ESP32-32U 库&#xff1a;ESP-IDF v5.4.1 系统&#xff1a;windows中的虚拟机 ubuntu 22.04 实现STA&#xff0c;主动连接AP后&#xff0c;打印IP地址&#xff0c;获取IP后&#xff0c;创建socket&#xff0c;搭建UDP 服务器&#xff0…

【Linux】动静态库制作

&#x1f43c;故事背景假设今天你有一位舍友。你需要帮助他完成老师的作业。而他写的代码依赖两个文件&#xff08;mymath.h,mystdio.h&#xff09;。但是这两个文件的功能他不会写&#xff0c;他只会调用。他的调用代码:#include"mystdio.h" #include"mymath.h…