目录
Encoder 原理
STM32 Encoder 计数原理
模型仿真
模拟Encoder
基于Encoder计算角度和速度
关于启动的仿真
代码生成
运行演示
总结
总结一下基于STM32的Encoder接口的电机运行,相应的仿真和实验都是基于一个1024脉冲的增量式光电编码器,关于模型的建模也是基于实际的实验电机和实际的编码器。
Encoder 原理
实物图如下,2500P/R就是电机机械转360一共有2500个脉冲,实验用的是1024脉冲的,下图仅作参考
线序
内部结构
对于工程应用来说,只需要知道它输出的信号有什么含义。如下:
A和B分别是脉冲数,不同的编码器可能电机转一圈的脉冲数不一样,精度越高,脉冲数越多
定义正转A超前,反转B超前
Z则表示电机已经转完一圈,如下图,机械一圈对应的电角度是2*2pi, 因为实验用的小电机是两对极的。
从编码器的原理来看,想要得到电机的角度就需要计算脉冲数,当转速很高,脉冲频率也会很高,这个时候靠定时器来采样脉冲数变会变得不现实。这个时候就需要专用的Encoder接口了。
STM32 Encoder 计数原理
Stm32就提供了一个Encoder接口,根据其原理配置了Encoder的接口,工作原理如下,A对应TI1, B对应TI2,电机正向转动时计数器根据输入的AB信号,每一个上升沿加1,每一个下降沿也加1,这样对于1024脉冲的编码器,转一圈计数值就是4096。也可以配置成其他模型,这里我们配置成4096个计数值。
Z信号的输入配置成一个外部中断,每触发一次把计数值清零,这样的话角度的计算值就限制在了0-4096也就对应成0-4pi的电角度了。如果不用外部中断触发的话直接读取计数器的值,这样角度就会从0-2^32。F401的Timer 2 计数寄存器是32位的。计算角度时对4096取模即可。这里实验配置成0-2^32。
模型仿真
根据STM32的Encoder接口可以知道,MCU底层能传递的只有0-2^32,反向递减的计数信息,因此生成代码的部分需要读取计数值,模拟Encoder的输出的角度信息,也就是模拟MCU的Encoder接口,最后加上控制系统把系统闭环。
模拟Encoder
如下,分别模拟了实际Encoder的信号以及STM32Encoder接口的输出,和实物一致。
ABZ,以及当前电机的电角度
正转: 反转:
经过STM32的Encoder接口后,取模后
正转: 反转:
基于Encoder计算角度和速度
底层Encoder接口拿到了脉冲计数,因此应用层需要把计算值转换成角度和速度信息,这部分是要生成代码的。在MCU里,角度的计算也放到ADC中断,也就是FOC计算的周期,这里是10Khz.
两者角度完全重合在一起
实际转速和Encoder计算的速度
关于启动的仿真
由于仿真的时候Encoder的初始计数值是0,电机的初始角度也是0,所以电机能正常启动并运行,但是实际中电机的初始角度和Encoder不可能完全在0位置对应且不变,这里通过模拟改变电机的初始位置。
如电机的初始位置改成10度,电机的实际位置和Encoder计算的角度就会有一个固定角度差,相电流也会因此变大。
这个时候这里通过给定初始角度和Id, 让电机固定在一个初始位置,如0,这样就已知电机的初始角度为0,同时清除Encoder的计数值。如下是启动角度的变化:
其中,黄色是电机的真实角度,蓝色是Encoder计算出来的角度,红色是重置计数值的编码器的计数值计算出来的角度。电机初始不在零位置。
代码生成
底层只需要读取出Encoder的计数值,传递给模型生成的接口,启动前固定初始位置标志Encoder_Rest状态标志,当固定初始位置时把Encoder的计数值初始为0。
集成代码,并下载到MCU
运行演示
在小风扇上安装一个编码器,并和开发板的Hall接口连接(接口支持Hall和Encoder),编码器和电机用联轴器连接,简单固定下进行测试。
ABZ编码器运行演示
总结
本实验通过仿真模拟了STM32单片机的Encoder接口,并对其进行角度计算,从仿真系统上实现了整个过程,也把启动和运行的流程通过模型生成代码在硬件上实现,验证了模型的可靠性。