STM32-微项目07-旋转编码器计数及测速

这篇具有很好参考价值的文章主要介绍了STM32-微项目07-旋转编码器计数及测速。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、微项目实现目标:

检测旋转编码器模式下,检测旋转编码器的转动计数值及转速。并且区分转向,一侧转动增加cout,转速值为正,一侧转动减少count,转速值为负;

STM32-微项目07-旋转编码器计数及测速

 

二、微项目硬件配置需求:

1,stm32F103C8T6核心板一块

2,0.96寸OLED显示,用于显示计数

3,旋转编码器,反馈正交信号脉冲

STM32-微项目07-旋转编码器计数及测速STM32-微项目07-旋转编码器计数及测速

三、前置知识:

1,编码器计数模式框图

STM32-微项目07-旋转编码器计数及测速

 ①信号流:

两路GIPO输入---滤波器----边沿检测极性选择---输入TI1FP1和TI2FP2给到编码器接口---根据相位模式(T1和T2的相位之差)判断CNT是向上计数还是向下计数-----经过分频器处理,最后实现计数

②计数模式

STM32-微项目07-旋转编码器计数及测速

 如果一直向下计数到0,在继续计数时,则寄存器数据由于无符号整型缘故,会变成65535,由于数据以补码的形式存储,则强转为int时刻,会变成-1;

③旋转编码器的输入波形情况

正转时刻,A相输出超出B相输出90度

反转时刻,A相输出滞后B相输出90度

STM32-微项目07-旋转编码器计数及测速

 ④设置正相模式与反相模式

就是对于计数模式的一次反向处理,并对应到原本的计数模式上(一般用的较少)

STM32-微项目07-旋转编码器计数及测速

反向之后

STM32-微项目07-旋转编码器计数及测速

 

 

四、代码逻辑分析:

①打开TIM3和GPIOA的时钟

②配置GPIOA的PA5和PA6

③初始化时基模块(注意,在编码器模式下,不需要配置时钟源,输入的TI1FP1或TI2FP2作为时钟),主要是指ARR和PSC

④初始化输入捕获模块,通道1 和通道2都需要配置

⑤配置配置编码器接口

⑥开启时钟模块

五、代码示例:

①打开TIM3和GPIOA的时钟

//初始化时钟TIM3 ,PA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	

②配置GPIOA的PA5和PA6,上拉输入

	//配置PA6\PA7输入GPIO
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 |GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init( GPIOA, &GPIO_InitStruct);

③初始化时基模块(注意,在编码器模式下,不需要配置时钟源,输入的TI1FP1或TI2FP2作为时钟),主要是指ARR和PSC

//初始化时基模块
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//在编码器模式下,此参数无作用
	TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=1-1;//PSC,不分频
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStruct);
	

④初始化输入捕获模块,通道1 和通道2都需要配置

	//输入捕获单元配置
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICStructInit(& TIM_ICInitStruct);//先进行默认初始化
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
	TIM_ICInitStruct.TIM_ICFilter=0xf;
	
	TIM_ICInit(TIM3,&TIM_ICInitStruct);//TIM3-CH1通道
	
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;
	TIM_ICInitStruct.TIM_ICFilter=0xf;
	TIM_ICInit(TIM3,&TIM_ICInitStruct);//TIM3-CH2通道

⑤配置配置编码器接口

	//配置编码器接口
	TIM_EncoderInterfaceConfig( TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising
                                , TIM_ICPolarity_Rising);

⑥开启时钟模块

TIM_Cmd(TIM3,ENABLE);

⑦获取速度模块

本质上,获取的是CNT的计数值,但是如果1S读取一次,并且清空为0 ,则实现了速度测算的功能

1-注意此处的强制转化为有符号数据(反码存储)

2-需要配合定时器中断1S使用(或者延时1S执行一次,当然中断的形式更佳)

int16_t getspeedn(void)
{	
	int16_t temp;
	temp= TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return temp;
}

⑧主函数中配置

1-TIM2_IRQHandler()一秒执行

2-speed要整除4,原因是数据采样时刻,一次转动被采样4次文章来源地址https://www.toymoban.com/news/detail-475626.html

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.H"
#include "encode.h"
#include "timer.h"

int16_t speed=0;

int main()
{
	OLED_Init();
	encoder_init();
	timer_init();
	OLED_ShowString(1,1,"count:000");
	OLED_ShowString(2,1,"speed:0000rpm");
	
	while(1)
	{
		OLED_ShowSignedNum(2,7,speed/4,3);
		
		
	}
}
//中断服务函数
 void TIM2_IRQHandler(void)
 {
	if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)
	{
		speed= getspeedn();
	}
	TIM_ClearITPendingBit( TIM2,TIM_IT_Update );
 }
 
 

到了这里,关于STM32-微项目07-旋转编码器计数及测速的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32之增量式编码器电机测速

    编码器,是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。 . 按监测原理分类 光电编码器 光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器

    2024年02月13日
    浏览(36)
  • Stm32-使用TB6612驱动电机及编码器测速

    最近在 学习编码电机以及尝试使用编码电机测速 。遇到了很多问题,花费了很多时间,在这里做一个记录,对自己学习到的知识进行一个总结 找了很多资料,看了很多视频,这些太多了,以至于让我不知道究竟哪一个是正确的,今天看这个,明天看这个,导致自己的学习效

    2023年04月16日
    浏览(67)
  • 【STM32】【HAL库】定时器编码器模式测速

    目录 概述 HAL设置  定时器的编码器模式 定时器设置  常用函数 代码 电机AB相增量型编码器的介绍和解码方法在这里介绍过了 电机编码器 https://blog.csdn.net/m0_57585228/article/details/125791283 测速可以使用外部中断进行脉冲计数 很多型号的单片机中有专门的电路来计算脉冲的速度和

    2023年04月18日
    浏览(56)
  • stm32f103单片机—编码器测速

    stm32f103ZET6开发板(非指定) MG513P3012V型号电机(带霍尔编码器)(非指定) 此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8, 定时器使用通道1、2来实现编码器功能 ,接线时注意把A/B相接到定时器通道1/2的引脚。 电

    2024年02月06日
    浏览(74)
  • STM32定时器捕获编码器模式测速和方向测不准问题

    ** 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮车,控制运动就需要精确的测量转速和方向,我用的是直流有刷、减速比90、11线霍尔编码器的减速电机。 原本想着用个

    2024年02月15日
    浏览(48)
  • STM32定时器编码器模式实现直流有刷电机测速(HAL库)

    最近在做一个单片机大作业,要用到直流有刷,在这里把学习编码器的知识记录一下,学习参考资料: 正点原子DMF407电机控制专题教程_V1.0 我所使用的编码器是市面上常见的 磁电增量式编码器 ,其有AB两相,用于输出电机转动时的 脉冲数 ,AB两相的先后顺序决定了电机的

    2023年04月24日
    浏览(64)
  • STM32 EC11 旋转编码器

    代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种。一种是转两格,A、B对C端输出一个完整脉冲(转一格就只是由低电平-高电平或由高电平-低电平);另一种就是转一格,A、B对C端输出一个完整脉冲。

    2024年02月02日
    浏览(39)
  • STM32移植LVGL+旋转编码器接口对接

    写在前面:本菜鸟结合了许多大佬的文章,成功实现了基于LVGL的GUI设计,小开心~浅浅记录一下!~ 本文以单片机STM32F103VET6为核心,利用ST7796芯片驱动分辨率为480*320的LCD液晶屏模块,移植LVGL,对接显示接口,对接外部接口——旋转编码器,完成以上两步,就可以实现LVGL的显

    2024年02月10日
    浏览(45)
  • 【STM32】HAL库自学记录-旋转编码器的使用

    通过本文可学会两种实现判断旋转编码器正转反转的方法,可根据自己的应用场景来选择使用哪种方法。 1、芯片:STM32F103RCT6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、旋转编码器模块 5、XCOM V1.4串口软件 图中C端为GND。 方向 :A相和B相相差一个相位,一般来说是90°。A相信号在

    2024年02月11日
    浏览(49)
  • 关于stm32旋转编码器计次乱跳问题(消抖)

    旋转编码器A口接GPIOB0,B口接GPIOB1。设置中断类型为上升下降沿均触发。 输出是用0.96寸oled输出 A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状态,来判断正反转一次。 A口输出的波形用来中断,B口输出的波形用来判断正转还是反转

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包