电机编码器的使用方法

本文详细探讨了电机编码器的校正原理,包括绝对编码器和增量编码器的工作方式。通过实验分析了编码器的Z信号与电机实际位置的偏差,并提出了解决方法。在实际应用中,通过调整编码器读数和Z信号的关系,可以精确确定电机转子的电角度位置,这对于电机控制系统的精度至关重要。
摘要由CSDN通过智能技术生成

电机编码器位置的校正原理(Motor Encoder Calibration)

绝对编码器

不需要在运行开始前进行参考点的定位(增量编码器需要先找到Z信号),即便是在掉电期间产生的转动也不妨碍后续上电后的定位,因为任意角度都独立对应唯一的编码,读取编码就读取了角度。

需要事先确定转子经过A轴时的编码,如此转子任意位置真正地唯一对应了一个编码,这个是在工厂安装编码器时就可以确定的事情,事后我们其实无法改变。

增量编码器
  • 通过Z信号定位参考点,通过AB两路方波脉冲计量角度增量。

preview

引用于https://zhuanlan.zhihu.com/p/64794247

在转子转动过程中,转子每转一圈(机械角一圈),编码器发出一个Z脉冲信号。

理想的情况是,转子d轴正对定子绕组A相时出现Z信号,此时磁场定向的角度为0,符合教材的讲述。在实际中,由于安装的不确定性,Z信号在转子d轴与A相轴线之间存在角度偏差 δ \delta δ时发出。

image-20210416133007547

//转子N极与Encoder重合时发出Z信号,此后便可以依据此时的AB脉冲距离Z脉冲的距离计算出N极与encoder之间的角度偏差 θ \theta θ

在做控制的过程中,我们需要的是d轴与定子A相轴之间的角度,因此需要在编程前校正电机转子位置。

注意: 有意思的一种情况是,如果你知道编码器的线数,其实可以通过某种强行拖动方法,让电机初始时刻停在A相,此时让编码器计数器清零,当后续编码器计数到最大线数时表示转完了一圈,这个方法不需要Z信号也能获取转子位置,但可能会造成误差累积。此外,有些情况是不允许有强行复位的这个过程的,此时则需要通过一些初始位置估计的方法得到初始转子位置。

理想情况

在Simulink中搭建电机发电仿真模型,模型中默认转子d轴与A相绕组重合。

A相的磁链表达式为 ψ a = ψ m cos ⁡ ω τ \psi_a=\psi_m\cos\omega\tau ψa=ψmcosωτ

在发电机状态下,电机的电压方程满足 e = u + i R e = u+iR e=u+iR

忽略电机的内阻,则有 e = u e = u e=u

从而可得电机A相的端电压为 u a = ψ m ω sin ⁡ ω τ u_a=\psi_m\omega\sin\omega\tau ua=ψmωsinωτ

仿真所观察的波形印证了理论分析,电机在外力匀速拖动时,转子位置零点与反电势对应的A相电压正过零点是一致的。
请添加图片描述

实际情况

实际情况是,Z信号发生的位置,也即编码器给出的d轴位置与A相绕组是存在偏差的,因此需要通过实验得到这个偏差角。

将电机三相定子绕组接到对称的三相电阻上,按照编码器角度增加的方向,也即正方向转动电机。

测量此时的A相电阻电压波形,同时观察Z信号的输出,依据Z信号与A相电阻电压的相位差得到编码器距离A相轴的电角度偏差 δ \delta δ

增量编码器的起始偏差

因此,在编程时任意时刻的真实转子位置电角度可以表示为
θ ′ = θ + δ \theta^{'} = \theta + \delta θ=θ+δ

实验一

在一台三对极,带2048线编码器的电机上进行d轴校准实验。

在手动转动电机转子的发电模式下得到三相电压波形与Z信号波形。

请添加图片描述

注意到Z信号出现的位置是离A相电压正过零点电角度215 ∘ ^\circ ,因此在编码器输出的电角度上再加上一个校正值,在标幺制下为

215 360 = 0.5972 \frac{215}{360}=0.5972 360215=0.5972

在这里插入图片描述

因此,实际的出现Z信号的位置在图中标注E的位置。

电角度超前A相215°,对于三对极电机,即机械角度超前71°,采用2048线增量编码器,即线束超前 71 360 ∗ 2048 ∗ 4 = 1615 \frac{71}{360}*2048*4=1615 3607120484=1615

电角度滞后A相145°,对于三对极电机,即机械角度超前48°,采用2048线增量编码器,即线束滞后 46 360 ∗ 2048 ∗ 4 = 1100 \frac{46}{360}*2048*4=1100 3604620484=1100

实验二

在CCS中进行d轴位置的校准实验,设置在检测到Z信号后编码器读数归零,且此时在A相注入一定强度的电流,具体方法是,强制将FOC控制代码的角度设置为0,即假设此时d轴正好停在A相,并且将d轴电流控制为一个合适的电流,此时电机转子将从出现Z信号的位置迅速锁定在A相相轴。(按照FOC的控制逻辑,如果此时将d轴电流控制为0,q轴电流控制为合适的量,那电机就会以最大转矩转动)

在仿真器中读取此时的编码器读数,若小于转一圈(本试验为8192)的一半,则表示Z信号发出后转子正方向旋转至A相,若大于转一圈的一半,则表示Z信号发出后转子反方向旋转至A相。
在这里插入图片描述
可以看到,实验中编码器的读数恰好为1100,也即代表转子正方向旋转至A相,在填写校正值时,需要填写此读数的相反数。

The end
使用STM32HAL库编写代码时,设置编码器的方向可以通过以下步骤完成: 1. 配置GPIO引脚:首先,需要将编码器的A相和B相信号引脚与STM32控制器的GPIO引脚连接。使用HAL库提供的函数(如HAL_GPIO_Init)初始化这些GPIO引脚。 2. 配置编码器接口模式:接下来,通过调用HAL库提供的函数(如HAL_TIM_Encoder_Init)初始化编码器接口模式。这将配置定时器和GPIO引脚以捕获编码器的脉冲信号。 3. 配置编码器方向:通过调用HAL库提供的函数(如HAL_TIM_Encoder_Start)启动编码器接口,并设置捕获方向。要设置编码器的方向,请使用HAL库提供的函数(如HAL_TIM_Encoder_SetPolarity)设置定时器的输入极性。 例如,以下代码片段演示了如何使用STM32HAL库配置编码器的方向: ```c // 配置GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟 GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // 编码器A相和B相引脚 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式 GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉模式 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA引脚 // 配置编码器接口模式 TIM_HandleTypeDef htim; __HAL_RCC_TIM2_CLK_ENABLE(); // 使能TIM2时钟 htim.Instance = TIM2; htim.Init.EncoderMode = TIM_ENCODERMODE_TI12; // 编码器接口模式 htim.Init.IC1Polarity = TIM_ICPOLARITY_RISING; // A相信号极性 htim.Init.IC2Polarity = TIM_ICPOLARITY_RISING; // B相信号极性 htim.Init.IC1Selection = TIM_ICSELECTION_DIRECTTI; // 直接输入模式 htim.Init.IC2Selection = TIM_ICSELECTION_DIRECTTI; // 直接输入模式 HAL_TIM_Encoder_Init(&htim); // 初始化编码器接口 // 配置编码器方向 HAL_TIM_Encoder_Start(&htim, TIM_CHANNEL_ALL); // 启动编码器接口 HAL_TIM_Encoder_SetPolarity(&htim, TIM_ENCODERPOLARITY_NONINVERTED); // 设置编码器方向为非反转 ``` 请根据您的硬件连接和需求进行适当的修改。此代码片段假定编码器的A相和B相信号连接到GPIOA的引脚0和1,使用TIM2作为编码器接口。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值