增量式编码器计数的过零点处理问题

2023-05-16

在增量式编码器位置计数过程中,每经过一个计数溢出,根据运转方向,在update中断里我们会对圈数加1或者减1


  if ((TIMx->SR & TIM_FLAG_Update) == TIM_FLAG_Update)  
  {
    /* Clear the interrupt pending flag */
    TIM_ClearFlag(TIMx, TIM_FLAG_Update);

    /*record number of turns*/
    if ((TIMx->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)  
        {/* encoder timer down-counting*/
            pDVars_str->NbofTurns--;
        }
    else
        {/* encoder timer up-counting*/
            pDVars_str->NbofTurns++;
        }
  }  

这样,计算当前位置时,采用


position = (int32_t)(pDVars_str->NbofTurns) * (int32_t)(pDParams_str->hPulseNumber) + TIMx->CNT;  

但这样会存在一个问题,由于NbofTurns与CNT没有办法同时读取,也就是拍快照保存,这样会导致一个问题,溢出发生在取两个参与计算值中间,导致一个数据是溢出前采集,一个数据是溢出触发中断,经过中断处理后采集,这样就会使最终计算得到的位置信息恰好与实际值偏离出一个圈数的脉冲值。

改进思路是读取时关闭update中断,然后读取两个值


/*Disable update interrupts to have NbofTurns and CNT of the same period*/
    TIMx->DIER &= (uint16_t)~TIM_IT_Update; /* NB:Std libray not used for perf issues*/
    cnt = TIMx->CNT; 
    NbofTurns = pDVars_str->NbofTurns;
    TIMx->DIER |= TIM_IT_Update;   /* NB:Std libray not used for perf issue*/          

然而这样还是存在问题,中断响应虽然暂时关闭了,但CNT的计数为了不遗漏位置信息而不能关闭,还是会造成事实溢出。最终改进代码如下


        /*Disable update interrupts to have NbofTurns and CNT of the same period*/
    TIMx->DIER &= (uint16_t)~TIM_IT_Update; /* NB:Std libray not used for perf issues*/
    cnt = TIMx->CNT; 
    NbofTurns = pDVars_str->NbofTurns;
    if((TIMx->SR & TIM_FLAG_Update) == TIM_FLAG_Update)
    {
        if((TIMx->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)  
            {/* encoder timer down-counting*/
                if(cnt > (pDParams_str->hPulseNumber/2))
                {
                    NbofTurns--;
                }
            }
        else
            {/* encoder timer up-counting*/
                if(cnt < (pDParams_str->hPulseNumber/2))
                {
                    NbofTurns++;
                }
            }
    }        
    
    TIMx->DIER |= TIM_IT_Update;   /* NB:Std libray not used for perf issue*/

    position = (int32_t)(NbofTurns) * (int32_t)(pDParams_str->hPulseNumber) + cnt;  

 

在关闭中断确保NbofTurns处于快照状态,再判断一次读取到的CNT是否溢出,如溢出则做一次修正,确保两个数据都处于快照状态。

转载于:https://www.cnblogs.com/zhanghankui/p/6876762.html

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

增量式编码器计数的过零点处理问题 的相关文章

  • 微信支付报调用支付JSAPI缺少参数: sign

    检查后台返回参数中没有paySign字段 转载于 https www cnblogs com muou2125 p 11604456 html
  • Windows下使用命令打开远程桌面

    如果在Windows系统下找不到 远程桌面 入口 xff0c 可以使用命令方式打开 方法如下 xff1a 在命令提示符中输入如下命令 xff1a start mstsc exe 如果感觉每次都输入命令太麻烦 xff0c 可以新建一个bat批
  • 设置input 中placeholder的样式

    webkit input placeholder Chrome Opera Safari position relative top 4px moz placeholder Firefox 19 43 position relative t
  • 如何为Redis中list中的项设置过期时间

    问题 两种解决方法 有序集合 多个集合以及TTL Redis是一个伟大的工具 xff0c 用来在内存中存储列表是很合适的 不过 xff0c 如果你想要快速搜索列表 xff0c 同时需要让列表中每项都在一定时间后过期 xff0c 应该怎么做呢
  • Python 函数的 return 是否是必须的?

    Python 函数的 return 是否是必须的 xff1f return 表达式 语句用于退出函数 xff0c 选择性地向调用方返回一个表达式 不带参数值的return语句返回None 来看一段关于 return 的描述 xff1a re
  • Flutter 获取控件尺寸和位置

    1 插件必须渲染好 final RenderBox box 61 globalKey currentContext findRenderObject final size 61 box size final topLeftPosition
  • kepserver中文手册,kepserver使用教程,kepserver设置

    下面介绍一下KepServer模拟器的使用 xff0c 以下示例使用服务器随附的 Simulator 驱动程序来演示创建 配置和运行项目的过程 Simulator 驱动程序是基于内存的驱动程序 xff0c 能为演示提供静态数据和变化数据 1
  • 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA

    Here are 15 facts that EVERY GIRL should know about her vagina Don t be shy Your vagina is part of your body and it will
  • 生产者/消费者模式的理解及实现

    简介 生产者消费者模式并不是GOF提出的23种设计模式之一 xff0c 23种设计模式都是建立在面向对象的基础之上的 xff0c 但其实面向过程的编程中也有很多高效的编程模式 xff0c 生产者消费者模式便是其中之一 xff0c 它是我们编
  • ios如何翻外墙_华强北版本Airpods值得入手吗?如何避坑?

    和许多同行一样 xff0c 本该还是读书的年纪就来到华强北摸爬滚打 xff0c 已然过了78个年头 今天 xff0c 我们就来谈谈华强北版的Airpodspro是否值得入手以及入手如何避坑 对于华强北Airpods网上的评价褒贬不一 有的人
  • 《大数据时代》读书笔记

    大数据时代 英国人Viktor Mayer Schonberger的著作 最重要的一点是介绍了一种思维模式的变化 主要观点 xff1a 大数据是指获取全部数据样本 xff0c 分析全部数据 xff0c 而不是只做抽样分析 大数据分析更关注相
  • Spring中Bean管理的常用注解

    在Spring中 xff0c 主要用于管理bean的注解分为四大类 xff1a 1 用于创建对象 2 用于给对象的属性注入值 3 用于改变作用的范围 4 用于定义生命周期 这几个在开发中经常接触到 xff0c 也可以说每天都会遇见 其中创建
  • 解决Duplicate class xxx found in modules编译报错的问题

    如果在Android工程编译失败 xff0c 并出现如下错误 xff1a Duplicate class com mygroup mylib MyBean found in modules jetified baselib1 1 0 1 r
  • 课后作业3:个人项目(词频统计及其效能分析)

    1 个人信息 学号 xff1a 2017 7189姓名 xff1a 李博文码云地址 xff1a https gitee com libowena9 word frequency tree ES7189 2 程序分析 读取文件到缓冲区 def
  • IdentityServer4与ocelot实现认证与客户端统一入口

    关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了 ocelot与IdentityServer4组合认证博客园里也有很多 xff0c 但大多使用ocelot内置的认证 xff0c 而且大多都是用来认证A
  • JAVA: 接入YSDK遇到的问题

    JAVA后台接口 1 腾讯开放平台 http wiki open qq com wiki E9 A6 96 E9 A1 B5 2 YSDK介绍 大概流程 http wiki open qq com wiki YSDK E4 BB 8B E7
  • 红白黑球组合问题

    从3个红球 6个白球和7个黑球中 xff0c 任意取出8个球作为一组输出 xff0c 在每组中 xff0c 可以没有黑球 xff0c 但必须要有红球和白球 求总的组数以及每组的红球 白球 黑球的数目 思路 红球取值范围为1个到3个 xff0
  • 让我持续下去的理由

    牛仔裤 格子衬衫 运动鞋和双肩包 如果把这四个词放在一个人的身上 xff0c 似乎不用描述长相 xff0c 大家就对他的职业有了猜测 八成是个程序员吧 这个被笑称 月入五万过成月入五千样子 的群体 xff0c 以 收入高 脑回路简单 一成不
  • .NET程序集

    主要内容 64 将源代码编译为托管模块 64 将模块组合为程序集 64 共享程序集 xff08 强签名 xff09 概念阐述 64 将源代码编译为托管模块 1 在 NET框架里 xff0c 我们可以用任何支持CLR xff08 Common
  • android alertdialog横竖屏旋转_如何在哔哩哔哩做横竖屏直播

    哔哩哔哩 以下简称B站 xff0c 说到这个名字 xff0c 可能有些朋友比较陌生 xff0c 对于大多数的年轻人 xff0c 尤其是喜欢二次元文化的年轻人来说 xff0c B站是他们非常钟爱的直播平台 现在的B站已经不单单是一个视频网站

随机推荐

  • 读书小记--<态度>

    前言 前段时间再读了吴军老师的 态度 xff0c 分享的是和女儿的日常书信 觉得收获很多 xff0c 同事推荐他的 浪潮之巅 数学之美 系列书籍 下面是个人的觉得认同或值得深入学习的一些点 xff0c 特此记录一下 态度决定命运 文中写道撒
  • Oracle大表改为分区表及表空间切换方案

    Oracle大表改为分区表及表空间切换方案 一 背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快 xff0c 文件数量即将达到Oracle表空间的限制 xff0c 需要对表 没有分区 xff0c 有些表数据量多达几十亿
  • ORACLE表、索引和分区

    ORACLE 表 索引和分区 一 数据库表 每种类型的表都有不同的特性 xff0c 分别应用与不同的领域 堆组织表 聚簇表 共三种 索引组织表 嵌套表 临时表 外部表和对象表 1 行迁移 建表过程中可以指定以下两个参数 xff1a PCTF
  • ffmpeg常用命令

    之前在处理监控视频时要对视频进行抽帧压缩 xff0c 使得视频大小限制在10M左右 xff0c 所以使用ffmpeg进行视频加工处理 xff0c 因为这个工具确实很强大 下面是用到的相关命令 xff0c 可以直接跳到最后一条命令 xff0c
  • 去哪儿网2015校招研发类笔试题

    从网上找到的题目 xff0c 自己做了一遍 1 二分查找 2 给定一个字符串 xff0c 得到这个字符串中首先出现两次的那个字符 方法 xff1a 可以用一个hash map或者数组来存储字符出现的次数 xff0c 一旦有一个出现了2次 x
  • WebGL学习笔记(4)

    本篇笔记加强了上篇笔记示例代码的程序 xff0c 实现了使用nodejs websocket来广播每个玩家的坐标数据并在同一个世界模型中进行多人在线交互 websocket服务端 xff1a 安装nodejs与npm xff0c 创建一个服
  • SPSS超详细操作:分层回归(hierarchical multiple regression)

    SPSS超详细操作 xff1a 分层回归 hierarchical multiple regression 1 问题与数据 最大携氧能力 maximal aerobic capacity VO2max 是评价人体健康的关键指标 xff0c
  • 6种自动化测试框架(总有一款适合你)

    不知不觉 xff0c 分享的框架已经6个了 xff08 准确说应该是4个 xff09 xff0c 仅仅是接口的 这些框架都是最基础的框架 xff0c 需要根据实际使用场景进行完善 xff0c 大家就当练手实践吧 不需要写代码的自动化框架 J
  • Selenium爬取元素下子元素方法

    Selenium提供了一下方法来定义一个页面中的元素 xff1a find element by id find element by name find element by xpath find element by link text
  • js promise中如何取到[[PromiseValue]]

    返回的值 br Promise span class hljs string PromiseStatus span class hljs string 34 resolved 34 span class hljs string Promis
  • 对比kali linux 的gnome 版本 和 xfce版本 哪个更适合荣耀magicbook锐龙版

    先说明2个点 xff1a 1 我个人使用的是荣耀magicbook锐龙版的第一代就是2018年发布的那款 xff0c BIOS版本是目前最新版1 22 额外说下magicbook这bios界面真心无力吐槽 xff0c 但还好功能基本够用 2
  • 趣味离散数学题(巧猜围棋子)

    甲手里有一个围棋子 xff0c 要乙来猜棋子的颜色是白的还是黑的 xff0e 条件是 xff1a 只允许乙问一个只能回答 是 或 否 的问题 xff0c 但甲可以说真话 xff0c 也可以说假话 xff0e 问乙可以向甲提出一个什么问题 x
  • ubuntu terminal 介绍及相关命令

    ubuntu的terminal 1 调出方法 windows键 43 T 2 终端显示内容 3 查看当前所在目录的绝对路径 pwd命令 eg1 xff1a eg2 xff1a linux严格区分大小写 4 更改 进入目录 cd命令 xff0
  • 激活Debian 7 的桌面(把图标放在桌面上)

    转 xff1a http www acyoo com archives 3017 html Debian 7的默认桌面是Gnome 3 刚装好时无法在桌面进行任何操作 xff0c 不过只需要设置一下就可以了 xff1a 左上角的Activi
  • safari浏览器打不开该网页,提示无法连接服务器如何处理

    现在一些科技类型大公司 xff0c 都自主研发APP 浏览器等 xff0c 像阿里巴巴的UC浏览器 xff0c 腾讯的QQ浏览器 xff0c 苹果公司的safari浏览器等 xff0c 最近 xff0c 苹果用户的小伙伴提到safari浏览
  • EFCore自动迁移

    2019 05 14 xff0c EFCore 2 2 4 有两种方式 xff1a 1 使用Migrate 方法 code if DbContext Database GetPendingMigrations Any DbContext D
  • ffmpeg失败 python_由于ffmpeg不可用,matplotlib动画艺术动画失败ab

    我正在打电话matplotlib animation ArtistAnimation从一系列png图像制作动画 xff0c 但是我得到了一个连接到ffmpeg的错误 我在我的ubuntu14 04上安装了Anaconda 我得到的错误消息是
  • Ubuntu18.06 Mate桌面环境下VirtuslBox打开虚拟机“全局菜单”异常退出解决办法

    在安装完Ubuntu18 06 Mate桌面环境后在VirtuslBox里打开虚拟机会出现 全局菜单 异常退出问题 产生上面问题的原因是你的虚拟机可能在 显示 61 gt 屏幕 61 gt 硬件加速里勾选了 61 gt 启用3D加速 xff
  • SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)

    本文从零开始一步一步介绍如何在Ubuntu上搭建SQL Server 2017 xff0c 包括安装系统 安装SQL等相关步骤和方法 xff08 仅供测试学习之用 xff0c 基础篇 xff09 一 xff0e 创建Ubuntu系统 xff
  • 增量式编码器计数的过零点处理问题

    在增量式编码器位置计数过程中 xff0c 每经过一个计数溢出 xff0c 根据运转方向 xff0c 在update中断里我们会对圈数加1或者减1 if TIMx gt SR amp TIM FLAG Update 61 61 TIM FLA