永磁同步电机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通信例程中的接收函数主要针对的是和电脑进行通信,而这种与传感器之间的通信可能有许多问题。需要使用示波器观察波形定位具体问题。
如上图所示,编码器在接收到单片机的查询指令后会立即返回数据,而此时单片机还没有准备好接收数据,就需要在具体的接受函数内部进行调试,增加或减少一些延时,让单片机能够收到相应的数据。
另外还要注意数据高低位的问题,下图分别是高低位设置错误和设置正常是编码器返回的结果。
最后一个问题是,读取数据过程中涉及到了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几位老师和同学