基于STM32F103ZET6单片机实现AB相磁性霍尔TT减速电机跑小车(个人学习记录,仅供参考)

本文介绍了霍尔编码器的工作原理,特别是应用于AB相磁性霍尔减速电机的霍尔码盘。详细讲解了如何使用TIM4和TIM3进行脉冲计数和控制,以及在主函数中通过连接和验证的实践过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介 

减速电机都会有自己的编码盘。从编码器检测原理上来分,常见的是光电编码器(光学式)和霍尔编码器(磁式)。我们所学的减速电机是AB相磁性霍尔TT减速电机,它所用的是霍尔码盘。霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。

这款减速电机的传动比是1:90,它的基础脉冲数是12PPR,一圈有12个磁极,可以输出12个高电平。根据脉冲数可以算出减速电机输入轴的圈数,减速盘有12个磁极,因为是AB双相脉冲信号检测且每一相检测脉冲的上升沿与下降沿两次信号,所以检测到的实际脉冲数是4倍频的脉冲数,除以4之后才是输入轴减速盘的实际脉冲数,根据此值就能计算出输入轴所转圈数和输出轴所转圈数。    圈数=脉冲数/4/12/90         距离=圈数*轮子周长

二、开始实践 

2.1编码器接口

<think>好的,我现在需要帮用户解决如何为TT马达安装霍尔编码器的问题。用户之前已经问过TT马达可以外接哪些编码器,现在具体到安装霍尔编码器的步骤和方法。首先,我应该回顾之前的回答,确保信息一致,并且结合用户提供的引用内容来补充细节。 首先,用户提到的引用[1]和引用[2]中提到了STM32的定时器设置和正交编码器的使用,比如ARR和PSC值的配置,以及如何通过中断处理脉冲。这可能与霍尔编码器的信号处理有关,虽然霍尔编码器通常是单或双脉冲,但处理方式可能有似之处。需要确认霍尔编码器是单输出还是双输出,比如用户之前提到的霍尔效应编码器输出脉冲信号,可能类似于引用中的双正交信号,但可能更简单。 用户现在需要具体的安装步骤,包括硬件连接和代码示例。根据之前的回答,霍尔编码器需要匹配D型轴,物理安装是关键。所以步骤应该包括轴适配、固定编码器、电路连接和信号处理。 硬件部分需要检查轴径是否匹配,TT马达通常是3mm轴,而霍尔编码器的安装可能需要联轴器或者3D打印支架。可能需要提到使用热缩管或胶水固定,确保稳固。 电路连接方面,霍尔编码器一般有VCC、GND和信号线,可能需要上拉电阻,特别是如果编码器输出是开漏的话。Arduino的中断引脚连接信号线,如D2和D3,但如果是单,可能只需要一个引脚。但根据之前的回答,用户提供的Arduino代码用了两个引脚,但可能只是示例,需要澄清霍尔编码器的输出类型。例如,如果霍尔编码器是双的,可以检测方向,但如果是单,只能测速。需要确认这一点,可能用户之前的回答中提到霍尔编码器输出脉冲,可能单,所以代码示例中的中断可能只需要一个引脚。 软件部分需要配置中断服务程序来计数脉冲,然后计算转速。引用[2]中提到使用50ms定时,计算圈数,然后转成每秒转速。需要结合这个方法来展示代码示例,比如设置定时器中断,每50ms读取计数器,然后计算RPM。 同时要注意供电隔离,防止电机干扰编码器信号,可能需要建议使用单独的电源或稳压模块,或者添加滤波电容。 需要分步骤详细说明,确保用户能一步步操作。可能还需要注意事项,比如校准,确保每个脉冲对应实际转动距离,避免误差。 最后,生成关问题,引导用户深入探讨,比如如何处理信号干扰,提高精度,或者与特定控制器(如STM32)的连接方法。</think>以下是TT马达安装霍尔编码器的详细步骤,结合硬件适配与信号处理方案: --- ### **一、硬件安装步骤** 1. **轴端适配** - TT马达输出轴为$3mm$直径的D型轴(一侧平面切削) - **联轴器选择**:使用3D打印或定制联轴器(内径$3mm$ D型孔),将霍尔编码器的转子与马达轴刚性连接(参考图1) - **临时固定方案**:若精度要求不高,可用热缩管包裹轴与编码器转子,加热后紧固 2. **编码器固定** - 将霍尔编码器本体通过M2螺丝或强力胶固定在马达外壳侧面,确保传感器与转子磁铁间隙$<1mm$(过大导致信号丢失) - 推荐使用磁屏蔽材料(如坡莫合金)包裹编码器,降低电机磁场干扰 3. **电路连接** ```plaintext VCC → 5V电源(需与控制器共地) GND → 控制器GND OUT → 微控制器中断引脚(如Arduino D2/D3) ``` - **信号增强**:若传输距离超过$20cm$,建议添加LM393比较器模块整形信号 - **抗干扰设计**:在VCC与GND之间并联$100nF$陶瓷电容,信号线串联$100Ω$电阻 --- ### **二、Arduino信号处理示例** ```arduino #define HALL_PIN 2 // 中断引脚 volatile unsigned long pulseCount = 0; float rpm = 0; void setup() { Serial.begin(115200); attachInterrupt(digitalPinToInterrupt(HALL_PIN), countPulse, RISING); // 上升沿触发 } void countPulse() { pulseCount++; // 每个磁极变化计为1个脉冲 } void loop() { static unsigned long lastTime = 0; unsigned long currentTime = millis(); if (currentTime - lastTime >= 100) { // 每100ms计算一次转速 noInterrupts(); unsigned long count = pulseCount; pulseCount = 0; interrupts(); // 计算RPM(假设编码器分辨率12CPR) rpm = (count / 12.0) * (60000.0 / (currentTime - lastTime)); // 公式:转数/时间(ms)*60000 Serial.print("RPM: "); Serial.println(rpm); lastTime = currentTime; } } ``` **关键参数说明** - `12CPR`:编码器每转输出12个脉冲(根据实际型号调整) - `RISING`触发:仅检测信号上升沿,避免重复计数[^2] --- ### **三、校准与验证** 1. **基准测试** - 空载运行马达,用激光测速仪对比编码器输出值,计算误差比例 - 调整公式中的CPR值直至测量误差$<2\%$ 2. **方向检测(双通道霍尔)** ```arduino // 若编码器有A/B输出(如SZH-HS12) #define HALL_A 2 #define HALL_B 3 volatile int direction = 1; void countPulse() { if (digitalRead(HALL_B) == HIGH) { direction = 1; // 正转 } else { direction = -1; // 反转 } pulseCount += direction; } ``` --- ### **四、常见问题解决** - **信号抖动**:在编码器输出端并联$10kΩ$上拉电阻和$0.1μF$电容组成低通滤波 - **转速波动大**:将采样周期从$100ms$延长至$200ms$,或采用滑动平均滤波算法 - **安装偏移**:使用千分表检测联轴器同轴度,偏移量需$<0.05mm$ ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值