Arduino集成
本页提供将FG-3+和FG-3C传感器与Arduino兼容板(Arduino Uno、Arduino Mega、ESP32等)集成的即用型Arduino示例。
FG-3+ — 频率/周期测量
FG-3+输出一个5V矩形脉冲,其周期与磁场成正比。以下示例使用pulseIn()测量脉冲周期,适用于低更新率应用。对于更高精度和更快采样,请改用硬件定时器输入捕获。
电平转换
FG-3+输出为5V逻辑。只能通过分压器或电平转换器连接到3.3V MCU(如ESP32)。不要将5V信号直接连接到3.3V GPIO引脚。
// FG-3+ 频率测量示例
// 从FG-3+传感器读取脉冲周期并输出到串口
//
// 接线:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2(3.3V板需通过电平转换器)
//
// 注意:pulseIn()在测量期间会阻塞。对于时间关键应用,请使用硬件定时器。
const int SENSOR_PIN = 2; // 连接到FG-3+ OUT的数字输入引脚
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("FG-3+ 周期测量");
Serial.println("Period_us");
}
void loop() {
// 测量一个完整脉冲的周期(HIGH + LOW持续时间)
// pulseIn以微秒返回持续时间;超时返回0
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // 100ms超时
unsigned long lowTime = pulseIn(SENSOR_PIN, LOW, 100000UL);
if (highTime == 0 || lowTime == 0) {
Serial.println("超时 - 未检测到信号");
return;
}
unsigned long periodUs = highTime + lowTime;
// 以微秒输出周期
// 要转换为场值(nT),请应用传感器的校准系数
Serial.println(periodUs);
delay(100); // 10 Hz输出率
}
校准
周期(µs)与磁场(nT)之间的关系取决于特定传感器单元。应用传感器校准证书中的校准系数将周期转换为场值。
FG-3+ — 使用硬件定时器提高精度(ESP32)
在ESP32上获得更高精度,请使用硬件定时器输入捕获:
// 使用ESP32 PCNT的FG-3+高精度周期测量
// 使用脉冲计数器外设进行精确频率计数
//
// 接线:
// FG-3+ OUT -> GPIO 4(通过电平转换器)
#include "driver/pcnt.h"
#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // 计数脉冲1秒
void setup() {
Serial.begin(115200);
// 配置PCNT计数输入引脚上的上升沿
pcnt_config_t pcnt_config = {
.pulse_gpio_num = PCNT_INPUT,
.ctrl_gpio_num = PCNT_PIN_NOT_USED,
.lctrl_mode = PCNT_MODE_KEEP,
.hctrl_mode = PCNT_MODE_KEEP,
.pos_mode = PCNT_COUNT_INC, // 计数上升沿
.neg_mode = PCNT_COUNT_DIS,
.counter_h_lim = 30000,
.counter_l_lim = 0,
.unit = PCNT_UNIT,
.channel = PCNT_CHANNEL_0,
};
pcnt_unit_config(&pcnt_config);
pcnt_counter_pause(PCNT_UNIT);
pcnt_counter_clear(PCNT_UNIT);
pcnt_counter_resume(PCNT_UNIT);
Serial.println("Frequency_Hz");
}
void loop() {
int16_t count = 0;
pcnt_counter_clear(PCNT_UNIT);
delay(COUNT_TIME_MS);
pcnt_get_counter_value(PCNT_UNIT, &count);
// count = 每秒脉冲数 = 频率(Hz)
Serial.println(count);
}
FG-3C — UART读取
FG-3C在UART模式下通过引脚4以115200波特传输ASCII场值。
// FG-3C UART读取示例
// 通过硬件UART从FG-3C传感器读取磁场值
//
// 接线(Arduino Mega或ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX(3.3V板需通过电平转换器)
//
// Arduino Uno(无硬件Serial1):在引脚10、11上使用SoftwareSerial
// ESP32:使用Serial2或任何可用的UART
void setup() {
Serial.begin(115200); // USB串行——用于输出到PC
Serial1.begin(115200); // 硬件UART——连接到FG-3C Pin 4
Serial.println("FG-3C UART读取器");
Serial.println("Field_nT");
}
void loop() {
// 从FG-3C读取一行(以换行符结束)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();
if (line.length() > 0) {
float fieldNT = line.toFloat();
// 输出到USB串行进行监控
Serial.println(fieldNT, 1); // 1位小数
}
}
}
备注
在Arduino Uno(单硬件UART)上,请在空闲数字引脚上使用SoftwareSerial库。SoftwareSerial限于较低的可靠波特率;在Uno上使用115200时,请使用具有硬件UART的板(Mega、ESP32、Leonardo)。
读取多个FG-3+传感器(3轴或梯度仪)
对于3轴系统或梯度仪,在不同引脚上测量每个传感器:
// 多传感器FG-3+周期测量
// 在引脚2、3、4上读取3个传感器(例如用于3轴传感器组件)
//
// 接线:
// 传感器X OUT -> Pin 2
// 传感器Y OUT -> Pin 3
// 传感器Z OUT -> Pin 4
// 3.3V板所有均通过电平转换器
const int PINS[3] = {2, 3, 4};
const char* AXIS[3] = {"X", "Y", "Z"};
void setup() {
Serial.begin(115200);
for (int i = 0; i < 3; i++) {
pinMode(PINS[i], INPUT);
}
Serial.println("Axis,Period_us");
}
void loop() {
for (int i = 0; i < 3; i++) {
unsigned long highTime = pulseIn(PINS[i], HIGH, 100000UL);
unsigned long lowTime = pulseIn(PINS[i], LOW, 100000UL);
if (highTime > 0 && lowTime > 0) {
unsigned long period = highTime + lowTime;
Serial.print(AXIS[i]);
Serial.print(",");
Serial.println(period);
}
}
delay(200); // 每轴约5 Hz
}