当前位置: 首页 > news >正文

stm32单片机个人学习笔记10(TIM编码器接口)

前言

本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

一、编码器接口简介

二、正交编码器

 

检测一个相的边沿,然后再检测另一个相的电平状态,得到编码器的正转还是反转 

三、编码器接口基本结构

 

GPIO口借用的就是输入捕获的通道1和通道2 产生TIFP1和TI2FP2后就接到编码器接口,后续输入捕获的结构与它无关

四、工作模式

仅在TI1计数即仅检测TI1的边沿和TI2的电平状态,不检测TI2的边沿

在TI1和TI2上计数就是同时检测TI1和TI2的边沿

一般使用在TI1和TI2上计数,因为这个精度高

一个电平不变,另一个电平持续变化,就是产生了毛刺,这次计数器就会执行加减加减的操作,最终的计数值不会变化,上图是两个信号都不反相

 

上图的TI1通过极性选择后反相了,给编码器的信号应该对TI1信号取反再查表 

五、实例(编码器接口测速) 

Encoder.c

输入捕获通道使用结构体初始化函数,其它参数不需要,只需要通道和滤波即可

#include "stm32f10x.h"                  // Device headervoid Encoder_Init(void)
{//开启内部时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//GPIO口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);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);//时基单元初始化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;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//输入捕获通道初始化TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStructure);//配置编码器接口TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使能定时器TIM_Cmd(TIM3, ENABLE);
}int16_t Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIM3);TIM_SetCounter(TIM3, 0);return Temp;
}

 

 main.c

使用定时器每隔1s来取计数器的值,1s即为闸门时间

 

#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,"Speed:");while (1){OLED_ShowSignedNum(1,7,Speed,5);}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET){Speed = Encoder_Get();TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

http://www.lryc.cn/news/462297.html

相关文章:

  • 如何在Android中存储数据?
  • 13.3寸工业三防平板数字化工厂产线数采手持终端
  • ssh连接慢的问题或zookeeper远程连接服务超时
  • perf工具使用指导
  • WordPress 禁用上传媒体图片自动生成缩略图及多尺寸图片教程
  • 锥线性规划【分布鲁棒、两阶段鲁棒方向知识点】
  • linux环境下的程序设计与git操作
  • Matlab中HybridFcn参数的用法
  • Leetcode 3316. Find Maximum Removals From Source String
  • jeecg3版本的vue,离线启动
  • C++的内存管理
  • YZ系列工具之YZ09:VBA_Excel之读心术
  • 嵌入式系统---看门狗
  • 从MySQL5.7迁移到8.0时,有哪些重要的参数调整或新参数需要注意?
  • 完整发布/上传uniapp Ios应用到App Store流程
  • CodeActAgent :Executable Code Actions Elicit Better LLM Agents解读
  • 中小型医院网站开发:Spring Boot入门
  • Java读取PDF后做知识库问答_SpringAI实现
  • 打开exe程序显示没有适当的访问权限
  • Python异步编程:使用`create_task`并发执行协程
  • 从零开始搭建你的DolphinScheduler分布式任务调度平台实战指南
  • 第五课:Python学习之if语句
  • 群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问IP
  • 【秋招笔试】10.13拼多多(已改编)秋招-三语言题解
  • 50个JAVA常见代码大全:学完这篇从Java小白到架构师(附带讲解)
  • Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.0 SP1升级到SP3操作方法(x64)
  • Centos7安装Git及配置Github
  • MobileNet v3(相比于MobileNet v2)
  • 短视频剪辑入门指南:这四大软件值得推荐!
  • 网络编程(22)——通过beast库快速实现websocket服务器