第七章-编码器测速 STM32pwm输出 STM32f103c8t6引脚功能 STM32蓝牙通信 STM32 pwm输出 STM32超声波测距 嵌入式软件开发 STM32cubemx 好家伙VCC

标题第七章-编码器测速

7.1-认识编码器

编码器:一般按照电机尾部、用于测量电机转速、方向、位置。
在这里插入图片描述
那么编码器的输出信号具体是什么?我们如何根据输出信号测量转速 和方向?

转速: 单位时间测量到的脉冲数量(比如根据每秒测量到多少个脉冲来计算转速)

旋转方向: 两通道信号的相对电平关系
在这里插入图片描述

7.2单片机定时器的编码器功能

那么我们已经知道编码器输出的波形,我们如何通过单片机读取波形,然后计算出速度那?

这里STM32单片机的定时器和通用定时器具有编码器接口模式、在STM32中文参考手册13章中有详细介绍

STM32中文参考手册-第200页
在这里插入图片描述
STM32中文参考手册-第267页
在这里插入图片描述
STM32中文参考手册-第226页
在这里插入图片描述
这个是计数方向与编码器信号的关系、我们拆开来看

仅在TI1计数、电机正转、对原始数据二倍频
在这里插入图片描述
仅在TI1计数、电机反转、对原始数据二倍频
在这里插入图片描述
在TI1和TI2都计数

可以看到这样就对原始数据四倍频了

在这里插入图片描述
计数方向
在这里插入图片描述

7.3-获得单位时间计数器值变化量

在这里插入图片描述
上一次说的方法:

这次编码器计数值 = 计数器值+计数溢出次数 * 计数最大器计数最大值

计数器两次变化值 = 这次编码器计数值 - 上次编码器计数值

然后根据这个单位变化量计算速度

还有一种方法:

计数器变化量 = 当前计数器值

每次计数值清空

然后根据这个变化量 计算速度

然后我们再看具体到哪一款电机和编码器上如何测速
在这里插入图片描述
在STM32中文参考手册-第119页
在这里插入图片描述
在这里插入图片描述
设置TIM2

在这里插入图片描述
设置ITM2滤波器
在这里插入图片描述
在这里插入图片描述
同理设置TIM4
在这里插入图片描述
设置TIM4滤波器
在这里插入图片描述
在这里插入图片描述
设置引脚上拉
在这里插入图片描述
生成代码
开启定时器和定时中断
在这里插入图片描述

  HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);//开启定时器2
  HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);//开启定时器4
  HAL_TIM_Base_Start_IT(&htim2);				//开启定时器2 中断
  HAL_TIM_Base_Start_IT(&htim4);                //开启定时器4 中断

在定义两个变量保存计数器值
在这里插入图片描述

short Encoder1Count = 0;//编码器计数器值
short Encoder2Count = 0;

每2ms读取计数器值->清零计数器
在这里插入图片描述

	Motor_Set(0,0);
	//1.保存计数器值
	Encoder1Count =(short)__HAL_TIM_GET_COUNTER(&htim4);
	Encoder2Count =(short)__HAL_TIM_GET_COUNTER(&htim2);
	//2.清零计数器值
	__HAL_TIM_SET_COUNTER(&htim4,0);
	__HAL_TIM_SET_COUNTER(&htim2,0);
	
	printf("Encoder1Count:%d\r\n",Encoder1Count);
	printf("Encoder2Count:%d\r\n",Encoder2Count);	
	
	HAL_Delay(2);

接好电池、烧录代码、串口一连接电脑

用手转动电机1或者电机2 、串口助手可以看到输出信息了
在这里插入图片描述

7.4-主函数周期测量转速

上面我们测量出来了溢出值,我们再根据当前计数器值就可以测量出计数器变化量,我们通过单位时间变量就可以计算出转速

下面是电机和编码器的参数
在这里插入图片描述
我们先测试的结论是否有问题?

  1. 编码器计数器会不会在计数时间内溢出?
  2. 车轮旋转一周,单片机编码器计数器计数多少?9.6乘11乘4
  3. 根据计算方法计算电机转速

定义两个float变量
在这里插入图片描述

float Motor1Speed = 0.00;
float Motor2Speed = 0.00;

下面是代码(一定要把主函数没有用的删除掉)
在这里插入图片描述

	//计算速度
	Motor1Speed = (float)Encode1Count*100/9.6/11/4;
	Motor2Speed = (float)Encode2Count*100/9.6/11/4;
	
	printf("Motor1Speed:%.2f\r\n",Motor1Speed);
	printf("Motor2Speed:%.2f\r\n",Motor2Speed);

编译烧录代码就会输出结果
在这里插入图片描述

7.5-定时器中断定时测量速度

上面我们实现:在主函数周期,读取计数器值然后计算速度,但是如果函数加入其他内容这个周期时间就很难保证。

所以这节我们通过定时器,周期读取计数器,计算速度。复制一份工程开始搞!
在这里插入图片描述
我们先开启定时器、2ms进入一次定时器中断,中断回调函数执行咱们的代码即可。

为什么充分利用单片机 我们使用TIM1

  1. 设置内部时钟源
  2. 使能自动重装载
    在这里插入图片描述
    开启定义更新中断
    在这里插入图片描述
    代码开启定时器1 中断

在这里插入图片描述

  HAL_TIM_Base_Start_IT(&htim1);                //开启定时器1 中断

定时器回调函数中添加 速度计算内容
在这里插入图片描述

/*******************
*  @brief  定时器回调函数
*  @param  
*  @return  
*
*******************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim1)//htim1 500HZ  2ms 中断一次
	{
		TimerCount++;
		if(TimerCount %5 == 0)//每10ms执行一次
		{
			Encode1Count = (short)__HAL_TIM_GET_COUNTER(&htim4);
			Encode2Count = (short)__HAL_TIM_GET_COUNTER(&htim2);
			__HAL_TIM_SET_COUNTER(&htim4,0);
			__HAL_TIM_SET_COUNTER(&htim2,0);
			
			Motor1Speed = (float)Encode1Count*100/9.6/11/4;
			Motor2Speed = (float)Encode2Count*100/9.6/11/4;

			TimerCount=0;
		}
	}
}

把之前的变量定义放这里
在这里插入图片描述

short Encode1Count = 0;
short Encode2Count = 0;
float Motor1Speed = 0.00;
float Motor2Speed = 0.00;
uint16_t TimerCount=0;

主函数就输出速度大小就可以了
在这里插入图片描述

	printf("Motor1Speed:%.2f\r\n",Motor1Speed);
	printf("Motor2Speed:%.2f\r\n",Motor2Speed);

把变量需要声明一下
在这里插入图片描述

extern float Motor1Speed ;
extern float Motor2Speed ;

然后打开串口助手
在这里插入图片描述
注:

根据电机和实际小车调整速度测量与占空比设置函数
在这里插入图片描述
在这里插入图片描述
我们第七章这样就完成了 ,把程序烧录电机就可以完成测速了。
下篇第八章我们讲解 PID速度控制

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103C8T6可以通过外部编码器来实现测速功能编码器是一种能够将旋转运动转换为电信号输出的装置,常用于测量电机的转速和位置。 在STM32F103C8T6中,可以通过外部中断来捕获编码器的信号,然后根据捕获的信号计算出电机的转速。具体实现步骤如下: 1. 配置编码器引脚和外部中断。编码器通常有两个输出信号A和B,分别连接到STM32F103C8T6的两个GPIO引脚上。同时,需要将这两个引脚配置为外部中断输入模式,以便捕获编码器的信号。 2. 在程序中编写外部中断的中断服务函数。当编码器的A或B信号发生变化时,会触发外部中断,进入中断服务函数。在中断服务函数中,可以根据A和B信号的变化情况来判断电机的转速方向和速度大小。 3. 根据编码器的信号计算电机的转速。编码器的信号可以用来计算电机的转速和位置。根据编码器的工作原理,每个脉冲代表电机转动的一个角度,因此可以通过计算两个脉冲之间的时间差来计算电机的转速。 4. 将转速数据输出到外部设备。最后,可以将计算出的电机转速数据输出到外部设备,如LCD显示屏或串口调试助手,以便进行实时监测和调试。 以上就是STM32F103C8T6编码器测速的基本实现步骤。需要注意的是,编码器的类型和工作方式可能会有所不同,因此具体实现时需要根据实际情况进行调整。 ### 回答2: stm32f103c8t6是一款高性能的32位单片机芯片,拥有丰富的外设接口和高性能的计算能力,因此在工控、电子仪器、汽车电子等领域得到广泛应用。其中,测速是许多应用场景的必备功能之一,而编码器是实现测速的关键元素之一。 首先,编码器是一种能够将物理转动转化成电信号的设备,通过检测旋转轴的转动来实现计数和角位置的确定。STM32F103C8T6支持多种编码器的接口,包括正交编码器接口、增量编码器接口等。其中,正交编码器接口是一种常用的编码器接口,其能够在识别旋转方向的同时还能够提供旋转角度的测量。 接下来,就使用STM32F103C8T6来实现编码器测速。在编码器接口的配置过程中,需要注意以下几点: 1. 配置编码器接口的GPIO口。将A相和B相接到两个GPIO口上,其中A相和B相是两路正交相位的脉冲输出信号。将Z相接到GPIO口上,它是编码器的一个标志位,通常用于确定旋转方向。 2. 配置编码器接口的定时器。编码器接口需要借助定时器才能完成计数和计时任务。在配置定时器时,需要设置定时器时钟频率,计数器最大值,定时器模式等参数。 3. 编写编码器接口中断服务程序。编码器接口需要通过中断服务程序来实现实时的旋转测量和计数。中断服务程序需要初始化众多中断事件,在中断程序中,需要读取编码器的A相和B相信号状态,通过状态变化来判断编码器是否旋转。同时还需要对计数器进行增加或减少的操作,以实现对旋转角度和旋转速度的测量。 总结来看,STM32F103C8T6编码器测速需要完成编码器接口GPIO口的配置、定时器的配置和中断程序的编写,在编写过程中需要注意各种中断事件的初始化和计数器操作的正确性,以实现准确的旋转测量和测速功能。 ### 回答3: STM32F103C8T6是一款高性能的32位微控制器,它可以使用外部编码器实现测速功能编码器是一种用于测量旋转角度和转速的传感器,它将旋转运动转换为数字信号输出。对于控制机器人和工业设备等应用中高精度的位置和速度控制,使用编码器实现测速功能非常常见。 在STM32F103C8T6中,实现编码器测速有两种方法,一种是使用定时器,另一种是使用外部中断。下面我们将分别介绍这两种方法的实现步骤。 1.使用定时器实现编码器测速 第一步,选择定时器模式和计数器模式:在STM32F103C8T6中,主要的定时器有三种模式,分别是输入捕获模式、输出比较模式和PWM输出模式。在使用编码器测速时,我们需要选择输入捕获模式,同时选择计数器的模式为边沿计数器模式。 第二步,配置编码器引脚编码器一般有A相、B相和Z相输出,我们需要将A相和B相分别连接到定时器的CH1和CH2引脚上,同时将Z相连接到另外一个IO口上,以便在需要时触发清零操作。 第三步,编写测试程序:在测试程序中,我们需要首先初始化定时器,并设置计数器模式为边沿计数器模式。接下来,需要配置定时器的输入捕获通道和中断触发方式。在编码器的A相信号和B相信号上下降沿触发时,定时器将捕获到两个脉冲控制器状态。最后,我们可以通过计算定时器计数器的变化量来计算编码器的速度。流程图如下: ![img](https://cdn.kesci.com/upload/image/q8or894obm.png?imageView2/0/w/640/h/640) 2.使用外部中断实现编码器测速 第一步,选择外部中断的模式和引脚:在STM32F103C8T6中,外部中断有两种模式,分别是上升沿触发模式和下降沿触发模式。选择上升沿触发模式时,需要选择外部中断的引脚和触发方式。 第二步,编写测试程序:在测试程序中,我们需要首先定义一个中断函数,并在该函数中统计编码器脉冲的个数。然后,初始化GPIO口和外部中断相关的寄存器,并开启外部中断。最后,我们可以通过计算编码器脉冲的个数与时间来计算编码器的速度。流程图如下: ![img](https://cdn.kesci.com/upload/image/q8orcxpfys.png?imageView2/0/w/640/h/640) 综上所述,我们可以使用STM32F103C8T6来实现编码器测速功能,通过选择定时器或外部中断模式,并编写相应的测试程序,可以实现精准的编码器测速

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值