【嵌入式】STM32计时器编码器接口模式使用

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


前言

使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。

硬件:
STM32F103C8T6
光栅测距传感器


一、编码器接口模式介绍

编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信号进行输入捕获,检测脉冲信号的上升沿和下降沿并进行计数,通过计数值获得增量式编码器当前指示的角度或位移。
编码器输出的脉冲信号通常有A+/A-、B+/B-、Z+/Z-三组差分信号,其中A和B信号的跳变次数为传感器增量值A与B信号的相位差表征编码器数值上升或下降(位移的正反向,电机的正反转等)Z信号在每个编码周期产生一次脉冲,通常表示编码器计数圈数或电机机械零点
编码器输出信号可通过RS422通信线进行传输(注意和422通信协议区分)。
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机
STM32的编码器接口模式专门为处理编码器的输出信号设计,将传感器输出的信号A和信号B分别连接到计时器输入捕获通道1和通道2,通过检测A、B信号的电平跳变进行计数,并通过判断电平跳变时另一信号的电平状态自动确定向上计数或向下计数(与相位判断结果相同),计数方向与编码器信号的关系如下图:
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机
上表中通道TI1和TI2分别与传编码器输出信号A、B连接,其可配置为仅在TI1跳变时计数仅在TI2跳变时计数在TI1和TI2跳变时均计数。下图展示了选择双边沿计数时的计数情况:
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机

二、固件库编程

使用STM32F103C8T6进行程序开发,使用通用定时器2。

1. 定时器输入通道GPIO配置

static void General_Timner_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(TIMER2_CH2_GPIO_RCC|TIMER2_CH1_GPIO_RCC, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;						// 推挽复用
	GPIO_InitStructure.GPIO_Pin = TIMER2_CH2_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(TIMER2_CH2_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = TIMER2_CH1_GPIO_PIN;
	GPIO_Init(TIMER2_CH1_GPIO_PORT, &GPIO_InitStructure);
}

2. 定时器配置

static void General_Timner_Mode_Config(void)
{
	RCC_APB1PeriphClockCmd(TIMER2_RCC, ENABLE); /* 开启TIM2时钟 72MHz*/

	// TIM2时基配置------------------------------------------------------------------------
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseInitStructure.TIM_Period = COUNTER_PERIOD;				// 计数周期,ARR自动重装载寄存器 65535
	TIM_TimeBaseInitStructure.TIM_Prescaler = COUNTER_PSC;				// 预分频器,对时钟源信号分频得到计数频率
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上计数
	TIM_TimeBaseInit(TIMER, &TIM_TimeBaseInitStructure);
		
	// TIM2输入通道配置--------------------------------------------------------------------
	// TIM2_ch1
	TIM_ICInitTypeDef  TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
	TIM_ICInitStructure.TIM_ICFilter = 5;								// 输入捕获滤波器
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;				// 1分频
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;		//通道直接连接
	TIM_ICInit(TIMER, &TIM_ICInitStructure);
	
	// TIM1_ch2
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInit(TIMER, &TIM_ICInitStructure);
	
	// 编码器模式配置	双边沿计数	电平不反相
	TIM_EncoderInterfaceConfig(TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	// 使能计数器
	TIM_Cmd(TIMER, ENABLE);
}

3. 注意事项

计数周期配置为65535,计数重装载寄存器为16位,因此最大计数值为65535,本例中该计数值已满足使用要求(测距范围较小),因此没有做溢出处理。计数初始值为0,由于计数值可能递减(光栅反向运动),递减后计数值向下溢出,可将计数值转化为16位有符号整数,此时大于32767的数据被视为负数(最高位为1),正负号可直接表示运动方向。例如在计数值为0时产生反向脉冲,此时计数值向下溢出,为0xFFFF,为-1的补码。

初始化时基时应配置计数器为向上计数(此时时基为编码器输出的信号),否则计数方向出错。

配置输入捕获滤波器时,参照用户手册的描述:
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机
图中CK_INT为定时器时钟,为总线时钟经分频后的时钟,此处为72MHz。DTS为定时器时钟再次分频后得到的数字滤波器时钟,由于此处分频系数为1,所以DTS也为72MHz。
当配置为5时,采样频率为72/2=36MHz,采样次数为8,当8次采样均为有效电平时才视为一次有效跳变,因此频率高于36/8=4.5MHz(有效电平持续时间低于1/4.5M=0.22us)的杂波将被滤除。查询光栅尺用户手册,其最小脉冲间隔为0.2微秒,即为5MHz,从而杂波被有效滤除。(滤波器错误配置将导致计数误差显著增加)
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机

三、硬件连接

所使用开发板为自制STM32F103最小系统板,其片上所有IO引脚已将引出。本实验采用定时器2的输入通道1、输入通道2的默认GPIO引脚,PA0、PA1。
光栅编码器采用RS422接口,输出A+/A-、B+/B-、Z+/Z-,3路差分信号,其中Z信号用于标记绝对零点和记录圈数,本实验只用到A、B两路差分信号。
将A+端口与单片机PA0连接、B+端口与单片机PA1连接,A-和B-均与单片机GND相连。
(线路连接之前先用示波器查看A、B端口是否正确输出脉冲信号)

四、实验

光栅编码器由检测头和光栅尺组成,检测头与光栅尺相对移动时,编码器产生脉冲信号,分辨率为1um。
光栅传感器:
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机
通过串口调试助手将计数器数值打印到电脑,并与光栅传感器自带上位机获取的数据进行实时对比,二者数据完全相同,证明了STM32读取编码器脉冲信号的有效性。
对比图(左侧为光栅自带上位机数据,右侧为STM32计数值):
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机
stm32f103c8t6单片机编码器模式,stm32,嵌入式硬件,单片机
另可使用vofa软件进行波形可视化。


总结

STM32的编码器接口模式配置简单、有效,准确度较高,后续可以对该数据进一步处理,与光栅传感器自带上位机相比,数据处理更加灵活、高效!文章来源地址https://www.toymoban.com/news/detail-828584.html

到了这里,关于【嵌入式】STM32计时器编码器接口模式使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32的定时器详解(嵌入式学习)

    想要了解STM32的时钟系统 点击这里跳转——》STM32的时钟系统(嵌入式学习) 建议先看看时钟树如何配置 点击这里跳转——》STM32的时钟树配置(嵌入式学习) 跳转——》STM32的时钟基础详解(嵌入式学习) 跳跳转——》STM32的时钟源详解(嵌入式学习) SysTick又称滴答定时

    2024年02月13日
    浏览(70)
  • 【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

     前言:定时器TIM的详细知识点见我的博文:11.TIM定时中断-CSDN博客 公式解释: ARR(TIM_Period):自动重装载值,是定时器溢出前的计数值 PSC(TIM_Prescaler):预分频值,是用来降低定时器时钟频率的参数 Tclk:定时器的输入时钟频率(单位Mhz),通常为系统时钟频率或者定时

    2024年02月03日
    浏览(60)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(47)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(87)
  • 【嵌入式】HC32F定时器PWM捕获+APC芯片实现模拟AD采样

    目录 一 项目背景 二 原理说明 三 设计实现——定时器初始化 四 设计实现——PWM捕获 五 梳理总结         目前使用了TI的ADC采样芯片 ADS1018实现模拟量4-20mA/0-20mA的采样 ,原理是 将外部输入的模拟量信号4-20mA,经由并联的两个100Ω电阻,转换为0.2-1V的电压信号传递到模数转

    2023年04月24日
    浏览(50)
  • stm32嵌入式实验考核

    STM32 实验考核题目 1. 利用 STM32 小板实现:控制外接 LED 灯每隔 3 秒钟亮暗变换,同 时在 PC 机上显示 MCU 的计时时间,MCU 的初始时间由 PC 机 方设置。 2. 利用 STM32 小板实现:利用导线外接 GPIO 口模拟 2 个按键输入, 根据输入组合的四种情况,分别控制三色灯四种流水灯效果

    2024年02月03日
    浏览(53)
  • STM32的时钟系统(嵌入式学习)

    时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此时钟对于计算机系统是至关重要的,通常时钟系

    2024年02月16日
    浏览(50)
  • 嵌入式——新建STM32工程(标准库)

    目录 一、初识标准库 1.CMSIS标准及库层级关系 2.库文件介绍 (1)Libraries文件夹 ①CMSIS文件夹 ②STM32F10x_Std_Periph_Driver文件夹 ③ 在用库建立一个完整的工程时,还需要添加stm32f10x_it.c、 stm32f10x_conf.h 和 system_stm32f10x.c文件 (2)Project文件夹 (3)Utilities文件夹 3.库各文件之间的关

    2024年01月23日
    浏览(59)
  • STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(69)
  • 嵌入式 STM32 通讯协议--MODBUS

    目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议  二、MODBUS通信协议 1、概述 2、MODBUS帧结构  协议描述 3、MODBUS数据模型   4、MODBUS事务处理的定义 5、MODBUS功能码  6、功能码定义   7、MODBUS数据链路层 8、MODBUS地址规则  9、MODBUS帧描述 10、MODBUS两种

    2024年02月11日
    浏览(66)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包