STM32编码器模式(带方向/正交编码)

这篇具有很好参考价值的文章主要介绍了STM32编码器模式(带方向/正交编码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 看前说明:这里重点介绍的时STM32的定时器编码器模式,是根据STMF10x参考手册,如果有使用过编码器或编码器不一样的可以直接跳过前面的编码器介绍,直接看理论分析与程序部分。

1、编码器介绍

STM32编码器模式(带方向/正交编码)

  • 这里需要注意的参数
  1. 输出脉冲线数:1024线:编码器每旋转一周输出的脉冲的个数,这个数据就是你在编写的定时器的重装载值
  • 两种编码器的区别
    • 从图中看就会来的更加直接:
      1. 带方向的编码器只有一路的脉冲输出,另外一路就是编码器的正反转的信号,零位信号就是编码器的机械零位。
        STM32编码器模式(带方向/正交编码)
  1. 正交编码器两路的脉冲输出,在判断电机的正反转时,是更加A、B两相的波形来的,其实就是看哪路波形超前,这里用32的定时器编码器功能就只需要去查计数器的方向位来判断电机的正反转。
    STM32编码器模式(带方向/正交编码)STM32编码器模式(带方向/正交编码)
  2. 引脚说明
    STM32编码器模式(带方向/正交编码)

2、脉冲计数对应电机速度的数据两种处理方式

(1) 定时器中断法,计算电机的圈数(过程小题大做,不推荐)

  • 前面提到了编码器的线数为1024线(编码器每转一周就会输出1024个脉冲),那么你的重装载值为(1024-1),当计数值达到1024就会发生溢出中断,也就是说识别到了脉冲数为1024个(编码器转了一圈)。每发生一次中断,就说明电机转了一圈

(1)脉冲计数法,直接根据单位时间内所采集到的脉冲数作为电机的转速(更加精准,推荐)

  • 编码器在实际的测数使用时确实是根据,电机转一圈:编码器转多少圈的方式来实际测量电机的转速的,但是在其本质就还是编码器的输出的脉冲数,所以直接计算编码器的单位时间的脉冲数推算电机的速度是一样的,数据来的更加直接、精准。

3、STM32定时器编码器模式理论分析

(1)定时器编码器模式选择

STM32编码器模式(带方向/正交编码)STM32编码器模式(带方向/正交编码)

  • 首先是定时器编码器模式的选择,其实就是选择在那一个通道计数,还是两个通道都要计数也就是这三种模式。
    • 对于带方向的就只有一路脉冲,所以选择其中一路通道就ok了。
    • 对于正交编码器而言有两路脉冲,所以就选择第三中方式,两路通道都计数。

(2)定时器编码器输入极性的选择

  • 看懂这张图才是,确定输入极性的关键所在:所谓极性就是选择在输入脉冲信号的上升沿计数还是下降沿计数。
    STM32编码器模式(带方向/正交编码)

(3)定时器编码器输入极性的寄存器配置

STM32编码器模式(带方向/正交编码)
STM32编码器模式(带方向/正交编码)文章来源地址https://www.toymoban.com/news/detail-423857.html

CC1S=01(TIMx_CCMR1寄存器,IC1FP1映射到TI1) 
CC2S=01(TIMx_CCMR1寄存器,IC2FP2映射到TI2) 
CC1P=0(TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1) 
CC2P=0(TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2) 
SMS=011(TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效). 
CEN=1(TIMx_CR1寄存器,计数器使能)
  • 这里解释一下
    • TIx 就相当于输入信号的 TIM4->CH1 TIM4->CH2;
    • TIxF 滤波后信号;
    • TIxFPx经过带极性选择的边缘检测器过后的产生的信号;
      STM32编码器模式(带方向/正交编码)

4、结合手册函数刨析库函数

(1)STM32定时器编码器模式的库函数配置代码

/*TIM2初始化为编码器接口*/
void Encoder_Init_TIM2(void)
{
	//结构体变量的创建
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
	TIM_ICInitTypeDef TIM_ICInitStructure;  
	GPIO_InitTypeDef GPIO_InitStructure;
	//RCC时钟使能
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器4的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口时钟
	
 	//编码器引脚的配置,对于定时器的通道管脚在用户手册上的==8.3.7定时器复用功能重映射==
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;	//端口选择
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);				//根据设定参数初始化GPIOA
	
	//定时器的基本配置,这里主要介绍定时器的编码器模式,不做过多解释
	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
	TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 
	TIM_TimeBaseStructure.TIM_Period = 0xffff; //设定计数器自动重装值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数  
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
	//编码器模式选择与配置
	//参数一TIMx:定时器的选择
	//参数二TIM_EncoderMode:编码器模式的选择
	//参数三TIM_IC1Polarity:通道一的极性选择
	//参数四TIM_IC2Polarity:通道二的极性选择
//具体配置->正交编码器:配置如下
	TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
//带方向的编码器配置如下->区别只在于带方向的编码器只有一个脉冲输入,而正交编码器有两个脉冲输入
	TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

	TIM_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 counter
	TIM_SetCounter(TIM2,0);
	TIM_Cmd(TIM2, ENABLE); 
} 

(2)刨析

  1. 转到void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)函数下可以看到如下代码:
/* Get the TIMx SMCR register value */
  tmpsmcr = TIMx->SMCR;
  
  /* Get the TIMx CCMR1 register value */
  tmpccmr1 = TIMx->CCMR1;
  
  /* Get the TIMx CCER register value */
  tmpccer = TIMx->CCER;
  • 再看下面来自用户手册中的截图,就不用我再继续挖下去了
    STM32编码器模式(带方向/正交编码)

5、编码器速度的读取

  • 前面已经说过了编码器的脉冲计数对应电机速度的数据处理方法,这里就继续说明了。
  • 速度是单位时间为前提的,我这里采用的是直接计算单位时间对应的脉冲数来推算电机的速度的。这里的单位时间也就是采样率的意思,就是我们间隔多少时间去采集然后清零脉冲计数值一次。这里的采样率不能太高,也不能太低。对电机的控制,一般采样率=5毫秒越小就越接近瞬时速度,为什么不能过小想必不用说大家也知道。所以这里就需要一个定时器来计算采样周期
//配置定时器1每5毫秒中断一次,在中断函数中读取编码器数值
void Time1_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStrure;
	NVIC_InitTypeDef NVIC_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	//定时器的基本配置
	TIM_TimeBaseStrure.TIM_Period = 1000-1;//计数的次数
	TIM_TimeBaseStrure.TIM_Prescaler = 7200-1;//控制频率72000000/7200=10000;频率=10000HZ
	TIM_TimeBaseStrure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStrure.TIM_ClockDivision = 0;
	TIM_TimeBaseStrure.TIM_RepetitionCounter = 0;//重复计数次数
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStrure);
	
	TIM_ClearITPendingBit(TIM1,TIM_IT_Update);//清空中断标志位
	TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_Trigger,ENABLE);//开启中断更新和触发中断源
	
	NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	TIM_Cmd(TIM1,ENABLE);
}
int Read_Encoder(void)
{
	int value_1;
	value_1=(int)TIM_GetCounter(TIM2);
	TIM_SetCounter(TIM2,0);
	return value_1;
}
void TIM1_UP_IRQHandler()
{
	int circle_count ;
	if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET)
	{
		circle_count = Read_Encoder();
		TIM_ClearITPendingBit(TIM1,TIM_IT_Update);//清空中断标志位
	}
}

到了这里,关于STM32编码器模式(带方向/正交编码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】【HAL库】定时器编码器模式测速

    目录 概述 HAL设置  定时器的编码器模式 定时器设置  常用函数 代码 电机AB相增量型编码器的介绍和解码方法在这里介绍过了 电机编码器 https://blog.csdn.net/m0_57585228/article/details/125791283 测速可以使用外部中断进行脉冲计数 很多型号的单片机中有专门的电路来计算脉冲的速度和

    2023年04月18日
    浏览(58)
  • 【嵌入式】STM32计时器编码器接口模式使用

    使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。 硬件: STM32F103C8T6 光栅测距传感器 编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信

    2024年02月20日
    浏览(49)
  • STM32定时器编码器模式实现直流有刷电机测速(HAL库)

    最近在做一个单片机大作业,要用到直流有刷,在这里把学习编码器的知识记录一下,学习参考资料: 正点原子DMF407电机控制专题教程_V1.0 我所使用的编码器是市面上常见的 磁电增量式编码器 ,其有AB两相,用于输出电机转动时的 脉冲数 ,AB两相的先后顺序决定了电机的

    2023年04月24日
    浏览(66)
  • 初出茅庐的小李博客之STM32CubeMx配置定时器的编码器模式

    上次文章写了编码器是如何工作的,今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。 话不多说,上教程! 选择外部高速时钟源HSE 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 选择编码器模式 分频值设置为2-1 计数值设

    2024年02月12日
    浏览(42)
  • stm32-编码器测速

    编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。 使用定时器

    2024年03月19日
    浏览(50)
  • STM32 TIM编码器接口

    单片机学习! 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时器框图 3.1 编

    2024年04月14日
    浏览(48)
  • STM32——TIM编码器接口

    Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲, 自动控制CNT自增或自减 ,从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通用定时器都拥有 1个编码器接口 ,C8T6拥有4个编码器接口 两个输入引脚

    2024年01月19日
    浏览(42)
  • stm32霍尔编码器电机测速原理

            本次选用的编码器电机为13线的霍尔编码器电机,电机减速比为30:1,转动一圈输出13*30=390个脉冲。轮胎直径为75mm,轮胎周长为pi*d=3*75=225mm.定时器采用四倍频计数,则一圈输出390*4=1560个脉冲。具体编码器知识这里就不多说了。          根据测速原理:假设编

    2024年02月15日
    浏览(50)
  • STM32 EC11 旋转编码器

    代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种。一种是转两格,A、B对C端输出一个完整脉冲(转一格就只是由低电平-高电平或由高电平-低电平);另一种就是转一格,A、B对C端输出一个完整脉冲。

    2024年02月02日
    浏览(41)
  • stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速。   编码器被广泛应用于电机测速,实现电机闭环控制 。所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速。         编码电机其实就是一个带有编码器的电机,我的这个电机是一个带霍尔传感器的

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包