stm32f103单片机—编码器测速

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

一、涉及资源

stm32f103ZET6开发板(非指定)
MG513P3012V型号电机(带霍尔编码器)(非指定)

二、涉及概念

1、单片机资源要求

此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8,定时器使用通道1、2来实现编码器功能,接线时注意把A/B相接到定时器通道1/2的引脚。

2、减速比

电机结构
stm32f103单片机—编码器测速
减速结构
stm32f103单片机—编码器测速
减速比为1:30通俗地讲就是当电机外伸轴转1圈时实际轴转30圈,外伸轴我们一般接上轮胎等实际作用物体,而实际轴是电机自身的转子,霍尔编码器的检测对象是实际轴

3、测速原理

霍尔编码器工作方式

霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘和霍尔元件组成。霍尔码盘是在一 定直径的圆板上等分地布置有不同的磁极。电机旋转一圈霍尔元件发出特定数目的脉冲信号。,用时间间隔内接收的总的脉冲数目除以转一圈发出的脉冲数目即可得到转轴转的圈数,再除以时间间隔就能得到转速。 为判断转向,一般输出两组存在一定相位差的方波信号。

定时器判断电机正反转的依据

定时器通道1、通道2接收A相和B相的脉冲信号,转一圈A相和B相发出的脉冲数目是一样的,但是发送有先后之分。
stm32f103单片机—编码器测速

定时器针对正反转的两种计数方式

定时器在编码器模式下有两种计数方式,正转时是从重载值开始向下减数,反转时是从零开始向上加数(正反是相对而言的)。例如,如果我设定定时器的重载值为0x7fff,那么当定时器接收到10个正转的脉冲时,计数值变为0x7ff3,当定时器接收到的是反转的脉冲时,定时器的计数值变为0x000A。

定时器编码器模式1、2、3

TI1和TI2分别为定时器的通道1和通道2
stm32f103单片机—编码器测速

stm32f103单片机—编码器测速
编码器模式3即为四倍频模式,这个模式下对于A和B相发过来的一组脉冲会有四次计数(四个跳变沿),这样就能将检测精度提到四倍。

4、M法测速

stm32f103单片机—编码器测速

三、编码器与单片机的接线

注:这里以stm32f1系列的定时器4为例,若使用其他定时器进行测速需要更换对应的引脚资源,编码器A/B相需接到定时器的通道1和通道2

1、霍尔编码器实物图

stm32f103单片机—编码器测速

接线

编码器A相和B相接PB6和PB7引脚(无对应要求)

四、单片机引脚和定时器的初始化

1、代码示例

引脚选择PB6和PB7
定时器选择TIM4,使用编码器模式3

/*****************************************************
*@Func:	编码器涉及资源的初始化
******
*@para:	
******
*@desc:	选择TIM4作为此编码器的解码时钟
******	设置重装值
******  注意:实际使用时对转速有限制,如果转速太快可能发生定时器溢出的情况,就要考虑使用中断
******  目前对脉冲一次定时仅能计32768次,超过即无效,可以分别正反转。
******	定时器在编码器模式下电机如果正转计数器会从零开始正数,如果反转计数器会从重载值开始倒数
******************************************************/ 
void EncoderA_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 			//	引脚初始化的结构体  
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;	//	定时器初始化的结构体
	TIM_ICInitTypeDef TIM_ICInitStructure; 			//	定时器编码器模式初始化的结构体
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 	//	使能TIM4时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 	//	使能GPIOB时钟
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	//	PB6、PB7
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 	//	浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//	根据GPIO_InitStructure的参数初始化GPIOB0

	TIM_TimeBaseStructure.TIM_Period = 0xffff; 				//	设定计数器自动重装值
	TIM_TimeBaseStructure.TIM_Prescaler = 0; 						//	预分频器 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 		//	选择时钟分频:不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 	//	TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 				//	根据TIM_TimeBaseInitStruct的参数初始化定时器TIM4
	
	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3:CH1、CH2同时计数,四分频
	
	//初始化TIM4输入捕获参数
	TIM_ICStructInit(&TIM_ICInitStructure); 							//	把TIM_ICInitStruct 中的每一个参数按缺省值填入
	TIM_ICInitStructure.TIM_ICFilter = 0x03;  							// 	IC1F=0011 配置输入滤波器(连续采样八次)
	TIM_ICInit(TIM4, &TIM_ICInitStructure); 							//	根TIM_ICInitStructure参数初始化定时器TIM4编码器模式

	TIM_Cmd(TIM4, ENABLE); 												// 使能定时器4
}

五、读定时器的计数值

定时器的计数值即为编码器发出的脉冲数目*4(定时器的编码器模式3)

/*****************************************************
*@Func:	读取定时器计数值
******
*@para:	
******
*@desc:	
******************************************************/ 
void Read_EncoderA(void)
{
	if(TIM4->CNT > 0x7fff)
	{
		EncoderA = TIM4->CNT - 0xffff;	// 反转
	}
	else
	{
		EncoderA = TIM4->CNT;			// 正转
	}
	TIM4->CNT = 0xffff;
}

六、由定时器计数值得到转速

1、计算公式

使用M法测速,计算公式为:
转速n = 总脉冲数/四倍频/单圈脉冲数/减速比/时间间隔

2、代码示例

电机转一圈本款霍尔编码器发出13个脉冲,本款电机的减速比为1:30文章来源地址https://www.toymoban.com/news/detail-458448.html

/*****************************************************
*@Func:	获取电机A的速度
******
*@para:	
******
*@desc:	返回的是电机的转速 n圈/s
******	转速n = 总脉冲数/四倍频/单圈脉冲数/减速比/时间		
******************************************************/ 
void Get_MotorA_Speed(void)
{
	Read_EncoderA();	// 获取编码器产生的脉冲数
	MotorASpeed = (float)EncoderA / 4 / PulseNum / ReRate / DecodeGapTime * 1000;
}

到了这里,关于stm32f103单片机—编码器测速的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • JDY-31蓝牙模块远程控制STM32F103单片机

       手机app通过蓝牙模块发送指令实时控制单片机的外设功能,比如发送衣柜开关门指令(舵机旋转),衣架上升降落(步进电机正转反转),远程开启去污除湿功能(继电器控制打开关闭小风扇+加热片)。 本次例子:手机APP连接蓝牙模块远程控制SG90舵机正转(0-180°)和反

    2024年02月01日
    浏览(73)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(55)
  • 【单片机】STM32单片机频率计程序,外部脉冲计数程序,基于脉冲计数的频率计程序,STM32F103

    两种方法用于在单片机中实现频率计的功能。 第一种方法是通过定时器来衡量信号的周期,然后将周期转换为频率。在这种方法中,你可以使用单片机的定时器模块来测量输入信号的周期,定时器会产生一个计数值,你可以根据这个计数值来推算出输入信号的周期,并通过简

    2024年02月11日
    浏览(52)
  • 【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

    我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地),即可实现掉电后依旧走时的能力。 主要特性(来源于STM32中文参考手册V10.pdf): 记得加标准库文件: 串口接收:

    2024年02月11日
    浏览(56)
  • STM32F103单片机控制继电器开关小风扇和加热片

       在智能衣柜中,使用异味传感器检测柜内异味值,当异味值大于设定值时会自动开启小风扇,小风扇起到一个排污去浊的功能,再加上温湿度传感器检测柜内的温度和湿度,当温湿度达到设定值时,加热片自动发热,起到一个降温除霉的作用。想要使小风扇和加热片自动

    2024年02月02日
    浏览(52)
  • 【单片机】STM32F103C8T6 最小系统板原理图

    STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,由STMicroelectronics(ST)公司生产。它是STMicroelectronics的STM32系列微控制器中的一员,被广泛应用于嵌入式系统和电子设备中。 STM32F103C8T6单片机的主要特点和资源包括: 内存资源: Flash存储器:64 KB SRAM(静态随机访问存储器

    2024年02月12日
    浏览(49)
  • STM32F103ZET6 封装 LQFP-144 ST意法 单片机芯片

    STM32F103ZET6 是意法半导体(STMicroelectronics)生产的一款基于 ARM Cortex-M3 内核的 32 位微控制器。它具有高性能、低功耗的特点,广泛应用于各种嵌入式系统和工业应用中。STM32F103ZET6 的主要特点如下: 内核:ARM Cortex-M3,工作频率最高可达 72MHz。 存储器:64KB SRAM,512KB FLASH。 外

    2024年04月22日
    浏览(65)
  • stm32F103单片机pwm控制伺服驱动器进而控制步进电机

    1.需要一台步进电机,私服驱动器,stm32单片机;先按照说明文档,连接好硬件相关线路,对应好sign+,sign-,puls+,puls-线路,其中sign只是个io口拉高拉低操作,puls是pwm波形输出口,虽然有两根线,但只是需要控制一个IO口输出波形即可; 采用主从模式,TIM1为主定时器,tim3未从定

    2024年02月04日
    浏览(55)
  • STM32F103RCT6开发板M3单片机教程06--定时器中断

    除非特别说明,本章节描述的模块应用于整个 STM32F103xx 微控制器系列,因为我们使用是 STM32F103RCT6开发板是mini最小系统板。 本教程使用是( 光明谷SUN_STM32mini开发板 )   首先了解一下是STM32F10X定时器(Timer)   注: 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101

    2024年02月04日
    浏览(67)
  • 【单片机】STM32单片机,定时器,多路PWM,TIM1、TIM2、TIM3、TIM4,STM32F103

    下图是定时器相关引脚: 在《STM32中文参考手册V10.pdf》有写: TIM1 的PWM是带互补输出的,较为高级和复杂,有兴趣可以参考其他介绍文章,这里的代码让7个引脚输出PWM。 调用: 这里没有重映射,注意不能把PA9 PA10 初始化成串口去了。 timer.c timer.h 调用: 这里没有重映射。

    2024年02月11日
    浏览(68)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包