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.hqwc.cn/news/473664.html

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

相关文章

Java IO详解

一、流的概念与作用 流(Stream): 在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。你既可以从流中读取数据,也可以往流中写数据。流的…

计算机毕业设计SSM基于的高校学习资源共享系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: vue mybatis Maven mysql5.7或8.0等等组成,B…

Camtasia2023破解版下载

Camtasia2023破解版是一款简单好用的屏幕录像软件,它结屏幕录制和录制视频编辑等功能于一身,不管是用来创建视频教程还是相关教学视频或者操作演示等都是不二的选择,软件支持录制全屏或者部分区域进行选择录制,可录制网络摄像头、…

DTAN: Diffusion-based Text Attention Network for medical imagesegmentation

DTAN:基于扩散的医学图像分割文本关注网络 摘要 在当今时代,扩散模型已经成为医学图像分割领域的一股开创性力量。在此背景下,我们引入了弥散文本注意网络(Diffusion text - attention Network, DTAN),这是一个开创性的分割框架&#xff0c…

第五节笔记:LMDeploy 大模型量化部署实践

大模型部署背景 参数用FP16半精度也就是2字节,7B的模型就大约占14G 2.LMDeploy简介 量化降低显存需求量,提高推理速度 大语言模型推理是典型的访问密集型,因为是decoder only的架构,需要token by token的生成,因…

【数据结构排序算法篇】----基数排序【实战演练】

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共…

鸿蒙语言ArkTS(更好的生产力与性能)

ArkTS是鸿蒙生态的应用开发语言 ArkTS提供了声明式UI范式、状态管理支持等相应的能力,让开发者可以以更简洁、更自然的方式开发应用。 同时,它在保持TypeScript(简称TS)基本语法风格的基础上,进一步通过规范强化静态检…

Quantitative Analysis: PIM Chip Demands for LLAMA-7B inference

1 Architecture 如果将LLAMA-7B模型参数量化为4bit,则存储模型参数需要3.3GB。那么,至少PIM chip 的存储至少要4GB。 AiM单个bank为32MB,单个die 512MB,至少需要8个die的芯片。8个die集成在一个芯片上。 提供816bank级别的访存带…

贪心第一天,别太贪了

今天是贪心第一天,做376. 摆动序列时脑子都要干烧了,贪心的题还是很有意思的,对于理论知识,我觉得做题的时候就想这两个问题吧: 如何找到局部最优解呢?用这个局部最优解模拟示例后能通过吗? 455…

智慧公厕的主要应用

在现代社会中,随着城市化进程的加速推进,公共卫生设施的建设和管理变得愈加重要。而智慧公厕作为一种新型城市公共设施,正以其智能化、高效化的特点,成为改善城市卫生环境的重要手段。智慧公厕运用物联网、互联网、大数据、云计算…

线索化二叉树(先序,中序,后序)+线索化二叉树的遍历【java详解】

目录 线索化二叉树的基本介绍: 举个栗子: 二叉树的中序线索化: 创建HeroNode类,表示节点信息: 编写中序线索化方法代码: 中序线索化遍历代码: 测试代码: 测试结果&#xff1a…

OpenCV库及在ROS中使用

OpenCV库及在ROS中使用 依赖 cv_bridge image_transport roscpp rospy sensor_msgs std_msgsCMakeLists.txt添加 find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(pub_img_topic ${catkin_LIBRARIES} ${Opencv_LIBS}) C …