TIM编码器接口(编码器测速)

定时器编码器接口自动计次--------->对应手册14.3.12编码器接口模式

应用场景:

电机控制PWM驱动电机,编码器测电机速度,PID算法闭环控制

---------------------------------------------------------------------------------------------------------------------------------

一、结构分析

 

 

 

 

 

*输入 :CH1/CH2 -->边沿检测-->编码器接口

*输出:控制CNT计数时钟和计数方向

逻辑:A相边沿检测+B相状态 =CNT增/减

正转向上计数,反转都向下计数 

 

 解释反相:

输入捕获那里,极性选择决定上升沿有效还是下降沿有效;但是这里我们知道上升沿下降沿都有用,这里就不是边沿的极性选择,是高低电平极性选择

选择上升沿参数,高低电平极性不反转;选择下降沿参数,经过一个非门,高低电平反转

 

二、编码器测位代码分析

新函数学习:

/*****定时器编码器接口配置*****/
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

STEP1 RCC开启时钟

STEP2 配置GPIO为输入模式

STEP3 配置时基单元:PSC不分频,ARR 65535,CNT执行计数

STEP4 输入捕获单元:滤波器、极性

STEP5 配置编码器接口模式:调用库函数

STEP6 TIM_Cmd

ENCODER.C

#include "stm32f10x.h"                  // Device header
void Encoder_Init(void)
{/*****STEP1 开启时钟*****/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*****STEP2 配置GPIO*****/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;						GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*****STEP3 配置时基单元*****/	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up ;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1 ;//PSC 不分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);/*****STEP 4 输入捕获配置*****/TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);//赋一个初始值TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                    //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;          //高低电平极性不反转,不反相,后面配置过了/*TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                 //分频器           目前TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  */   //配置数据选择器   无用TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;                    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;          //高低电平极性不反转,不反相TIM_ICInit(TIM3,&TIM_ICInitStructure);/*****STEP 5 配置编码器接口*****/TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);/*****STEP 6 定时器使能*****/TIM_Cmd(TIM3,ENABLE);
}int16_t Encoder_Get(void)
{return TIM_GetCounter(TIM3);}

实现反转负数(补码原理):int16_t 如果用uint16_t 就是65535递减 

main.c

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1,1,"CNT:");while(1){OLED_ShowSignedNum(1,5,Encoder_Get(),5);}}

目前向右转增,向左减,若不是想要的增减方向,更改极性

更改极性

硬件:AB相接线换一下

软件:修改输入通道的极性,把任意一个极性反转一下

三、编码器测速代码分析

固定的闸门时间读一次CNT再清零

MAIN.C

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"int16_t Speed;int main(void)
{OLED_Init();Timer_Init(); Encoder_Init();OLED_ShowString(1,1,"CNT:");while(1){OLED_ShowSignedNum(1,7,Speed,5);}}void TIM2_IRQHandler(void)//减少使用DELAY
{if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){Speed = Encoder_Get();TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}	

ENCODER 改动部分:

 

int16_t Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIM3);TIM_SetCounter(TIM3,0);return Temp;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门学习(三十)一维数组的三种定义方式

数组是什么? 数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素…

Nuxt3+Vue3(Composition API)+TS+Vite+Ant Design Vue 搭建

最近官网搭建选择了nuxtjs,由于框架更新了,其中语法也有很多变化,中间遇到了一些问题点做下总结。 nuxt3官方文档地址:https://nuxt.com/docs/getting-started/installation 安装 在安装Nuxt3之前,你需要保证你的nod…

第四次作业:XTuner InternLM-Chat 个人小助手认知微调实践

参考文档: https://github.com/InternLM/tutorial/blob/main/xtuner/README.md https://github.com/InternLM/tutorial/blob/main/xtuner/self.md 数据准备: 配置文件: # Copyright (c) OpenMMLab. All rights reserved. import torch fr…

方法和概念

什么是方法?什么是概念? 计算机术语 方法是为了达成某个目标所用的方式和办法。方式就是选择的途径,办法就是采取的措施。 关键性理解: 选择的途径,途径的名称就是方法的名称,途径的主体就是方法的主体&am…

安装 SEED-XDS560v2 Driver.exe

安装 SEED-XDS560v2 Driver.exe References CCS 5.5.0.00077 安装目录 D:\ti\ccsv5\ SEED-XDS560v2 Driver.exe 安装目录 D:\ti\ccsv5\ccs_base References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

双机调试-vm

双机调试 环境配置基础操作内存操作读内存写内存内核(双机调试)读内存搜索内存读内存显示为汇编指令读写寄存器和标志位杂项断点 环境配置 虚拟机端 打开cmd bcdedit /copy {current} /d Debug bcdedit /timeout 30输入以上结果重启后进入debug系统 M…

单测的思路

文章目录 单测的定义方法的单测几种生成工具的对比生成步骤 接口的单测场景的单测总结参考 单测的定义 单元测试(Unit Testing)是一种软件开发中的测试方法,它的主要目的是确保软件中的最小可测试单元(通常是函数、方法或类&…

【无标题】管理kvm 虚拟机

管理kvm 虚拟机 点击虚拟机 创建新的虚拟机 安装操作系统 设置root密码

面向抽象设计,规划凭证模块软件架构<一>

接着上一篇文章,账薄已经有了,我们开始着手细致入微的具体业务,当然首先想到凭证。基础会计人员都知道,原始凭证是业务的起点。剥离开具体的财务方面的知识和技能,我们纯粹从计算机信息人员的角度去解决我们想要处理的问题。当下我的目的是为了账务处理的方便,但最直接的…

[VulnHub靶机渗透] Fowsniff

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

【Linux系统化学习】缓冲区

目录 缓冲区 一个样例 现象解释 缓冲区存在的位置 缓冲区 在刚开始学习C语言的时候我们就听过缓冲区这个名词,很是晦涩难懂;在Linux下进程退出时也包含缓冲区,因此缓冲区到底是什么?有什么作用? 让我们先从一个小…

项目架构梳理

单点登录组件 CREATE TABLE user_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增主键,用户id,username varchar(30) NOT NULL COMMENT 用户姓名,password varchar(60) NOT NULL COMMENT 密码,token varchar(60) DEFAULT NULL COMMENT token,token_expire datetime DEF…

005 - Hugo, 图床

005 - Hugo, 图床版本问题排除PicGo配置问题总结 005 - Hugo, 图床 TyporaPicGo阿里云OSS实现云笔记|Typora上传图片 但我看过视频教程后,按照演示一步步操作,最后还是无法上传图片。 Error: getaddrinfo ENOTFOUND *.aliyuncs.com\n at GetAddrInfoReqW…

redis高级篇

为什么用单线程 开始多线程和io复用 linux连接redis其实就是一个socket过程 bigkey记录案例和生产故障 插入100w数据 不使用key*那使用什么?:scan bigkey发现删除优化策略

代码随想录day21--回溯基础

理论基础 回溯法也可以叫回溯搜索法,它是一种搜索的方式。我们在二叉树中也多次提到了回溯。回溯是递归的副产品,只要使用了递归就会有回溯,我们我们就可以笼统的将回溯函数称为递归函数 回溯法解决的问题 1.组合问题:N个数里面…

线段树解决-----P1161 开灯 P1047 [NOIP2005 普及组] 校门外的树 python解法

# [NOIP2005 普及组] 校门外的树 ## 题目描述 某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 l的位置;数轴上的每个整数点&#xf…

非线性一元方程求解——弦截法、牛顿迭代法(C++)

一元方程 对于一元方程,如果要求f(x)0的解,其过程大致包括如下三个问题: 根的存在性:是否有根,如果有,有几个?根的分布:根分布区间;求根的公式:如何从根的近…

成本效能FinOps: Crane 部署

目录 一、实验 1.环境 2.安装kind 3.安装Crane 二、问题 1.脚本安装prometheus报错 2.查看集群信息失败 3.Helm添加grafana 报错 4.查看crane资源失败 5.prometheus部署时kube-state-metrics 拉取镜像显示ImagePullBackOff 6.Crane 功能与架构 一、实验 1.环境 &a…

记录 | 验证pytorch-cuda是否安装成功

检测程序如下: import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell,运行情况如下

单片机移植Lua(STM32H743移植Lua-5.4.6)

文章目录 目的移植演示示例链接更多说明合理设置内存大小按需加载标准库实现系统和IO接口设置引用路径 总结 目的 通常单片机都是使用C/C来开发的,任何修改都需要重新编译固件然后下载运行。在一些需要灵活性更强的场合中可以内嵌Lua解释器实现动态更新应用程序的功…