Arduino 的隔离模拟输入
组件和用品
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
来自现场传感器的信号可能会受到电涌、雷击或其他 EMI(电磁干扰)源产生的噪声以及地电位差的影响。避免大多数这些问题的一种方法是使用与现场完全隔离的方法。
输入传感器的隔离需要单独的电源来为现场设备和实现隔离的电路供电。
更多细节可以在我的博客中发布的帖子中找到:http://ardupiclab.blogspot.it/。
代码
- Arduino 接口和程序
Arduino 接口和程序Arduino
Arduino 可以通过两种方式测量频率:• 周期测量,使用pulsein() 函数;
• 频率测量,使用 CPU 定时器/计数器,使用特殊库。
第一种方法使用两次函数pulsein() 以测量信号的高电平时间和低电平时间,分辨率为微秒。两次测量的总和就是信号的周期。对于 5kHz 信号,周期为 200 µs =HIGH 时间 + LOW 时间 =125+75 µs。时间分辨率比较低,测量的精度也受程序指令时间的影响。
这种方法的积极方面是测量速度略高于测量周期。缺点是,除了精度较低外,它对电网噪声(50 或 60Hz)最为敏感。
由于这些原因,我更喜欢关于周期的频率测量。测量时间更长,但您可以获得更高的精度和精确的采样时间。此外,选择测量周期倍于电网的测量周期,具有出色的抗噪性。
我使用 Martin Nawrath KHM LAB3 的 FreqCounter 库:
http://interface.khm.de/wp-content/uploads/2009/01/FreqCounter_1_12.zip
该库使用 Timer/Counter1 对 T1/PD5/digitalPin5 上升沿的脉冲进行计数,使用 Timer/Counter2 生成具有 1 ms 中断的门限时间。
我选择了一个等于 1000 毫秒的门限时间来调节 50 或 60 个电源周期的计数。在这种情况下,您得到的分辨率是 Arduino Uno 的五倍。
#includevoid setup() { Serial.begin(9600); // 连接串口 Serial.println("光电隔离模拟输入");}long int frq;void loop() { FreqCounter::f_comp=0; // 设置补偿为 0 FreqCounter::start(1000); // 以 1000 毫秒的门限时间开始计数 while (FreqCounter::f_ready ==0) // 等待计数器就绪 frq=FreqCounter::f_freq; // 读取结果 Serial.println(frq); // 打印结果延迟(100);}
示意图
该电路接受大约 20mV 至 5V 的输入电压或 4 至 20mA 的电流(插入跳线 W1)。并联的两个电阻 R2 和 R3 给出约 250 欧姆的值,以便为 4mA 至 20mA 电流输入提供 1V 至 5V。只需三根电线和一个电阻即可将电路连接到 Arduino Uno。光耦合器的输出应连接到数字输入 D5,上拉 2.2k 电阻连接到 Arduino 的 +5V。
如果需要10V的输入范围,就需要15V的电源,所以必须把7808的稳压器换成7815。变压器T1还要给传感器供电,所以必须有足够的电压和功率。必须调整微调器 P1 以获得大约 1kHz/V 的转换因子。
制造工艺