第四节:STM32定时器(4.JGA25-370霍尔编码器测速)

关联:

STM32超全笔记【秋招自用】【含PID小车、飞控等项目】

STM32定时器的三个模式我们已经学完了,最后还有一个编码器模式。

顾名思义是搭配编码器使用的。

【编码器】

【问】编码器是什么?

如图,编码器一般都安装在电机的尾部,用来测量电机的转速、方向和位置。

【问】编码器输出信号是什么?怎么根据输出信号测速和测方向?

输出A相和B相。

转速的测量方法其实有很多,我们这里用最简单能理解的方法:

转速  =  单位时间内测量到的脉冲数量

 方向:两通道的相对电平关系,如图:

【STM32定时器编码器模式】

【问】我们如何通过STM32读取编码器波形,计算出速度??

【计数方向和编码器信号的关系】

 这是编码器必遇到的一张图:

【问】这边我假设仅在TI1计数,那么这样一个波形的计数规则是什么?

当TI1第一个高电平来临,这个时候我们需要看一下相对信号的电平(就是TI2)是低电平,那么就对应向上计数。(图中第一个绿色箭头)

当TI1第一个低电平来临,这个时候我们需要看一下相对信号的电平(就是TI2)是高电平,那么就对应向上计数。(图中第二个绿色箭头)

【问】这相当于对原始数据几倍频?

两倍频。

下图是选择同时计数,那么就相当于四倍频。

希望您能看懂。

【例程8】编码器测速

【硬件连接】

首先是硬件连接,选择的编码器是JGA25-370。

两个电机的AB相输出引脚分别连接PA0和PA1、PB6和PB7

【问】这个引脚是怎么确定的呢?

查数据手册,如图。


【编码器模式的初始化配置】

 然后这节例程我们在STM32CubeIDE中进行图形化编程配置,因为简单明了方便。

如图设置TIM2和TIM4:

 

 同时设置对应的GPIO引脚上拉:

然后在代码中开启定时中断。

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;

//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);

最后通过串口,我们测量出定时器溢出值为4

【测转速】

打开编码器的数据手册,我们需要求出:

【问】车轮旋转一周,编码器计数器的计数值是多少?

一周旋转9.6圈,产生11个脉冲(线数),计数方式是同时计数(4倍频)

所以计数值 9.6 × 11 × 4

 【测速函数】

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);

实验结果:

<think>好的,我需要帮助用户找到JGA25-370电机的编码器技术资料或驱动程序。首先,用户提供的引用信息中提到JGA25-370的控制电路和硬件设计使用的是Altium Designer,固件基于STM32。这可能提示相关的编码器资料可能存在于厂商提供的设计文档或驱动库中。 首先,我应该考虑JGA25-370电机的制造商。通常这类减速电机由特定厂商生产,比如可能是JG Motor或者某个常见品牌。用户可能需要访问该厂商的官方网站,查找产品页面下的技术文档或下载部分。例如,厂商可能提供数据手册,里面包含编码器的规格、接线方式、信号输出类型等。 其次,引用[1]提到使用InvenSense的DMP库和正点原子的代码移植到STM32。虽然这是针对mpu6050的驱动,但可能类似的思路适用于编码器驱动。用户可能需要查找JGA25-370编码器的接口类型(如正交编码器、增量式等),然后使用STM32定时器编码器模式来读取信号。正点原子或野火等STM32教程可能有相关示例代码,用户可以参考这些资料。 另外,用户提到附录中的硬件和固件路径,可能是指他们已有一些项目文件,但需要更具体的编码器资料。如果厂商没有公开资料,可能需要联系供应商获取,或者查找社区论坛、开源项目中的类似应用案例。 需要注意的是,用户可能遇到的问题包括编码器的分辨率(PPR)、电压等级、输出信号类型(如A/B相、Z信号)以及如何与STM32连接。驱动程序方面,STM32的HAL库或标准外设库可能已经支持编码器接口,用户只需配置定时器并读取计数值即可。 总结步骤:1. 确定电机和编码器的制造商,获取官方资料;2. 查阅STM32的编码器接口应用笔记;3. 参考现有项目或社区资源;4. 若资料不足,联系供应商或使用示波器分析信号。</think>关于JGA25-370编码器的技术资料与驱动程序,以下是分步骤解决方案: 1. **确认电机厂商信息** JGA25-370是直流减速电机型号,常见于机器人/自动化领域。需明确生产厂商(如JG Motor、Pololu等),不同厂商的编码器规格差异较大。若无明确标识,可尝试以下通用方法: - 测量编码器线数:手动旋转电机轴一圈,用示波器或逻辑分析仪观察脉冲数,计算PPR(每转脉冲数) - 信号类型检测:用万用表测量输出信号电压(通常为5V或3.3V TTL电平) 2. **STM32编码器接口配置** 若编码器为增量式正交输出(A/B相),可通过STM32定时器的编码器模式直接读取: ```c // 以TIM3为例 TIM_Encoder_InitTypeDef encoder_config = {0}; encoder_config.EncoderMode = TIM_ENCODERMODE_TI12; // 双通道计数模式 encoder_config.IC1Polarity = TIM_ICPOLARITY_RISING; encoder_config.IC2Polarity = TIM_ICPOLARITY_RISING; encoder_config.IC1Selection = TIM_ICSELECTION_DIRECTTI; encoder_config.IC2Selection = TIM_ICSELECTION_DIRECTTI; encoder_config.IC1Prescaler = TIM_ICPSC_DIV1; encoder_config.IC2Prescaler = TIM_ICPSC_DIV1; encoder_config.IC1Filter = 0x0F; encoder_config.IC2Filter = 0x0F; HAL_TIM_Encoder_Init(&htim3, &encoder_config); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); ``` 通过`__HAL_TIM_GET_COUNTER(&htim3)`读取计数值[^1] 3. **参考现有开源项目** 在GitHub搜索关键词`JGA25-370 STM32 encoder`,可找到类似项目: - 正点原子/野火开发板的编码器例程(如《STM32F4开发指南-库函数版本_V1.2》第19章) - ROS机器人社区中的电机驱动包(如`jga25-370-encoder-driver`) 4. **硬件信号测试方法** 若完全无文档,可通过实验确定引脚定义: ```markdown 1. 将电机接地引脚接GND 2. 用3.3V电源依次测试其他引脚: - 电源引脚:电压稳定在标称值(通常6/12V) - 编码器引脚:旋转时电压周期性跳变(0-3.3V) 3. 用示波器捕获A/B相信号相位差: $$ \Delta\theta = \arctan\left(\frac{B}{A}\right) $$ 正交信号应保持90°相位差 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值