最近用到编码器控制电机,因为编码器用到了定时器的输入捕获功能,初学时候没有认真去看,这边打算结合代码重新整理一遍。
1.选择编码器接口模式的方法是:
如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;
如果只在TI1边沿计数,则置SMS=010;
如果计数器同时在TI1和TI2边沿计数,则置SMS=011。
通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;
如果需要,还可以对输入滤波器编程。
两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;
如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数,
同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。
编码器接口模式—基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计 数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。
在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1和TI2不同时变换
接下来配置一个计数器:
● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)
● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2)
● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)
● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2)
● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).
● CEN=’1’ (TIMx_CR1寄存器,计数器使能)
这个图便是计数器操作的实例,结合表77其实就可以很好地理解为什么能通过TI1和TI2如何来检测编码器前进后退,频率则可以达到测速的效果
AB相的电平和跳变沿决定了CNT的加数和减数。
CNT增计数时:
A上升沿,B逻辑低
B上升沿,A逻辑高
B下降沿,A逻辑低
A下降沿,B逻辑高
CNT减计数是:
A下降沿,B逻辑低
B下降沿,A逻辑高
B上升沿,A逻辑低
A上升沿,B逻辑高
void Encoder_Init_TIM2(void)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFF00;//PA0 PA1 为编码器的ab相
GPIOA->CRL|=0X00000044;//浮空输入 (这边为什么使用浮空输入暂时不清楚,希望指点)
/* 把定时器初始化为编码器模式 */
TIM2->PSC = 0x0;//预分频器
TIM2->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值 65535
TIM2->CCMR1 |= 1<<0; //输入模式,IC1FP1映射到TI1上
TIM2->CCMR1 |= 1<<8; //输入模式,IC2FP2映射到TI2上
TIM2->CCER |= 0<<1; //IC1不反向 捕获发生在上升沿
TIM2->CCER |= 0<<5; //IC2不反向 捕获发生在上升沿
TIM2->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM2->CR1 |= 0x01; //CEN=1,使能定时器
}
TIM2->CCMR1 |= 1<<0; //输入模式,IC1FP1映射到TI1上
TIM2->CCMR1 |= 1<<8; //输入模式,IC2FP2映射到TI2上
TIM2->CCER |= 0<<1; //IC1不反向
TIM2->CCER |= 0<<5; //IC2不反向
smcr寄存器的sms位存在几种模式,如下
当sms为111时外部时钟源模式1被选中,计数器可以在选定输入端的每个上升沿
或下降沿计数
例:要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:
外部时钟源模式2
选定此模式的方法为:令TIMx_SMCR寄存器中的ECE=1 计数器能够在外部触发ETR的每一个上升沿或下降沿计数。
例:要配置在ETR下每2个上升沿计数一次的向上计数器,使用下列步骤:
操作系统的定义操作系统是一款软硬件资源管理的软件。需要注意的有以下几点:1、操作系统扮演的是管理者,管理者拥有决策权2、硬件扮演的是被管理者,管理者是根据被管理者的数据进行相关决策的3、设备驱动扮演的是管理决策执行者,管理者和被管理者并不直接沟通,所以管理者(操作系统)和被管理者(软硬件)之间必须得有一个执行者角色(设备驱动)以上是关于操作系统的说明,需要明确操作系统是...
vs2010中的工具栏中的“向前导航”,“向后导航”按钮的添加 vs2010 向前,向后 vs2010 向前菜单 在工具栏中添加快捷菜单右键工具栏--》自定义--》命令--》工具栏(文本编辑器)--》添加命令--》视图中的“向前导航”和“向后导航”--》确定右键工具栏--》自定义--》命令--》工具栏(文本编辑器)--》添加命令--》编辑中的“在文件中查找”--》确定
官方API文档:https://work.weixin.qq.com/api/doc/90000/90135/91020步骤一:引入JS文件在需要展示企业微信网页登录二维码的网站引入如下JS文件,(支持https):http://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js步骤二:在需要使用微信登录的地方实例JS...
同余问题1. 同余定义给定整数 mmm ,若两个整数 a,ba,ba,b 除以 mmm 所得余数相同,称 aaa 和 bbb 对模 mmm 同余,表示为:a≡b( mod m)a ≡ b(\ mod \ m)a≡b( mod m)。若一个整数集合中所有数模 mmm 的余数相同,这个集合中的数都称为模 mmm 的同余类。每个同余类中的任意两个整数对模 mmm 同余。定理 111 : a≡b( mod m)a ≡ b(\ mod \ m)a≡b
[ORACLE]删除表的purge用法请支持原创,认准DannisTang([email protected])使用oracle开发的时候,如果在存储过程中,或者是其他代码中使用了drop语句删除大量表,容易在回收站中产生垃圾,DBA会投诉,所以不要这样做,如果确定了要drop表,则最好加上purge,但是要慎用,因为无法闪回---------------drop t...
之前有朋友在博客里希望我能列出自己使用的所有Vim插件,一直没有时间,趁周末的最后的几个小时,就给大家列一下,大家可以实行拿来主义,取自己需要的,呵呵~OK,一个个来说吧~~plugin:编程相关:公共:taglist 相信无人不知其大名,用来提供单个源代码文件的函数列表之类的功能。最近在使用一个针对面向...
通过定时器0通道0,实现LED闪烁#include <fpioa.h>#include <plic.h>#include <stdio.h>#include <sysctl.h>#include <syslog.h>#include <timer.h>#include <unistd.h>#include "gpiohs.h"int ctx = 0;int value = 0;//
说明:我自己电脑现在系统为Windows 7操作系统,目前电脑有C盘和D盘两个盘,并且有200G的可用空间(未新建卷),想在电脑上在安装一个CentOS 7的系统,以下为具体操作记录。一、软碟通刻录CentOS7安装镜像到U盘1、首先准备一个空的U盘,大小大于CentOS镜像就行(我的U盘为8G)。2、百度下载安装软碟通软件(我的下载链接为:http://sw.bos.baidu.com/sw-s...
2019独角兽企业重金招聘Python工程师标准>>> ...
<br /> <br />今天看一本os的书,照着写,然后在ubuntu下用gcc编译链接,出现错误<br />undefined reference to `__stack_chk_fail’<br /><br /><br />上网找了一下,解决方法是:<br />add -fno-stack-protector to your CFLAGS.<br /><br /><br />原因是:GCC likes to do a bunch of stuff behind the scenes. It’s gre
这几天有个对SpringCloud-Gateway网关请求参数做安全校验的需求,网上多数教程不适用于SpringBoot2.1+版本。我在SpringCloud gateway Github中的Issues找到了答案,放上连接:作者采纳的答案。具体代码如下:@Componentpubli...
python编程开发是目前大多数软件开发程序员都在学习的一个编程语言,下面我们就通过案例分析来了解一下,python编程都有哪些编程技巧。1、计数时使用Counter计数对象。这听起来显而易见,但经常被人忘记。对于大多数程序员来说,数一个东西是一项很常见的任务,而且在大多数情况下并不是很有挑战性的事情——这里有几种方法能更简单的完成这种任务。2、漂亮的打印出JSONJSON是一种非常好的数据序列化的形式,被如今的各种API和webservice大量的使用。使用python内置的json处理,可以使