SEN FIT0441 无刷直流带编码器12V 159RPM电机

概述

该款无刷直流电机,相比碳刷电机输出特性更稳定。
集成无刷驱动,只需连接电源和2根控制线即可使用,不再需要H桥电机驱动器。
此外还集成了编码器可以测量电机转速,通过测速线信号可以让单片机直到电机的转速。

技术规格

  • 工作电压: 12V
  • 电机额定转速: 7100-7300转
  • 堵转扭矩:2.4KG.CM
  • 减速箱长度: 21MM
  • 减速后转速: 159转每分钟左右。
  • 减速比: 45:1
  • 电机单圈输出脉冲个数: 6*45
  • 控制方式:PWM,带脉冲输出,带方向控制

引脚说明

名称 功能描述
PWM PWM调速口,0-5V (20~30KHz)
Power - 电源负极12V-
Direction 正反转控制口,蓝线+5V或悬空时,电机正转,蓝线连接到负极,电机反转
FG FG信号线(要接上拉电阻)
Power + 电源正极12V+

warning_yellow.png 注意:有时电机接线的颜色会有所不同,但是线序是一样的!

使用教程

下面我们以一个简单的实验为例程,来告诉大家如何简单方便的使用我们的这一款电机。

准备

首先准备好下面的硬件及安装好软件

接线方式

准备好硬件后,按照下图将模块与UNO连接好

FIT0441-D.png

样例代码

硬件连接部分弄完了以后,我们就来看看软件部分怎么弄吧。
接下来我们就需要打开ARDUINO IDE了,将我们的下面的代码复制到IDE中,注意:将刚刚打开的IDE中的所有内容都删除掉!然后选好串口和板型(UNO),点击下载就OK了。
接着打开串口,在串口中输入你0-255中间的任意数字,即可控制电机的转速。电机的正反转是每隔5秒钟自动转换的,当然你也可以把蓝色线拔下来自己想要它反转就短接UNO的GND。让蓝色线悬空就是正转。

注意:255为停止转动,0为最大转速

标准版

#define PIN_PWN 11
#define PIN_DIRECION  10
#define PIN_TRIGGER 9

unsigned int i = 0;

void setup()
{
  pinMode(PIN_PWN, OUTPUT);
  pinMode(PIN_DIRECION, OUTPUT);
  pinMode(PIN_TRIGGER, INPUT_PULLUP);
  Serial.begin(115200);
}

void loop()
{
  //Switch Direction every 4 second
  digitalWrite(PIN_DIRECION, (millis() >> 12) % 2);

  //Recive and change speed
  if (Serial.available())
  {
    analogWrite(PIN_PWN, Serial.parseInt());
  }

  //Measure speed and send
  for (int j = 0; j < 8; j++)
  {
    i += pulseIn(PIN_TRIGGER, HIGH, 10000); //SIGNAL OUTPUT PIN 9 with  white line,cycle = 2*i,1s = 1000000us,Signal cycle pulse number:27*2
  }
  i = i >> 3;
  Serial.print(111111 / i); //speed   r/min  (60*1000000/(45*6*2*i))
  Serial.println("\tr/min");
}

低转速优化版

unsigned long totalPulsein = 0;
byte countPulsein = 0;

void loop()
{
  //.......(前面省略)
  //Measure speed and send
  countPulsein = 0, totalPulsein = 0;
  for (int temp, j = 0; j < 64; j++)
  {
    temp = pulseIn(PIN_TRIGGER, HIGH, 15000);//SIGNAL OUTPUT PIN 9 with  white line,cycle = 2*i,1s = 1000000us,Signal cycle pulse number:27*2
    if (temp)
      totalPulsein += temp, countPulsein++;
  }
  totalPulsein = totalPulsein / countPulsein;
  Serial.print(111111 / totalPulsein); //speed   r/min  (60*1000000/(45*6*2*i))
  Serial.println("\tr/min");
}

FIT0441-serial.png

注意:255为最停止转动,0为最大转速

疑难解答

Q:在低转速下转速显示不准确
A:低转速下转速测量线会受干扰产生许多0μs的信号干扰测速结果。
Q:串口输出调速值无法改变电机转速
A:1.在串口右下角选择“没有结束符”模式;2.不要输入超过0-255范围的数字。

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖!

 

 

链接:https://wiki.dfrobot.com.cn/_SEN_FIT0441_%E6%97%A0%E5%88%B7%E7%9B%B4%E6%B5%81%E5%B8%A6%E7%BC%96%E7%A0%81%E5%99%A812V_159RPM%E7%94%B5%E6%9C%BA

 

 

 

解释一下  (millis() >> 12) % 2 是什么意思

好的,我来详细解释一下 (millis() >> 12) % 2 这个表达式的含义。

这是一个非常巧妙的技巧,用于每隔大约4秒切换一次状态(在0和1之间切换)

让我们把它分解开来理解:


1. millis()

  • millis() 是Arduino的一个函数,返回从程序启动开始到现在经过的毫秒数(ms)。

  • 例如,程序运行了12345毫秒后,millis() 就返回 12345


2. millis() >> 12 (右移12位)

  • 这是一个位操作>> 12 表示将 millis() 返回的数值的二进制表示向右移动12位。

  • 右移1位在数学上等价于除以2

  • 因此,右移12位就等价于除以2的12次方,也就是除以4096

millis() >> 12 的结果可以理解为:程序运行了多少个“4096毫秒”的块

表达式 等价于 含义
millis() - 经过的毫秒数
millis() >> 12 millis() / 4096 经过了几个“4096毫秒”

为什么是4096?
因为 2¹² = 4096。4096毫秒 ≈ 4.096秒 ≈ 4秒。


3. (...) % 2 (模2运算)

  • % 是取模运算符,返回除法后的余数

  • 任何数 % 2 的结果不是0就是1

    • 如果这个数是偶数,结果为 0

    • 如果这个数是奇数,结果为 1


4. 整体效果:(millis() >> 12) % 2

将前两步结合起来:

  1. millis() >> 12 得到的是一个随着时间稳定增长的数(0, 1, 2, 3, 4, 5...)。

  2. 对这个增长的数字进行 % 2 操作,结果就会在 0 和 1 之间交替变化

时间范围 (毫秒) millis() >> 12 (...) % 2 结果 (PIN_DIRECTION)
0 - 4095 ms 0 0 % 2 = 0 LOW (0)
4096 - 8191 ms 1 1 % 2 = 1 HIGH (1)
8192 - 12287 ms 2 2 % 2 = 0 LOW (0)
12288 - 16383 ms 3 3 % 2 = 1 HIGH (1)
... ... ... ...

总结

  • 功能:每过大约 4096毫秒(≈4秒)(millis() >> 12) % 2 的结果就在 0 (LOW) 和 1 (HIGH) 之间切换一次。

  • 用途:用于控制电机的方向引脚,实现电机每4秒自动反转一次方向

  • 优点

    • 非常高效:只使用位操作和取模,计算速度极快。

    • 不需要变量:不需要定义额外的定时变量来记录状态和时间。

所以,这行代码 digitalWrite(PIN_DIRECTION, (millis() >> 12) % 2); 就是一个简洁高效的4秒切换器

 

 

pulseIn() 函数

pulseIn() 是Arduino的一个内置函数,用于测量一个脉冲的持续时间(单位:微秒,μs)。

函数原型:

cpp
 
pulseIn(pin, value, timeout)

参数说明:

  • pin:要读取的引脚编号(这里是你定义的 PIN_TRIGGER = 9

  • value:要等待的脉冲类型

    • HIGH:测量高电平脉冲的宽度(从低到高再到低)

    • LOW:测量低电平脉冲的宽度(从高到低再到高)

  • timeout(可选):超时时间(微秒)。如果在指定时间内没有检测到脉冲,函数返回0。

工作原理:

当调用 pulseIn(PIN_TRIGGER, HIGH, 10000) 时,函数会:

  1. 等待引脚变为低电平(如果当前已经是低电平,则立即继续)

  2. 然后等待引脚变为高电平(开始计时)

  3. 接着等待引脚再次变为低电平(停止计时)

  4. 返回这个高电平脉冲的持续时间(单位:微秒)


代码解析:pulseSum += pulseIn(PIN_TRIGGER, HIGH, 10000);

1. 测量对象:

  • 测量连接到 引脚9 的传感器信号

  • 这通常是一个红外光电传感器编码器,用于检测电机转速

2. 测量内容:

  • 测量传感器输出的每个高电平脉冲的宽度

  • 对于转速测量来说,脉冲宽度越窄(持续时间越短) → 转速越高

  • 脉冲宽度越宽(持续时间越长) → 转速越低

3. 超时设置:10000

  • 10000微秒 = 10毫秒

  • 如果在10毫秒内没有检测到脉冲,函数返回 0

  • 这是一个合理的超时设置,既不会等待太久影响程序性能,又能确保在低速时也能检测到脉冲

4. 累加求和:pulseSum += ...

  • 这不是只测量一次,而是连续测量8次(由循环控制)

  • 将8次的测量结果累加到 pulseSum 中

  • 目的是通过求平均值来提高测量精度,减少单次测量的误差


实际应用场景

假设你有一个电机带有一个编码盘(上面有若干缝隙),旁边有一个红外光电传感器:

text
 
电机轴 → [编码盘] → 红外传感器 → 引脚9

当电机旋转时:

  • 编码盘的缝隙经过传感器 → 产生高电平脉冲

  • 编码盘的不透明部分经过传感器 → 产生低电平

  • 电机转得越快 → 脉冲频率越高 → 每个脉冲的宽度越窄

  • 电机转得越慢 → 脉冲频率越低 → 每个脉冲的宽度越宽

通过测量这些脉冲的宽度,就可以计算出电机的转速。


总结

代码部分 含义
pulseIn() 测量脉冲持续时间
PIN_TRIGGER 测量引脚9的信号
HIGH 测量高电平脉冲的宽度
10000 10毫秒超时时间
pulseSum += ... 累加多次测量结果以求平均值

这行代码的作用是:精确测量传感器输出脉冲的宽度,从而计算电机的转速。通过多次测量求平均值,提高了转速测量的准确性和稳定性。

 

 

公式解析

cpp
 
unsigned long rpm = 60000000 / (45 * 6 * 2 * averagePulse);

等价于:

RPM = 60,000,000 ÷ (45 × 6 × 2 × averagePulse)

让我们分解这个公式的每个部分:


1. 分子部分:60000000

  • 60000000 = 60 × 1,000,000

  • 60:将秒转换为分钟(60秒=1分钟)

  • 1,000,000:将秒转换为微秒(1秒=1,000,000微秒)

所以:60,000,000 表示「每分钟的微秒数」


2. 分母部分:(45 × 6 × 2 × averagePulse)

这是计算电机旋转一周所需的总时间

a) averagePulse

  • 单个脉冲的平均持续时间(微秒)

  • 这是从传感器实际测量得到的数据

b) × 2

  • FG信号通常占空比为50%,通过频率(周期)变化而体现速度变化
  • 表示每个周期检测2个边沿(上升沿和下降沿),最终测得高电平或者低电平的脉冲时间

  • 很多编码器会在 both 上升沿和下降沿都产生信号

c) × 6

  • 可能表示编码盘上的6个缝隙6个检测点

  • 电机每转一圈,传感器会检测到6次变化

d) × 45

  • 这可能是电机的减速比

  • 表示:电机本身转45圈,输出轴才转1圈

  • 或者表示编码器安装在电机轴上,但电机有45:1的减速箱


3. 整体理解:旋转一周的总时间

电机旋转一周所需的总时间 = 45 × 6 × 2 × averagePulse

  • 转一圈需要经过:45(减速比) × 6(缝隙数) × 2(边沿数) = 540个脉冲

  • 每个脉冲耗时:averagePulse 微秒

  • 所以转一圈总时间:540 × averagePulse 微秒


4. 最终计算:RPM

RPM(转/分钟)= 每分钟的微秒数 ÷ 转一圈所需的微秒数

text
 
        60,000,000 μs/min
RPM = ──────────────────────
      45 × 6 × 2 × averagePulse

实际举例

假设测量得到 averagePulse = 1000μs(1毫秒):

  1. 转一圈所需时间

    • 45 × 6 × 2 × 1000 = 540,000μs(0.54秒)

  2. 计算RPM

    • 60,000,000 ÷ 540,000 ≈ 111.11 RPM

这意味着电机转速约为 111转/分钟


参数调整

这个公式中的 4562 是根据你的具体硬件确定的

  • 如果减速比不同:修改 45 这个值

  • 如果编码盘缝隙数不同:修改 6 这个值

  • 如果只检测单边沿:将 2 改为 1

你需要根据实际使用的电机和编码器的规格来调整这些参数。

总结

这个公式通过测量编码器脉冲的持续时间,结合已知的机械参数(减速比、缝隙数),精确计算出电机的实际转速(RPM)。这是一种在嵌入式系统中常用的非接触式转速测量方法。

posted @ 2025-08-30 08:59  FBshark  阅读(4)  评论(0)    收藏  举报