STM32读取编码器数据(STM32-1)

2023-11-09

编码器(encoder)是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。按照外形可以分为实心轴和空心轴;按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。

增量型:就是每转过单位的角度就发出一个脉冲信号(也有发正余弦信号,然后对其进行细分,斩波出频率更高的脉冲),通常为A相、B相、Z相输出,A相、B相为相互延迟1/4周期的脉冲输出,根据延迟关系可以区别正反转,而且通过取A相、B相的上升和下降沿可以进行24倍频;Z相为单圈脉冲,即每圈发出一个脉冲。

绝对值型:就是对应一圈,每个基准的角度发出一个唯一与该角度对应二进制的数值,通过外部记圈器件可以进行多个位置的记录和测量。

信号输出有正弦波(电流或电压),方波(TTLHTL),集电极开路(PNPNPN),推拉式多种形式,其中TTL为长线差分驱动(对称A,A-;B,B-;Z,Z-,HTL也称推拉式、推挽式输出,编码器的信号接收设备接口应与编码器对应。

如单相联接,用于单方向计数,单方向测速。

A.B两相联接,用于正反向计数、判断正反向和测速。

ABZ三相联接,用于带参考位修正的位置测量。

AA-,BB-,ZZ-连接,由于带有对称负信号的连接,电流对于电缆贡献的电磁场为0,衰减最小,抗干扰最佳,可传输较远的距离。

这里使用的编码器为K22增量型编码器,分辨率为1600,即编码器转动一圈输出1600个周期信号。编码器采用TTL信号输出,编码器具有AA-,BB-,ZZ-,但是这里只使用AB俩相。输出方式如下。

 

编码器接线

编码器A相接单片机的TIM2_CH1,对应接口为PA0,编码器A相接单片机的TIM2_CH2,对应接口为PA1,如下图所示。

四倍频:通过观察A、B相的输出,两相位差90°,可以实现四倍频,从而将分辨率从1600提高到6400。

 

 

实现部分的关键代码如下:

void Encoder_Init_TIM5(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 

  TIM_ICInitTypeDef TIM_ICInitStructure; 

  GPIO_InitTypeDef GPIO_InitStructure;

      

//Enable timer 5 clock //使能定时器5的时钟

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

       //Enable pA port clock //使能PA端口时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

      

       //Port configuration, PA0, PA1 //端口配置,PA0、PA1

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;   

       //Float input //浮空输入

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

       //Initialize GPIOA with the specified parameters //根据设定参数初始化GPIOA

  GPIO_Init(GPIOA, &GPIO_InitStructure);                                    

 

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

       //Set up the pre-divider //设置预分频器

  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;

       //Set the counter to automatically reload //设定计数器自动重装值

  TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD;

       //Select the clock frequency division: no frequency //选择时钟分频:不分频

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

       //Up counting mode //向上计数模式

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

       //Initialize timer 5//初始化定时器5

  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

      

       //Use encoder mode 3 //使用编码器模式3

  TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

      

       //Fill in each parameter in the TIM_ICInitStruct with the default value

       //把TIM_ICInitStruct 中的每一个参数按缺省值填入

  TIM_ICStructInit(&TIM_ICInitStructure);

       //Set the filter length //设置滤波器长度

  TIM_ICInitStructure.TIM_ICFilter = 10;

       //Initialize the peripheral TIMX based on the parameter TIM_ICINITSTRUCT //根据 TIM_ICInitStruct 的参数初始化外设     TIMx    

  TIM_ICInit(TIM5, &TIM_ICInitStructure);

  //Clear the update bit for Tim //清除TIM的更新标志位

  TIM_ClearFlag(TIM5, TIM_FLAG_Update);

       //Enable the timer to interrupt //使能定时器中断

  TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);

       //Reset the timer count //重置定时器计数

  TIM_SetCounter(TIM5,0);

       //Enable timer 5 //使能定时器5

  TIM_Cmd(TIM5, ENABLE);

}

//定时器5中断服务程序      

void TIM5_IRQHandler(void)

{                                                   

       if(TIM5->SR&0X0001) //Overflow interrupt //溢出中断

       {                                                                        

       }                            

       TIM5->SR&=~(1<<0); //Clear the interrupt flag bit //清除中断标志位      

}

int Read_Encoder(void)

{

   int Encoder_TIM;   

        Encoder_TIM= (short)TIM5 -> CNT;

        return Encoder_TIM;

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32读取编码器数据(STM32-1) 的相关文章

随机推荐

  • Android 13 媒体权限适配指南

    在 Android 系统最近的几个大版本里 更新方向有很大一部分都集中在了隐私安全这一方面 每个版本都会新增隐私安全限制 或者是对之前的隐私项进行进一步的升级 Android 10 分区存储 限制访问不可重置的硬件标识符 限制对剪贴板数据的
  • uView1.0 indexList索引列表遇到的坑

    在使用uView索引列表做通讯录的时候遇到了几个问题 先上图片 问题1 右侧的abcd首字母按钮点击错乱 比如点了f 弹出显示的是a开头的人 应该是f开头的人才对 通过排查 发现传入这个右侧组件参数的时候 后端并没有返回完整的A Z 而是有
  • C++适配器模式

    适配器模式 1 适配器模式简介 适配器模式其实是实现了两个互不兼容的已有系统之间的桥梁效果 所以适配器模式可以说是为了实现功能的一种补救措施 最好的方式是将系统重构使用工厂模式即可 但是对已有系统的重构代价过大 所以一般情况下我们都会通过适
  • 日志语义异常检测

    日志记录了软件系统运行时的详细信息 系统开发与运维人员可以根据日志监控系统剖析系统的异常行为与错误 日志异常检测可以分为语义异常 执行结果 执行异常 执行日志序列 与性能异常 执行时间 1 日志异常类型 日志记录系统在某个时间点执行了某些操
  • 设计模式-适配器模式

    文章目录 前言 介绍 实例 使用场景 优缺点 前言 当我们需要使用一个已存在的类 但其接口不符合我们的需求时 适配器模式 Adapter Pattern 可以派上用场 适配器模式是一种结构型设计模式 它允许我们创建一个中间层 将一个类的接口
  • 自己制作证件照回执

    今天身份证过期 去办理身份证 照个像回执收了30 给个6张一寸小图片 照的还不好看 因此我觉得是不是可以自己弄个回执 照片也是浪费 没有什么用 于是自己摸索了教程 1 拍一张纯色背景正面照 按照证件要求拍 手机拍照片尽量清晰 最好是相机那种
  • ReadProcessMemory Types of actual and formal var parameters must be identical

    转自 https www cnblogs com cb168 p 5884673 html delphi XE Berlin ReadProcessMemory WriteProcessMemory delphi XE Berlin dcc
  • 变长参数表va_list,模板template,打造通用函数

    假设我想写一个支持变长参数的max函数 template
  • 还在找数据库日期如何格式化嘛?看这一篇文章就够了

    目录 1 MySQL数据库 2 PostgreSQL Oracle 人大金仓 1 MySQL数据库 DATE FORMAT 函数 示例 SELECT DATE FORMAT NOW Y m d H i S 食用方法如下 DATE FORMA
  • vue中nextTick使用引起的一个小问题

    问题描述 两个页面之间进行快速切换会报错元素找不到 问题原因 该方法的调用是在nextTick中 也就是放在微任务队列中 当切换到该页面后主任务开始执行 主任务执行完成后 更新dom元素 然后才是下一个tick 然后快速切出该页面 组件销毁
  • 量产国产服务器cpu芯片,中国第一!百度自研芯片量产:配国产CPU

    目前 三星电子与百度联合宣布 昆仑芯片已经完成所有研发工作 将在明年初投入规模量产 采用三星14nm工艺 这也是两家巨头的第一次代工合作 2018年7月份 百度发布了自主研发的中国首款云端AI全功能AI芯片 昆仑 号称业内设计算力最高的AI
  • 单片机没有串口,你会如何打印调试信息?

    摘要 输出调试信息是软件开发中必不可少的调试利器 在出现bug时如果没有调试信息将会是一件令人头痛的事 本文主要介绍在嵌入式开发中用来输出log的方法 这些方法都是在实际开发过程中使用过的 嵌入式开发的一个特点是很多时候没有操作系统 或者没
  • 【CVE-2021-3156】linux sudo提权复现及补丁修复

    前言 今天安全圈都在刷屏 CVE 2021 3156 这个漏洞 由于这是一个缓冲区溢出漏洞 通用性比较强 因此也跟风实验一下 详细复现及修复过程如下 一 实验环境 操作系统 kali linux 2020 1b 1 adduser命令新建一
  • 【深度学习】生成对抗网络

    下文以图片作为数据举例介绍 生成网络 生成器 gt 以假乱真 生成网络的职责是把随机点模仿成与真实数据集相似的图片 这些随机点是从一个潜在空间中随机抽取的 它可以看作一个实现 点对点变换 的映射 而真实图像在图像空间中的分布十分复杂 简单的
  • 破解windows7系统密码

    theme smartblue 一 利用5次shift漏洞破解win7密码 1 1 漏洞 1 在未登录系统时 连续按5次shift键 弹出程序c windows system32 sethc exe 2 部分win7及win10系统在未进入
  • MAX232无RS232电平信号输出、MAX232/3232硬件设计电路、电荷泵电容、max3221电路

    调试MAX3221芯片过程中 经测试 电路的单片机的uart可以正常收发数据 可无论单片机怎么发送数据 max3221都没有输出RS232电平的信号 看了论坛上的留言 正常的RS232电路中 芯片 V V 引脚电压应该为一倍多将近两倍的Vc
  • 银行家算法例题

    银行家算法 Banker s Algorithm 是一个避免死锁 Deadlock 的著名算法 是由艾兹格 迪杰斯特拉在1965年为T H E系统设计的一种避免死锁产生的算法 它以银行借贷系统的分配策略为基础 判断并保证系统的安全运行 目录
  • 【PTA】乙级 前世档案

    前世档案 C语言 题干 大致思路 题干 大致思路 n个问题 m个玩家 所以共有2的次方种结果 对应第一个图中的树状图 先考虑一个玩家的回答 用s统计最后结果的序号 先让结果数num除以2 如果为y 则不做处理 如果为n 则令s num 依次
  • short s1 = 1;s1 =s1+1;有错而short s1 = 1; s1+=1正确,为何?

    s1 s1 1和s1 1是有区别的 s1 s1 1会错因为s1是short 而1是int 所以运算时会自动转换为int 再将int赋值给s1是需要强制转换 所以会错 JAVA规范上说e1 e2 实际上是 e1 T1 e1 e2 其中T1是e
  • STM32读取编码器数据(STM32-1)

    编码器 encoder 是将信号或数据进行编制 转换为可用以通讯 传输和存储的信号形式的设备 按照外形可以分为实心轴和空心轴 按照工作原理编码器可分为增量式和绝对式两类 增量式编码器是将位移转换成周期性的电信号 再把这个电信号转变成计数脉冲