加工定制否 | 品牌PNI |
型号RM3100 | 种类多圈 |
材料玻璃釉膜 | 性能功率 |
货号RM3100 | 用途*** |
阻值调节方式旋转式 | 阻值变化方式Z式(对数式) |
标称阻值RM3100 | 额定功率0.25W |
阻值允许偏差±10% | 滑动噪声RM3100V |
分辨率RM3100% | 零位电阻RM3100Ω |
接触电阻RM3100Ω | 绝缘电阻RM3100MΩ |
符合度RM3100 | 是否跨境货源否 |
RM3100智能交通地磁传感器PNI 13101 13156 13104
PNI sensor地磁传感器RM3100对车辆存在性检测原理
#ifndef MAG3110_H
#define MAG3110_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "stdbool.h"
#include "stdint.h"
#define uchar unsigned char
#define uint unsigned int
#define byte unsigned char
#define word unsigned int
#define byte unsigned char
typedef union
{
byte Byte;
struct {
byte _0 :1;
byte _1 :1;
byte _2 :1;
byte _3 :1;
byte _4 :1;
byte _5 :1;
byte _6 :1;
byte _7 :1;
} Bit;
} BIT_FIELD;
typedef union
{
word mword;
struct
{
byte hi;
byte lo;
} mbyte;
} tword;
enum
{
MAG3110_STATUS_00 = 0, // 0x00
MAG3110_OUT_X_MSB, // 0x01
MAG3110_OUT_X_LSB, // 0x02
MAG3110_OUT_Y_MSB, // 0x03
MAG3110_OUT_Y_LSB, // 0x04
MAG3110_OUT_Z_MSB, // 0x05
MAG3110_OUT_Z_LSB, // 0x06
MAG3110_WHO_AM_I, // 0x07
MAG3110_SYSMOD, // 0x08
MAG3110_OFF_X_MSB, // 0x09
MAG3110_OFF_X_LSB, // 0x0A
MAG3110_OFF_Y_MSB, // 0x0B
MAG3110_OFF_Y_LSB, // 0x0C
MAG3110_OFF_Z_MSB, // 0x0D
MAG3110_OFF_Z_LSB, // 0x0E
MAG3110_DIE_TEMP, // 0x0f
MAG3110_CTRL_REG1, // 0x10
MAG3110_CTRL_REG2, // 0x11
};
//mag3110状态
typedef enum{
SENSOR_INIT = 0,
NO_CAR_DETECTED,
COUNT_HIGH,
CAR_DETECTED,
COUNT_LOW,
SENSOR_ERROR,
SENSOR_UNINIT,
}mag3110_state_t;
//地磁状态,少了中间过程
typedef enum{
INIT = 0,
NO_CAR,
CAR,
ERROR,
UNINIT,
}sensor_state_t;
typedef enum
{
GEO_STATE_REPORT_JURA = 1,
GEO_STATE_REPORT_BLE,
GEO_RESET,
GEO_CALIBRATION,
GEO_THRESHOLD_REQUEST,
GEO_THRESHOLD_REPORT,
GEO_THRESHOLD_SET,
GEO_DETEC_INTERVAL_REQUEST,
GEO_DETEC_INTERVAL_REPORT,
GEO_DETEC_INTERVAL_SET,
}comand_type_t;
typedef struct sensor_config{
int32_t x_offset;
int32_t y_offset;
int32_t z_offset;
int32_t low_threshold;
int32_t high_threshold;
int32_t detect_interval;
uint8_t crc;
}sensor_config_t;
typedef struct sensor_infor {
uint8_t baterry;
uint8_t sensor_state;
uint8_t mif;//magnetic_interference
uint8_t parking_done;//0表示稳定,其他不稳定
}sensor_infor_t;
typedef struct sample_data{
int16_t x;
int16_t y;
int16_t z;
uint32_t d;
}sample_data_t;
#define SAMPLE_WINDOW 1
#define DETECT_INTERVAL 3
#define LOW_THESHOLD 500
#define HIGH_THESHOLD 5000
#define MIF_THESHOLD 100000
#define CALIBRATION_WINDOW 3
#define MAG3110_IIC_ADDRESS 0x1C
#define PARKING_SAMPLE 3
#define STATUS_00_REG 0x00
//
#define ZYXOW_BIT Bit._7
#define ZOW_BIT Bit._6
#define YOR_BIT Bit._5
#define XOR_BIT Bit._4
#define ZYXDR_BIT Bit._3
#define ZDR_BIT Bit._2
#define YDR_BIT Bit._1
#define XDR_BIT Bit._0
//
#define ZYXOW_MASK 0x80
#define ZOW_MASK 0x40
#define YOR_MASK 0x20
#define XOR_MASK 0x10
#define ZYXDR_MASK 0x08
#define ZDR_MASK 0x04
#define YDR_MASK 0x02
#define XDR_MASK 0x01
#define OUT_X_MSB_REG 0x01
#define OUT_X_LSB_REG 0x02
#define OUT_Y_MSB_REG 0x03
#define OUT_Y_LSB_REG 0x04
#define OUT_Z_MSB_REG 0x05
#define OUT_Z_LSB_REG 0x06
#define WHO_AM_I_REG 0x07
#define MAG3110Q_ID 0xC4
#define SYSMOD_REG 0x08
//
#define SYSMOD1_BIT Bit._1
#define SYSMOD0_BIT Bit._0
//
#define SYSMOD1_MASK 0x02
#define SYSMOD0_MASK 0x01
#define SYSMOD_MASK 0x03
#define STANDBY_MASK 0x00
#define ACTIVE_MASK 0x01
#define CORRECT_MASK 0x02
#define OFF_X_MSB 0x09
#define OFF_X_LSB 0x0A
#define OFF_Y_MSB 0x0B
#define OFF_Y_LSB 0x0C
#define OFF_Z_MSB 0x0D
#define OFF_Z_LSB 0x0E
#define DIE_TEMP 0x0F
#define CTRL_REG1 0x10
//
#define DR2_BIT Bit._7
#define DR1_BIT Bit._6
#define DR0_BIT Bit._5
#define OS1_BIT Bit._4
#define OS0_BIT Bit._3
#define FR_BIT Bit._2
#define TM_BIT Bit._1
#define AC_BIT Bit._0
//
#define DR2_MASK 0x80
#define DR1_MASK 0x40
#define DR0_MASK 0x20
#define OS1_MASK 0x10
#define OS0_MASK 0x08
#define FR_MASK 0x04
#define TM_MASK 0x02
#define AC_MASK 0x01
//
#define DATA_RATE_125US 0x00
#define DATA_RATE_250US DR0_MASK
#define DATA_RATE_50MS DR1_MASK
#define DATA_RATE_100MS DR1_MASK+DR0_MASK
#define DATA_RATE_200MS DR2_MASK
#define DATA_RATE_800MS DR2_MASK+DR0_MASK
#define DATA_RATE_1600MS DR2_MASK+DR1_MASK
#define DATA_RATE_6400MS DR2_MASK+DR1_MASK+DR0_MASK
#define CTRL_REG2 0x11
//
#define AUTO_MRST_EN_BIT Bit._7
#define RAW_BIT Bit._5
#define MAG_RST_BIT Bit._4
//
#define AUTO_MRST_EN_MASK 0x80
#define RAW_MASK 0x20
#define MAG_RST_MASK 0x10
extern bool mag3110_init(bool hi_speed);
extern void mag3110_start(void);
extern void restart_mag3110_timer(bool hi_speed);
extern void mag3110_event_handler(void);
extern void mag3110_recalibration(void);
extern void mag3110_sample_task(void);
extern bool get_mag3110_config(void);
extern bool set_mag3110_config(void);
#ifdef __cplusplus
}
#endif
#endif
地球磁场的强度在0.5 至0.6 高斯,地球磁场在很广阔的区域内(大约几公里)其强度是一定的。当一个铁磁性物体,如汽车,置身于磁场中,它会使磁场扰动,如图1,此时,放置于其附件的地磁传感能测量出地磁场强度的变化,从而对车辆的存在性进行判断。
汽车对地磁场的扰动
对于车辆的存在和方向检测,不需要象对车辆进行分类时那么详细的信息,所以只需将磁传感器放置在路边,沿着被检测的车道即可,而不需要在车道上挖坑埋入磁传感器。三轴磁传感器放在距地面1英尺高的位置,X、Y、Z轴方向定义如图2所示。
车辆与磁传感器初始化设置
沿着向上方向的Z轴磁场可用来检测车辆的存在,如图3,轿车经过时Z轴的曲线,该曲线的特点是: 当传感器与车辆平行时出现峰值。当在车辆距传感器1英尺的情形下,对该曲线进行平滑处理后,可用来指示车辆的存在。通过建立合适的阀值,可以滤掉旁边车道的车辆或远距离车辆带来的干扰信号。
轿车经过时Z轴磁传感器的曲线图
除了上述沿着向上方向的Z轴检测到手磁场变化可用来检测车辆的存在,检测车辆存在的另一方法是观察磁场变化的大小,也就是计算出整个地磁场在汽车经过时的磁场强度变化情况,从面判断出有无汽车经过: 磁场的大小=(X^2+Y^2+Z^2)^1/2
图4显示了磁传感器距车辆1 英尺、5 英尺、10 英尺和21 英尺时,一辆轿车通过所产生的曲线。在不同距离下,Z轴的曲线形状很相似,但是信号强度却大不相同。从1英尺到5英尺,信号强度衰减得非常快。距离越远,数值快速衰减。当传感器只检测单一车道车辆,而忽略其他车道车辆的存在时,这种特点非常有用。
轿车经过时磁场强度的变化曲线
磁传感器在1 至4 英尺的路边检测距离范围内可以工作得很好。通过观察磁场的变化,可以确定通过车辆的存在。这种检测方法的好处是不用将传感器及相关电路埋在地底,磁传感器也可以安装在铝制外壳中。