STM32编码器在光栅尺测速场合的实际应用

合集下载

光栅尺工作原理的应用

光栅尺工作原理的应用

光栅尺工作原理的应用1. 引言光栅尺是一种精密测量仪器,主要用于测量物体的长度、位置和运动速度等参数。

它通过光栅原理来实现测量,具有高精度、高稳定性和高度自动化等特点。

本文将介绍光栅尺的工作原理及其在实际应用中的一些典型案例。

2. 光栅尺的工作原理光栅尺利用光的干涉原理来进行测量。

它由一个光源、一个光栅和一个光电探测器组成。

光源发出的光经过光栅后形成干涉条纹,然后被光电探测器接收并转换为电信号。

根据干涉条纹的特征,我们可以计算出被测量物体的长度或位置。

光栅是光栅尺中最关键的部件。

它由一系列等距且平行的透明区域和不透明区域组成。

当光经过光栅时,透明区域和不透明区域会导致光程差,从而形成干涉条纹。

这些干涉条纹的间距和形状与光栅的结构参数以及光源的波长有关,因此可以通过测量干涉条纹的特征来确定被测量物体的长度或位置。

3. 光栅尺的应用案例3.1 机床加工精度检测光栅尺可以用于机床加工精度的检测。

通过在机床的移动部件上安装光栅尺,我们可以实时监测移动部件的位置,并与设定的理论位置进行对比。

通过比较实际位置与理论位置的差异,我们可以判断机床是否存在精度问题,并进行相应的调整和修复。

3.2 位移测量光栅尺可以用于位移测量。

通过将光栅尺安装在被测量物体上,我们可以实时监测物体的位移情况。

这对于一些需要精确控制位移的应用场景非常重要,例如机械臂的运动控制、液晶显示屏的调整等。

3.3 速度测量光栅尺还可以用于测量物体的速度。

通过将光栅尺安装在运动物体上,我们可以测量物体的运动速度。

这对于一些需要精确控制速度的应用场景非常重要,例如自动化生产线中的物料输送、车辆的行驶速度控制等。

3.4 表面质量检测光栅尺可以用于表面质量的检测。

通过测量物体表面的形状和轮廓,我们可以评估物体的加工质量。

这对于一些要求高精度加工的行业非常重要,例如航空航天、半导体制造等。

4. 结论光栅尺作为一种精密测量仪器,在工业生产和科学研究中有着广泛的应用。

光栅尺和编码器的区别

光栅尺和编码器的区别

光栅尺和编码器的区别下面将详细探讨光栅尺和编码器的区别。

首先,我们将介绍两者的基本概念,然后通过比较它们的特性和应用来展示它们的差异。

一、基本概念1、光栅尺:光栅尺是一种利用光栅和光电检测技术进行测量或位置反馈的装置。

其工作原理是利用一对相对移动的光栅,通过测量光栅的相对位移来计算物体的位置或位移。

2、编码器:编码器是一种用于测量旋转角度或位置的装置。

它通过读取旋转编码器的脉冲数来测量旋转角度或位置。

编码器可以用于许多不同的应用,例如电机控制、机器人定位等。

二、特性比较1、分辨率:光栅尺的分辨率通常高于编码器。

由于光栅尺采用高精度光栅,其分辨率可以非常高,达到微米甚至纳米级别。

而编码器的分辨率通常较低,一般只有几十到几百个脉冲。

2、线性度:光栅尺的线性度通常优于编码器。

由于光栅尺采用一对相对移动的光栅,其测量结果不受机械误差的影响,因此其线性度很高。

而编码器的线性度受限于编码器的设计以及使用环境的影响,可能会有一些误差。

3、环境适应性:光栅尺对环境的变化较为敏感,例如温度、湿度和机械振动等,这些因素都可能影响光栅尺的测量精度。

而编码器对环境的变化不太敏感,因此更适合在恶劣环境下使用。

4、成本:一般来说,光栅尺的成本高于编码器。

光栅尺需要精密加工和制造,而且需要高质量的光电检测器。

编码器虽然也需要一定程度的加工和制造,但其结构相对简单,成本较低。

三、应用比较1、测量与反馈控制:在测量和反馈控制方面,光栅尺是一种常见的位置传感器。

它被广泛应用于各种高精度测量和反馈控制应用中,例如机床、运动控制系统等。

编码器则通常用于电机控制和机器人定位等应用中,通过读取编码器的脉冲数来控制电机的旋转角度或位置。

2、速度和位置控制:在速度和位置控制方面,编码器和光栅尺都可以使用。

但是,由于编码器的线性度和精度较低,它通常被用于低精度应用中,例如速度控制或简单位置控制。

而光栅尺则更适合高精度应用,例如高速运动控制系统或精密加工设备。

STM32编码器在光栅尺测速场合的实际应用

STM32编码器在光栅尺测速场合的实际应用

STM32编码器在光栅尺测速场合的实际应用STM32103F系列微控制器的定时器有一种特有工作模式——编码器接口模式,此模式可以用来反馈马达的实时转子位置,测量马达的转速,也可以反馈光栅尺的实时位置,测量光栅头的移动速度,在工业控制场合,尤其是需要精确定位的压机、机床等使用场合,有着非常实用的价值。

现以STM32103F微控制器与海德汉(HEIDENHAIN)光栅尺LS1378C为例,详细介绍定时器的编码器工作原理,以及双定时器配合测速度的编程算法。

标签:STM32编码器;光栅尺;测速STM32103F系列是ST公司采用高性能的32位ARM Cortex-M3内核,主要面向工业控制领域推出的微控制器芯片。

通用定时器有以下几种工作模式:计数器模式、输入捕获模式、输出比较模式、PWM模式、单脉冲模式、编码器接口模式。

其中,编码器接口模式是一种有别于其他通用ARM控制器以及DSP控制器的特有模式,此模式可以用来反馈马达的实时转子位置,测量马达的转速,也可以反馈光栅尺的实时位置,测量光栅头的移动速度,在工业控制场合,尤其是需要精确定位的压机、机床等使用场合,有着非常实用的价值。

光栅尺位移传感器(简称光栅尺),是利用光栅的光学原理工作的测量反馈装置。

光栅尺位移传感器经常应用于机床与现在加工中心以及测量仪器等方面,可用作直线位移或者角位移的检测。

其测量输出的信号为数字脉冲,具有检测范围大,检测精度高,响应速度快的特点。

例如,在数控机床中常用于对刀具和工件的坐标进行检测,来观察和跟踪走刀误差,以起到一个补偿刀具的运动误差的作用。

在这里需要说明的是,光栅尺只是一个反馈装置,它可以将位移量和位移方向通过脉冲信号输出的方式反馈出来,但它不能直接显示出来,它还需要一个显示装置,比如通过CPLD来识别,或者本文中的微控制器STM32103F来识别。

光栅尺的输出信号为相位角相差90°的两路方波信号,如果A路超前B路90°,表示光栅尺在正向移动,反之,A路落后B路90°,表示反向移动。

光栅尺的工作原理与应用

光栅尺的工作原理与应用

光栅尺的工作原理与应用1. 引言光栅尺是一种精密测量装置,广泛应用于工业生产和科学研究领域。

它利用光栅的原理实现对物体长度、位移等参数的测量,具有高精度和稳定性的特点。

本文将介绍光栅尺的工作原理及其在各领域的应用。

2. 光栅尺的工作原理光栅尺的工作原理基于光栅的干涉效应。

光栅是一种由周期性刻线构成的透明介质,其周期性刻线可以分为等距离刻线和等宽刻线两种类型。

2.1 等距离刻线光栅等距离刻线光栅是指刻线之间的间距相等,常见的有光栅尺和光栅编码器。

当光线通过等距离刻线光栅时,会产生干涉现象,形成明暗相间的光斑。

根据干涉测量原理,通过测量光斑的位置变化,可以计算出位置或位移的变化量。

2.2 等宽刻线光栅等宽刻线光栅是指刻线的宽度相等,常见的有光栅光谱仪和波长选择器。

当光线通过等宽刻线光栅时,会发生光的衍射现象,使不同波长的光产生不同的角度偏转。

通过测量光的偏转角度,可以确定光的波长。

3. 光栅尺的应用领域光栅尺作为一种高精度测量装置,被广泛应用于各个领域。

3.1 机械制造在机械制造领域,光栅尺主要用于数控机床、加工中心、测量仪器等设备中,用于测量机械零件的运动轨迹、定位精度等。

光栅尺具有高精度和稳定性的特点,可以实现对机械装置的精确控制。

3.2 科学研究在科学研究领域,光栅尺常用于物理实验中,用于测量光源的波长、光栅的周期等参数。

通过精确测量光的性质,可以探索光的基本原理和性质,为科学研究提供重要的参考数据。

3.3 光学仪器光栅尺也广泛应用于各类光学仪器中。

例如光学显微镜、激光材料加工设备等。

光栅尺可以实现对光学仪器的校准,保证其测量结果的准确性。

3.4 制造业在制造业中,光栅尺被用于多轴运动控制、自动化设备、机器人等领域。

通过集成光栅尺系统,可以实现对复杂物体的测量、定位、控制等功能,提高生产效率和产品质量。

4. 光栅尺的特点与优势光栅尺相比传统的测量方法具有以下特点和优势:•高精度:光栅尺可以实现亚微米级的测量精度。

STM32定时器配置为编码器模式(转)

STM32定时器配置为编码器模式(转)

STM32定时器配置为编码器模式(转)⽂章⽬录⼀、编码器原理⼆、为什么要⽤编码器三、STM32编码器配置相关四、STM32实战代码五、⼀些注意参考⼀、编码器原理如果两个信号相位差为90度,则这两个信号称为正交。

由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断⽅向、根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前⾏⾛的距离、如果再加上定时器的话还可以计算出速度。

⼆、为什么要⽤编码器从上图可以看出,由于TI,T2⼀前⼀后有个90度的相位差,所以当出现这个相位差时就表⽰轮⼦旋转了⼀个⾓度。

但有⼈会问了:既然都是脉冲,为什么不⽤普通IO中断?实际上如果是轮⼦⼀直正常旋转当然没有问题。

仔细观察上图,如果出现了⽑刺呢?这就是需要我们在软件中编写算法进⾏改正。

于是,我们就会想到如果有个硬件能够处理这种情况那不是挺好吗?对应的硬件的编码器就来了~我们看到STM32的硬件编码器还是很智能的,当T1,T2脉冲是连续产⽣的时候计数器加⼀或减⼀⼀次,⽽当某个接⼝产⽣了⽑刺或抖动,则计数器计数不变,也就是说该接⼝能够容许抖动。

在STM32中,编码器使⽤的是定时器接⼝,通过数据⼿册可知,定时器1,2,3,4,5和8有编码器的功能,⽽其他没有。

同时只有CH1和CH2是进⾏编码器模式的~三、STM32编码器配置相关编码器输⼊信号TI1,TI2经过输⼊滤波,边沿检测产⽣TI1FP1,TI2FP2接到编码器模块,通过配置编码器的⼯作模式,即可以对编码器进⾏正向/反向计数。

⽐如如果⽤的是定时器2,则对应的引脚是在PA0和PA1上。

通常为了提⾼精度我们会选择在上升沿和下降沿都进⾏计数!还有⼀个⾮常重要的图这⾥也记录下其中让⼈费解的应该是在第⼆列的相对信号的电平,这⾥就来详细谈⼀下吧。

其实也不难理解哈,我们上⾯也说了通常为了提⾼精度会在A、B两相的上升沿和下降沿都进⾏计数,那么对应在⼀个周期就可以计数四次,计数次数的增加也就意味着精度的提⾼!编码器模式下,如果此时处于正转,那么这四次计数应该都是加的。

stm32编码器测速

stm32编码器测速

stm32编码器测速摘要:编码器是⼀种将⾓位移或者⾓速度转换成⼀串电数字脉冲的旋转式传感器。

编码器⼜分为光电编码器和霍尔编码器。

霍尔编码器是有霍尔码盘和霍尔元件组成。

霍尔码盘是在⼀定直径的圆板上等分的布置有不同的磁极。

霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若⼲脉冲信号,为判断转向,⼀般输出两组存在⼀定相位差的⽅波信号。

采集数据⽅式:第⼀种软件技术直接采⽤外部中断进⾏采集,根据AB相位差的不同可以判断正负。

第⼆种硬件技术直接使⽤定时器的编码器模式。

这⾥采⽤第⼆种。

也是⼤家常说的四倍频,提⾼测量精度的⽅法。

其实就是把AB相的上升沿和下降沿都采集⽽已,所以1变4。

⾃⼰使⽤外部中断⽅式实现就⽐较占⽤资源了,所以不建议使⽤。

速度计算⽅法:真实的物理转速:电机转动⼀圈的脉冲数:num1 单位:个单位时间:t 单位:秒单位时间内捕获的脉冲变化数:num2 单位:个(反应电机正反转)电机轮⼦半径:r 单位:m圆周率:pi 单位:⽆速度:speed 单位: mm/s因为半径⽤的是m为单位,速度为mm所以需要乘以1000。

代码:(使⽤TIM2和TIM4两个定时器来测两个轮⼦的速度)将编码器AB相使⽤的引脚设置成定时器的编码器模式,我们根据TIMx->CNT寄存器数据的变化,计算出单位时间内,脉冲的变化值。

然后在定时器中断服务函数中进⾏速度计算。

#include "encoder.h"/**************************************************************************函数功能:把TIM2初始化为编码器接⼝模式⼊⼝参数:⽆返回值:⽆**************************************************************************/void Encoder_Init_TIM2(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端⼝时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOATIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //预分频器TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器⾃动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使⽤编码器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM2,0);//===============================================TIM2->CNT = 0x7fff;//===============================================TIM_Cmd(TIM2, ENABLE);}/**************************************************************************函数功能:把TIM4初始化为编码器接⼝模式⼊⼝参数:⽆返回值:⽆**************************************************************************/void Encoder_Init_TIM4(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端⼝时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器⾃动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使⽤编码器模式3 TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM4,0);//===============================================TIM4->CNT = 0x7fff;//===============================================TIM_Cmd(TIM4, ENABLE);}/**************************************************************************函数功能:读取编码器脉冲差值,读取单位时间内的脉冲变化值⼊⼝参数:TIM_TypeDef * TIMx返回值:⽆**************************************************************************/s16 getTIMx_DetaCnt(TIM_TypeDef * TIMx){s16 cnt;cnt = TIMx->CNT-0x7fff;TIMx->CNT = 0x7fff;return cnt;}/**************************************************************************函数功能:计算左右轮速⼊⼝参数:int *leftSpeed,int *rightSpeed返回值:⽆//计算左右车轮线速度,正向速度为正值,反向速度为负值,速度为乘以1000之后的速度 mm/s//⼀定时间内的编码器变化值*转化率(转化为直线上的距离m)*200s(5ms计算⼀次)得到 m/s *1000转化为int数据⼀圈的脉冲数:左:1560右:1560轮⼦半径:0.03m轮⼦周长:2*pi*r⼀个脉冲的距离:左:0.000120830m右:0.000120830m速度分辨率:左: 0.0240m/s右: 0.0240m/s200 5ms的倒数1000 扩⼤分辨率**************************************************************************/void Get_Motor_Speed(int *leftSpeed,int *rightSpeed){//5ms测速 5ms即这⾥说的单位时间*leftSpeed = getTIMx_DetaCnt(TIM4)*1000*200*0.000120830;*rightSpeed = getTIMx_DetaCnt(TIM2)*1000*200*0.000120830;}main.c#include "sys.h"//====================⾃⼰加⼊的头⽂件===============================#include "delay.h"#include "led.h"#include "encoder.h"#include "usart3.h"#include "timer.h"#include <stdio.h>//===================================================================int leftSpeedNow =0;int rightSpeedNow =0;int main(void){GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁⽤JTAG 启⽤ SWDMY_NVIC_PriorityGroupConfig(2); //=====设置中断分组delay_init(); //=====延时函数初始化LED_Init(); //=====LED初始化程序灯usart3_init(9600); //=====串⼝3初始化蓝⽛发送调试信息Encoder_Init_TIM2(); //=====初始化编码器1接⼝Encoder_Init_TIM4(); //=====初始化编码器2接⼝TIM3_Int_Init(50-1,7200-1); //=====定时器初始化 5ms⼀次中断while(1){printf("L=%d,R=%d\r\n",leftSpeedNow,rightSpeedNow);delay_ms(15);}}//5ms 定时器中断服务函数void TIM3_IRQHandler(void) //TIM3中断{if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否:TIM 中断源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源Get_Motor_Speed(&leftSpeedNow,&rightSpeedNow);Led_Flash(100);}}。

stm32 读取光栅尺jcxe5 例程

stm32 读取光栅尺jcxe5 例程

stm32 读取光栅尺jcxe5 例程光栅尺是一种常见的测量装置,广泛应用于机床、数控系统等工业领域。

它利用光电效应原理,通过光栅尺上的光栅条与读取头产生的光电信号,来实现对位置的测量。

而STM32单片机是一种基于ARM Cortex-M内核的微控制器,具有高性能、低功耗等特点,广泛应用于嵌入式系统开发。

要实现STM32读取光栅尺JCXE5的功能,首先需要连接好光栅尺与STM32单片机。

光栅尺通常有A、B两个信号输出端口,分别对应光栅条的两个相位。

将光栅尺的A相和B相分别连接到STM32的两个IO口。

接下来,我们需要配置STM32的GPIO口为输入模式,并使能外部中断功能。

在STM32的主函数中,我们可以通过编写中断服务函数来读取光栅尺的信号。

当光栅尺的A相或B相发生变化时,就会触发对应的外部中断。

在中断服务函数中,我们可以读取IO口的电平状态,从而获取到光栅尺的位置信息。

为了提高读取的精度,我们可以使用定时器来测量光栅尺的周期。

通过配置STM32的定时器,我们可以定时检测光栅尺的信号,并计算出光栅条的周期。

进一步,我们可以通过周期来计算出光栅尺的位置。

在实际应用中,为了提高系统的稳定性和可靠性,我们还可以添加一些附加功能。

例如,可以设置阈值来判断光栅尺的位置是否超过了设定范围,以及添加校准功能来修正光栅尺的误差等。

总结起来,本文介绍了如何使用STM32单片机读取光栅尺JCXE5的方法和实现过程。

通过连接光栅尺与STM32的IO口,并配置相应的中断和定时器,我们可以实现对光栅尺的位置信息的读取。

这为各种需要测量位置的应用提供了一种简单而有效的解决方案。

希望本文对读者在使用STM32读取光栅尺JCXE5时提供一些帮助。

基于STM32单片机的新型滚动尺

基于STM32单片机的新型滚动尺

基于STM32单片机的新型滚动尺作者:张其睿韦伟豪刘宣成来源:《新校园·上旬刊》2015年第05期摘要:为解决传统直尺量程小、功能单一、携带麻烦等问题,文章设计了一种以STM32单片机为核心,使用增量式光电编码器采集数据并通过OLED显示屏实时显示和语音播报测量结果的新型滚动尺。

该滚动尺具有量程大、精度高、使用方便等特点,不仅可以测量直线的距离,还可以测量曲线、曲面的距离。

关键词:滚动尺;增量式光电编码器;STM32单片机传统的尺子主要有游标卡尺、钢尺、卷尺等,量程一般在10米左右,只能测量直线距离,功能单一,体积略大。

针对传统尺子的局限性,文中设计了一种基于STM32单片机的新型滚动尺,该滚动尺具有量程大、精度高、使用方便等特点,不仅可以测量直线距离,还可以测量曲线、曲面的距离,测量时通过OLED显示屏实时显示测量数据,测量完毕后能够语音播报测量结果,有效地解决了传统直尺的量程小,功能单一,携带麻烦等缺点。

滚动尺主要由滚动小轮、增量式编码器、STM32单片机、按键、OLED显示屏以及语音播报模块组成。

其中,增量式编码器负责将滚动小轮的圆周运动转换成脉冲输出给单片机,STM32单片机是滚动尺的核心,负责处理各项数据和任务,OLED显示屏负责实时显示测量结果,语音模块部分负责将测量结果通过语音播放出来,而按键模块则负责测量单位转换、数据锁定或清零等操作。

滚动尺组成示意图如图1所示。

图1 滚动尺组成示意图一、测距原理滚动尺的测距原理为:当用手拖动滚动尺时,滚动小轮做圆周运动并带动编码器,编码器将圆周运动转化成数字脉冲信号输出,单片机对编码器输出的脉冲进行捕获并计数,结合滚动小轮的直径以及编码器的分辨率,就可以测算出滚动小轮所走过的距离,从而计算出距离。

当滚动小轮的周长为51.2mm,编码器的分辨率为512线时,如果滚动小轮带动编码器旋转一周,则滚动小轮走过的距离为51.2mm,编码器输出512个脉冲,此时一个脉冲就对应0.1mm的长度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32编码器在光栅尺测速场合的实际应用
摘要:stm32103f系列微控制器的定时器有一种特有工作模式——编码器接口模式,此模式可以用来反馈马达的实时转子位置,测量马达的转速,也可以反馈光栅尺的实时位置,测量光栅头的移动速度,在工业控制场合,尤其是需要精确定位的压机、机床等使用场合,有着非常实用的价值。

现以stm32103f微控制器与海德汉(heidenhain)光栅尺ls1378c为例,详细介绍定时器的编码器工作原理,以及双定时器配合测速度的编程算法。

关键词:stm32编码器;光栅尺;测速
stm32103f系列是st公司采用高性能的32位arm cortex-m3内核,主要面向工业控制领域推出的微控制器芯片。

通用定时器有以下几种工作模式:计数器模式、输入捕获模式、输出比较模式、pwm 模式、单脉冲模式、编码器接口模式。

其中,编码器接口模式是一种有别于其他通用arm控制器以及dsp控制器的特有模式,此模式可以用来反馈马达的实时转子位置,测量马达的转速,也可以反馈光栅尺的实时位置,测量光栅头的移动速度,在工业控制场合,尤其是需要精确定位的压机、机床等使用场合,有着非常实用的价值。

光栅尺位移传感器(简称光栅尺),是利用光栅的光学原理工作的测量反馈装置。

光栅尺位移传感器经常应用于机床与现在加工中心以及测量仪器等方面,可用作直线位移或者角位移的检测。

其测量输出的信号为数字脉冲,具有检测范围大,检测精度高,响应速度快的特点。

例如,在数控机床中常用于对刀具和工件的坐标进行
检测,来观察和跟踪走刀误差,以起到一个补偿刀具的运动误差的作用。

在这里需要说明的是,光栅尺只是一个反馈装置,它可以将位移量和位移方向通过脉冲信号输出的方式反馈出来,但它不能直接显示出来,它还需要一个显示装置,比如通过cpld来识别,或者本文中的微控制器stm32103f来识别。

光栅尺的输出信号为相位角相差90°的两路方波信号,如果a路超前b路90°,表示光栅尺在正向移动,反之,a路落后b路90°,表示反向移动。

这两路方波信号都为差分信号,需要经过差分输入芯片,比如ti的mc3486,转化为ttl电平的方波之后,才能进定时器的输入引脚。

此例中接入的是tim3-ch1和tim3-ch2两个引脚。

海德汉ls1378c为增量式直线光栅尺,量程220mm,信号周期1um,即一个方波对应1um,经后续电子设备进行4分频之后测量步距为0.25um。

直观来说,stm32103f识别到一个周期的方波脉冲,计数器增长4次,表示光栅尺移动了1um。

此例中,定时器timer3配置成编码器接口模式,提供传感器当前实时位置的信息。

另外再开一个定时器timer2,配置成10ms的定时工作模式,读取10ms之内的位置之差,即可获得动态的信息,比如速度、加速度。

这个算法思想的前提,也就是本文讨论的核心,是10ms内定时器3计数器不溢出,因为定时器为16位,最大可计数的范围为65535,如何保证10ms内实际增长的计数不超过这一最大值呢?我
们通过计算来说明,比如已知光栅尺连接的机械运动部件的最大速度不可能超过1m/s,那么10ms内走的位移量为10mm,
10mm/0.25um=40000次计数,40000小于65536,所以这一算法的前提成立。

如果运动部件的实际运动速度可能更快,那么把10ms定位改为5ms即可,以此类推,但定时间隔不可无限制缩小,以免加重cpu负荷。

首先,初始化定时器timer3为编码器模式,同时在ti1和ti2
边沿计数,pa口的6脚和7脚设置为浮空输入,用来连接编码器输入信号,定时器3计数周期period设置为65535,预分频数设置为零(不分频)。

接着,timer2配置为10ms的定时,计数周期period设置为2000,预分频数设置为360,向下计数模式。

下面是编码器读取方法,在每次10ms定时调用此段:
#define max_count 30000//10ms内不可能超过的计数器最大值#define encoder_tim_period 65535//定时器的period值,最好比max_count要大
int16_t speed_max = 0; // 全局变量,统计瞬时速度最大值,需要在每次重新测量之前清零
int32_t currentcount = 0; // 全局变量,计数器实时值,有正负,总量程220mm对应88万个计数,1um对应4个计数currentcount除以4000,即为光栅尺当前位置,单位为mm;speed_max为最大瞬时速度,单位为mm/s。

结束语
在实际的项目使用中,如果光栅尺移动速度过快,超过了硬件反应速度,可能导致脉冲丢失,显示出一个错误的位移量,这种错误是不可接受的。

为了避免超过光栅尺及硬件电路的极限处理能力,我们通过试验测出这一极限速度,并告知用户,用户可采用其他机械辅助的方法限制运动速度,在极限速度与生产效率之间找到一个合适的平衡点,使光栅尺工作在正常状态。

如果实际生产中的最大瞬时移动速度超过这一限制,将发出报警以示提醒。

参考文献
[1]嵌入式系统及其应用-基于cortex-m3内核和stm32f103微控制器的系统设计与开发[m].上海:同济大学出版社,2011,5.。

相关文档
最新文档