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+ |
注意:有时电机接线的颜色会有所不同,但是线序是一样的!
使用教程
下面我们以一个简单的实验为例程,来告诉大家如何简单方便的使用我们的这一款电机。
准备
首先准备好下面的硬件及安装好软件
- 硬件
- DF_UNO 1
- 本电机 *1
- 软件
- Arduino IDE V1.6.5 点击下载Arduino IDE
接线方式
准备好硬件后,按照下图将模块与UNO连接好
样例代码
硬件连接部分弄完了以后,我们就来看看软件部分怎么弄吧。
接下来我们就需要打开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");
}
注意: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
将前两步结合起来:
-
millis() >> 12
得到的是一个随着时间稳定增长的数(0, 1, 2, 3, 4, 5...)。 -
对这个增长的数字进行
% 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)。
函数原型:
pulseIn(pin, value, timeout)
参数说明:
-
pin
:要读取的引脚编号(这里是你定义的PIN_TRIGGER = 9
) -
value
:要等待的脉冲类型-
HIGH
:测量高电平脉冲的宽度(从低到高再到低) -
LOW
:测量低电平脉冲的宽度(从高到低再到高)
-
-
timeout
(可选):超时时间(微秒)。如果在指定时间内没有检测到脉冲,函数返回0。
工作原理:
当调用 pulseIn(PIN_TRIGGER, HIGH, 10000)
时,函数会:
-
等待引脚变为低电平(如果当前已经是低电平,则立即继续)
-
然后等待引脚变为高电平(开始计时)
-
接着等待引脚再次变为低电平(停止计时)
-
返回这个高电平脉冲的持续时间(单位:微秒)
代码解析:pulseSum += pulseIn(PIN_TRIGGER, HIGH, 10000);
1. 测量对象:
-
测量连接到 引脚9 的传感器信号
-
这通常是一个红外光电传感器或编码器,用于检测电机转速
2. 测量内容:
-
测量传感器输出的每个高电平脉冲的宽度
-
对于转速测量来说,脉冲宽度越窄(持续时间越短) → 转速越高
-
脉冲宽度越宽(持续时间越长) → 转速越低
3. 超时设置:10000
-
10000微秒 = 10毫秒
-
如果在10毫秒内没有检测到脉冲,函数返回
0
-
这是一个合理的超时设置,既不会等待太久影响程序性能,又能确保在低速时也能检测到脉冲
4. 累加求和:pulseSum += ...
-
这不是只测量一次,而是连续测量8次(由循环控制)
-
将8次的测量结果累加到
pulseSum
中 -
目的是通过求平均值来提高测量精度,减少单次测量的误差
实际应用场景
假设你有一个电机带有一个编码盘(上面有若干缝隙),旁边有一个红外光电传感器:
电机轴 → [编码盘] → 红外传感器 → 引脚9
当电机旋转时:
-
编码盘的缝隙经过传感器 → 产生高电平脉冲
-
编码盘的不透明部分经过传感器 → 产生低电平
-
电机转得越快 → 脉冲频率越高 → 每个脉冲的宽度越窄
-
电机转得越慢 → 脉冲频率越低 → 每个脉冲的宽度越宽
通过测量这些脉冲的宽度,就可以计算出电机的转速。
总结
代码部分 | 含义 |
---|---|
pulseIn() |
测量脉冲持续时间 |
PIN_TRIGGER |
测量引脚9的信号 |
HIGH |
测量高电平脉冲的宽度 |
10000 |
10毫秒超时时间 |
pulseSum += ... |
累加多次测量结果以求平均值 |
这行代码的作用是:精确测量传感器输出脉冲的宽度,从而计算电机的转速。通过多次测量求平均值,提高了转速测量的准确性和稳定性。
公式解析
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(转/分钟)= 每分钟的微秒数 ÷ 转一圈所需的微秒数
60,000,000 μs/min
RPM = ──────────────────────
45 × 6 × 2 × averagePulse
实际举例
假设测量得到 averagePulse = 1000μs
(1毫秒):
-
转一圈所需时间:
-
45 × 6 × 2 × 1000 = 540,000μs
(0.54秒)
-
-
计算RPM:
-
60,000,000 ÷ 540,000 ≈ 111.11 RPM
-
这意味着电机转速约为 111转/分钟。
参数调整
这个公式中的 45
、6
、2
是根据你的具体硬件确定的:
-
如果减速比不同:修改
45
这个值 -
如果编码盘缝隙数不同:修改
6
这个值 -
如果只检测单边沿:将
2
改为1
你需要根据实际使用的电机和编码器的规格来调整这些参数。
总结
这个公式通过测量编码器脉冲的持续时间,结合已知的机械参数(减速比、缝隙数),精确计算出电机的实际转速(RPM)。这是一种在嵌入式系统中常用的非接触式转速测量方法。