正交编码器

使用位置积分器跟踪编码器的位置;根据旋转轴的方向增加/减少;选择2X模式或4X模式;使用内置计时器来捕捉速度;速度比较功能,当捕获速度小于比较速度时产生中断;使用32位寄存器来保存位置和速度; 3个位置比较寄存器产生中断;决议计数的索引计数器; index比较寄存器以产生中断;结合索引和位置中断生成整个移位或局部旋转位移中断;带可编程编码器输入信号延迟的数字滤波可以接收解码的输入信号(时钟和方向);连接到APB。以下是OK调试代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; // PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,& amp; GPIO_InitStructure); / *启用TIM3更新中断* / / * NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(& amp; NVIC_InitStructure); * / / *编码器模式下的定时器配置* / TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //没有预定标TIM_TimeBaseStructure.TIM_Period = 10000; TIM_TimeBase Structure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM8,& amp; TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM8,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_ICStructInit(& amp; TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 6; // ICx_FILTER; TIM_ICInit(TIM8,& amp; TIM_ICInitStructure); //清除所有挂起的中断TIM_ClearFlag(TIM8,TIM_FLAG_Update); TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE); //复位计数器TIM2-& GT; CNT = 0; TIM_Cmd(TIM8,ENABLE);} n_Counter = TIM_GetCounter(TIM8); Diled_Disp_Num((浮点)n_Counter);另一个值得注意的问题是STM32定时器是16位,这意味着它只能计数到65535.有两种方法,一种是使用链路用两个定时器将16位扩展到32位,有一种简单的方法打开定时器溢出中断,更换每个中断表格编码器以特定角度运行。
例如,编码器为400行,ARR寄存器设置为400,每次代表电机时中断中断一次,依此类推。此外,输入脉冲的检测实际上类似,但STM32具体由外部触发模块实现。
如图1中的紫色框所示,应在此模块上升级编码器模块。以下配置代码为:void TIM3_ETR_GetDropCounts_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // test PA0 TIM8_ETR GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,& amp; GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,& amp; TIM_TimeBaseStructure); //时基配置TIM_ETRCloc​​kMode2Config(TIM3,TIM_ExtTRGPSC_OFF,TIM_ ExtTRGPolarity_NonInverted,0); TIM_SetCounter(TIM3,0); TIM_Cmd(TIM3,ENABLE);正交编码器用于检测旋转运动系统的位置和速度。
正交编码器可实现各种电机控制应用的闭环控制,如开关磁阻(SR)电机和交流感应电机(ACIM)。典型的增量编码器包括放置在电动机驱动轴上的开槽轮和用于检测车轮上的槽的发射器/检测器模块。
通常,有三个输出,A相,B相和索引(INDEX),并且所提供的信息可以被解码以提供关于电机轴的运动信息,包括距离和方向。 A相(QEA)和B相(QEB)的两个阶段之间的关系是独特的。
如果A相超前B相,那么电动机的旋转方向被认为是正的。如果A相位于B相后面,那么认为电动机的旋转方向是相反的。
第三个通道称为索引脉冲,每转产生一个脉冲,并用作确定绝对位置的参考。由编码器产生的正交信号可以具有四种不同的状态(00,01,10,11)。
请注意,当旋转方向改变时,这些状态的顺序颠倒(11,10,11,00)。正交解码器捕获相位信号和索引脉冲,并将信息转换为位置脉冲的数字计数值。
通常,当驱动轴沿一个方向旋转时,计数值将计数;当驱动轴向另一个方向旋转时,它将倒计时。选择“x4”测量模式,QEI逻辑在A相和B相输入信号的上升沿和下降沿计数位置计数器,为确定编码器位置提供更准确的数据(更多位置计数)。
微信二维码

电话:0755-29796190

邮箱:tao@jepsun.com

联系人:汤经理 13316946190

联系人:陆经理 18038104190

联系人:李经理 18923485199

联系人:肖经理 13392851499

QQ:2065372476

地址:深圳市宝安区翻身路富源大厦1栋7楼

TOP