news 2026/1/1 16:38:49

STM32学习——编码器接口测速

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32学习——编码器接口测速

1.编码器接口测速

1.基本要点

1.void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

//配置定时器编码器接口模式的核心函数,用于将定时器配置为编码器模式,实现对正交编码器(如光电编码器、增量式编码器)的脉冲计数,从而获取电机 / 机械结构的转速、转向等信息。

2.上拉,下拉和浮空输入,这三个的选择可以根据外接模块的默认输出电平来选择,好比,外部模块默认输出高电平,则上拉输入。

模式内部电阻连接无外部输入时的电平电平读取逻辑典型电阻值
浮空输入(IN_FLOATING)无上拉 / 下拉电阻不确定(悬浮)直接读取引脚外部电平
上拉输入(IPU)上拉电阻接 VDD高电平(VDD)外部拉低时为低,否则为高30~50kΩ
下拉输入(IPD)下拉电阻接 VSS低电平(VSS)外部拉高时为高,否则为低30~50kΩ

3.极性选择在不同情况下的的含义——TIM_ICPolarity_Rising在输入捕获中代表当上升沿时触发捕获操作,而在编码器中则代表的对于信号源波形是否进行反向,这里是不进行反向。相应的下降沿代表进行反相操作。

2.代码

1.Encoder.h/c

#ifndef __ENCODER_H #define __ENCODER_H void Encoder_Init(void); int16_t Encoder_Get(void); #endif
#include "stm32f10x.h" // Device header void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 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; //ARR TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC TIM_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_ICPolarity_Rising在编码器中指不进行反相 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; }

2.main函数

#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); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/29 16:01:09

学Simulink——基础MPPT控制场景实例:基于Simulink的电导增量法(INC)光伏MPPT仿真

目录 手把手教你学Simulink 一、引言:为什么“扰动观察法在快速变化光照下会‘跑偏’”?——因为P&O仅比较前后功率大小,无法区分MPP左侧还是右侧;当光照突变时,( dP ) 符号可能误判,导致反向远离MPP! 二、电导增量法(INC)原理 1. 光伏功率对电压求导 2. 判断…

作者头像 李华
网站建设 2025/12/29 16:01:07

评论笔记 - Cordova 与 OpenHarmony 混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。 📌 模块概述 评论笔记模块是MovieTracker应用中用于记录和管理影片评论的功能。用户可以为影片添加详细的评论笔记,记录观影感受、剧情分析、演员表现等。评论笔记支持编…

作者头像 李华
网站建设 2025/12/22 1:07:11

备份恢复模块 - Cordova与OpenHarmony混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。 📌 概述 备份恢复模块用于数据的备份和恢复。这个模块支持自动备份和手动备份,用户可以定期备份应用数据以防止数据丢失。通过Cordova框架,我们能够在Web层实…

作者头像 李华
网站建设 2025/12/22 2:37:43

排序--基数排序

一、不基于比较的排序算法 1.1、计数排序 这是一种另类排序,它不是基于比较的排序算法。比较小众,根据数据的分布情况,即频率。 1.2、基数排序 数据结构不统一,一般采用队列,先进先出。 比如[13,17,26,72,100],先找最高…

作者头像 李华
网站建设 2025/12/20 20:33:49

揭秘大模型深度研究:从多智能体协作到结构化报告生成的全流程

深度研究(Deep Research)已成为现代大模型平台的标准能力,通过多智能体协作完成长时间研究任务。文章解析了其高层架构(编排者、子代理、综合与引用代理),对比了OpenAI、Gemini、Claude等平台的实现差异,详细阐述了从用户查询、初始规划、并行…

作者头像 李华
网站建设 2025/12/22 7:50:11

2026版大模型应用开发全攻略:零基础入门到精通,一篇文章搞定,非常详细收藏这一篇就够!

“ 大语言模型应用开发流程包括筛选应用场景、企业知识管理、训练场景大模型、业务系统融合、大模型安全体系建设、持续改进体验等多个环节。通过将AI智能体集成到数字化系统中,将业务数字化系统升级为智能化系统,从而实现人类员工与数字员工的高效协作。…

作者头像 李华