永磁同步电机FOC调试记录(一)

永磁同步电机FOC调试记录(一)

  • 前言
  • 架构
    • 硬件架构
    • 软件架构
  • 调试过程
    • 元器件选型
    • 开环控制
    • 编码器调试
    • 速度采样
    • 电流检测
    • 中断优先级的确定
    • 电流环部分
    • 烧坏IPM
    • 速度-电流环
    • 位置-电流环
  • 结语

前言

这是我个人从零开始尝试永磁同步电机(PMSM)控制的记录,主要是调试过程中遇到的一些问题以及debug思路,欢迎各位前辈讨论交流。
本研究基于硬石电子的硬件开发板以及相关的FOC程序,但本人所有上传的代码除了ST的官方库并没有直接使用其他企业或团体的代码,如果遇到侵权,请联系删除。
代码:Gitee仓库

本文不涉及FOC基础原理的讲解,使用ST官方提供的电机控制库实现FOC计算
本文将按照时间顺序记录调试遇到的问题和解决方法

架构

硬件架构

最开始采用了硬石电子YS-F4Pro控制板和开发板,后期变为自己设计打板的控制板和驱动板。值得注意的是硬石提供的成品驱动板中,线电流采用的是下管分压的采集方式,在电流采样逻辑中需要格外注意。

控制板暂时选用STM32F407 相关例程使用的是正点原子的例程

软件架构

软件架构比较简单,几乎是按照最基础的面向过程的变成方式实现的
主要是由主函数、电流采样、速度采样、FOC计算几个模块组成
详细内容如果有时间会在后面的文章中记录,同样也是因为软件还在不断迭代中,等开发完全之后再进行介绍

调试过程

元器件选型

开始这个项目之前首先进行了相关的元器件选型,选用了杭州微光生产的一款永磁同步电机,以及硬石电子配套的永磁同步电机开发版,这里由于功率板的电流采样功能使用的是下管导通的形式,给后边进行电流采样的时候留下了一个大坑,暂时按下不表。
编码器选择的事多摩川的一款多圈绝对式编码器,单圈精度23bit,多圈13bit,使用485协议与控制板通信。

开环控制

首先要对电机进行开环控制,即生成三路互补的PWM波,本文采用了SPWM的方式(这部分也是由硬石电子提供的)对电机进行开环控制,值得注意的是,在使用硬石原装SVPWM代码进行开环调试时电机不能旋转,最后定位到的原因是MOS管驱动芯片的使能引脚没有设置。这是本次调试遇到的第一个问题,以后如果遇到这类问题的调试思路是在板子上一级一级地看信号状态,这样就能定位到信号时在哪里突然消失的,也就是哪部分出现了问题。

编码器调试

完成电机驱动部分程序的编写后进行反馈回路的调试,首先是调试编码器,也就是需要用485协议与编码器进行通信。遇到的主要问题是485协议本身就是串口的一种形式,只不过使用专用芯片将串口信号转化成了485协议的信号,这里同样有相应芯片使能的问题。
另外一个要注意的问题是通讯时的波特率,我用的编码器通讯波特率是固定的,2.5Mbps,意味着我的速度采样同样不能太快。这里遇到的主要问题是我之前使用的485通信例程中的接收函数主要针对的是和电脑进行通信,而这种与传感器之间的通信可能有许多问题。需要使用示波器观察波形定位具体问题。
发送0x02, 0x08
如上图所示,编码器在接收到单片机的查询指令后会立即返回数据,而此时单片机还没有准备好接收数据,就需要在具体的接受函数内部进行调试,增加或减少一些延时,让单片机能够收到相应的数据。
另外还要注意数据高低位的问题,下图分别是高低位设置错误和设置正常是编码器返回的结果。
高低位设置错误
高低位设置正确
最后一个问题是,读取数据过程中涉及到了IO操作,这样的操作应该在独立的中断中进行操作,不然有可能在读取或发送数据的过程中被别的中断服务函数打断,导致不能正常读取接收到的数据。
同时还遇到了串口中断需要清楚中断标志位的操作,这个可能是由于我在移植程序的时候漏掉了这行代码,导致程序移植卡在串口中断服务函数中不能出去。

速度采样

完成了编码器的通讯调试之后就可以进行速度环的设计和编写,遇到的问题主要是单位换算的问题,即把编码器的绝对位置换算成速度,这个受到采样频率和时钟频率的影响,例如目前这套程序中速度采样的频率是5000Hz,编码器两次返回数据之差要除以0.2us,当改变时钟频率或者采样频率时,这个被除数也要随之改变。

在这里插入图片描述
在这里插入图片描述

电流检测

这期间遇到了一个故障,就是我在给编码器供电的时候不小心将编码器烧了,替换编码器浪费了很长时间,最终也没能成功,只能是重新购置了一台电机。
电流检测主要是通过采样电阻将线电流转化成电压信号输入给单片机的ADC引脚进行采样,这部分没什么复杂的,主要是要确定好ADC采样的方式,F407提供了多种多样的采样方式,目前我选择了一种最简单的单次采样的方式,采样两个通道大约需要60us左右,不知道后边换采样方式之后能不能降低采样时间,我是用的是12位精度的采样(F407支持的最高精度),后边可能考虑更换成H743芯片以及更换采样方式来降低采样时间。
电流采样时间和编码器读取时间是这套算法中最耗时的两个操作,目前这套程序的控制频率是5000Hz,也就是每次控制环有200us的时间进行采样和计算,速度采样和电流采样本身就要耗时60~70us,大大限制了控制频率的提高。但是一个已知的优化方向是,使用DMA进行相关采样的加速,这样就可以更快完成采样,将时间留给计算或者其他资源。

中断优先级的确定

在加入电流采样之后就会有中断的冲突,最终确定了如下的中断优先级:
串口中断优先级0,0
高速任务优先级1,0
中速任务优先级2,0
其中中断优先级数字越大,代表优先级越低

电流环部分

电流环是FOC程序的灵魂,我在之前的测试中发现ADC能够正常采集电流,但是当电机转起来之后,电流的采样就出现了奇怪的现象,如图,上图为示波器采集的电流采样电阻上的波形,下图为ADC的值,电流似乎成周期性地采样成功。
在这里插入图片描述

在这里插入图片描述
这种周期性出现的问题显然是软件问题,最后请教前辈定位到是之前电流采样电路部分留下的坑,下图为硬石的功率板电流采样部分的电路。
在这里插入图片描述
可以看出Isensor U是在下管(下方的/接地的MOS管)和地之间的,也就是只有下管道通的时候,这里才能采样出电压,而为什么能够周期性地采出波形,就是因为正好碰上了下管道通时候能采样。
解决方法是在电流检测之前加上一个判断条件,判断是否下管道通,具体的实现逻辑是,进入到上文提到的200us的控制周期后,等待下管道通,但是有三个下管,所以选用了三个下管全部道通的时候进行采样的方式,由于我们的PWM采用的是中心对齐模式,只要在PWM生成的定时器的另外一个通道加上一个溢出中断即可,也就是定时器每完成一次计数,出现一个中断,然后前文说的等待下管道通,等待的就是这个中断的标志位。这样就能够采样出还算能看的电流波形。
在这里插入图片描述
上图是开环旋转的时候采样的电流波形,当使用电流环进行控制的时候发现电机会在某一个点抖动,这意味着角度反馈每调节好,后边调节了角度反馈的换算方式,终于完成了电流环的闭环。主要的问题是电角度和机械角度的换算,由于永磁同步电机有的时候极对数不为1,机械角度*极对数=电角度,也就是说编码器返回的角度需要乘极对数,才能够给FOC进行计算。最后电流环闭环效果如下:
在这里插入图片描述
这里还有一个小的插曲,就是电角度调零问题,需要手动旋转电机,然后观察一下电角度和机械角度的关系,一般情况下需要加一个偏置才能正常使用,而这个偏置只要在一个范围内,电流环就能闭合,但是最好还是通过示波器精调一下这个偏置的值。

烧坏IPM

由于后边我们使用自己设计的板子进行调试,发现会把IPM烧掉,在烧了好几块之后发现是功率电上电之前必须打开控制电,不然MOS管的驱动信号不确定,也就导致了MOS管的开关状态不确定,有可能直接短路功率电,导致击穿IPM,同样的,也不能够在接通功率电的时候烧写程序,在烧写程序的过程中单片机的引脚状态也是不确定的。
另外引出了一个小的问题,就是一定要使用示波器观察一下单片机从上电启动,到正常工作这段时间内,PWM的输出引脚的状态是否是确定的,之前遇到了某些管脚在高低电平之间波动一下,再变成可控的状态,这一般是某些冗余代码没有删除,在不影响主逻辑的情况下一直被保留了下来。

速度-电流环

这部分主要是PID参数的调节,选用了大家常用的“实验法”一步一步试出来一个还可以的参数组合

位置-电流环

在闭合了速度-电流环之后尝试闭合速度环,一个小的问题是即便使用同一套电路参数和电机,内环的PI参数也有一些不同,在闭合不同外环的时候本项目使用了不同的内环参数,在闭合位置环时,电流环的Kp较小,也就是启动和停止的比较“软”

结语

本篇文章到这里就结束了,但是调试还在继续,后边我会使用别的文章记录硬件调试过程中遇到的问题,欢迎大家批评指正。
鸣谢:PSZ、CB、LH、YKT、LXY、LWT、LH几位老师和同学

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

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

相关文章

【LeetCode刷题】232.用栈实现队列

目录 题目链接 图解思路 整体结构 实现过程 入队列 出队列 实现代码 MyQueue.h MyQueue.c stack.h stack.c test.c 题目链接 232. 用栈实现队列 - 力扣(LeetCode) 图解思路 整体结构 实现过程 入队列 插入数据时,插入到ist。…

尚品汇-(四)

(1)商品的基本知识 1.1基本信息—分类 一般情况可以分为两级或者三级。咱们的项目一共分为三级,即一级分类、二级分类、三级分类。 比如:家用电器是一级分类,电视是二级分类,那么超薄电视就是三级分类。…

《计算机英语》 Unit 5 Networking 网络

Section A Networking 网络 The need to share information and resources among different computers has led to linked computer systems, called networks, in which computers are connected so that data can be transferred from machine to machine. 不同计算机之间共享…

路由器基础配置以及静态路由配置

1、搭建网络 搭建网络拓扑、分配IP地址、划分网段、连接端口 2、配置路由器 路由器基础配置 //进入全局配置模式 Router#enable Router#conf t Enter configuration commands, one per line. End with CNTL/Z.//配置高速同步串口serial2/0 Router(config)#int ser2/0 Route…

Linux-Https协议

文章目录 前言一、Https协议二、常见的加密方式对称加密非对称加密数据摘要&&数据指纹中间人攻击 三、Https的加密历程方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密 四、CA证书什么是CA证书CA证书的合法性如何生成.…

学习笔记——路由网络基础——动态路由

五、动态路由 1、动态路由概述 动态路由:通过在设备上运行某种协议,通过该协议自动交互路由信息的过程。 动态路由协议有自己的路由算法,能够自动适应网络拓扑的变化,适用于具有一定数量三“层设备的网络。 动态路由协议适用场…

深入理解redis持久化—AOF日志

redis为什么需要持久化 redis是内存数据库,redis所有的数据都保存在内存中 如果此时pc关机或重启,那么内存中的用户数据岂不是丢失了?redis这么不安全吗? 作为数据库,保证数据的安全,持久是基本需求&…

【Linux】进程间通信3——system V共享内存

1.system V进程间通信 管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样,它们的本质都是一样的,都是在想尽办法让不同的进程看到同一份由操…

idea导入文件里面的子模块maven未识别处理解决办法

1、File → Project Structure → 点击“Modules” → 点击“” → “Import Model” 2、可以看到很多子模块,选择子模块下的 pom.xml 文件导入一个一个点累死了,父目录下也没有pom文件 解决办法:找到子模块中有一个pom.xml文件,…

Redis 主从同步

主从同步 很多企业没有使用Redis的集群,但是至少都做了主从。有了主从,当master挂掉的时候,运维让从库过来接管,服务就可以继续,否则master需要经过数据恢复和重启的过程,可能会拖很长时间,影响…

web-原生Ajax

概念: Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如…

MySQL—索引—基础语法

目录 一、创建、查看以及删除索引的语法 (1)创建索引 1、1会用到一个关键字:CREATE。 1、2增加索引还可以用到另外一个关键字——ALTER TABLE 表名 ADD INDEX ... 。 2、解释。 (2)查看索引 1、查看索引需要用到…

FreeCAD中类型机制研究

了解FreeCAD类型机制实现原理,为后续FreeCAD相关工作提供参考。 1.实现原理 FreeCAD系统提供一个最上层的基类BaseClass,该类主要处理类型相关工作,几乎所有的FreeCAD的类直接或间接继承于该类。该类只有唯一个属性Type,Type里面…

kotlin类

一、定义 1、kotlin中使用关键字class 声明类,如果一个类没有类体,也可以省略花括号, 默认为public 类型的: // 这段代码定义了一个公开的、不可被继承的Test类 class Test{} // 没有类体,可以省略花括号 class Test 底层代码&…

【菜狗学前端】uniapp(vue3|微信小程序)实现外卖点餐的左右联动功能

记录,避免之后忘记...... 一、目的:实现左右联动 右->左 滚动(上拉/下拉)右侧,左侧对应品类选中左->右 点击左侧品类,右侧显示对应品类 二、实现右->左 滚动(上拉/下拉)右…

利口 202. 快乐数

力扣 202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结…

mac如何检测硬盘损坏 常用mac硬盘检测坏道工具推荐

mac有时候也出现一些问题,比如硬盘损坏。硬盘损坏会导致数据丢失、系统崩溃、性能下降等严重的后果,所以及时检测和修复硬盘损坏是非常必要的。那么,mac如何检测硬盘损坏呢?有哪些常用的mac硬盘检测坏道工具呢? 一、m…

57.SAP MII产品介绍(07)功能详解(06)Workbench-SQLQuery

1.SQLQuery概念 您可以使用SAP Manufacturing Integration and Intelligence(SAP MII)Workbench中的SQLQuery来创建访问面向SQL的连接器(如IDBC连接器)的模板。此查询的扩展名为tqsq。 简而言之,SQLQuery就是一段…

嵌入式web 服务器boa的编译和移植

编译环境:虚拟机 ubuntu 18.04 目标开发板:飞凌OKA40i-C开发板, Linux3.10 操作系统 开发板本身已经移植了boa服务器,但是在使用过程中发现POST方法传输大文件时对数据量有限制,超过1M字节就无法传输,这是…

Ansible-Playbook

前置 Playbook介绍 playbook 剧本是由一个或多个“play”组成的列表Playbook 文件是采用YAML语言编写的用户通过ansible命令直接调用yml语言写好的playbook,playbook由多条play组成,每条play都有一个任务(task)相对应的操作,然后调用模块modules,应用在…