本次的项目中,需要使用到mega2560来读取sick位移传感器的模拟量,再把模拟量进行转换,从而使得到的数据为位移传感器的示数。
下面是位移传感器的接线图:棕色线接+24v,蓝色线接0v,白色线为模拟量输出线,根据产品手册,模拟输出线输出的是4-20ma,注意:arduino和单片机的模拟量输入端口基本都只能读取模拟电压,而这里是模拟电流,所以是没法直接读取的,需要一个电流转电压模块。
从上面接线的性描述可以看出,这里使用的是三线制。下面是一张三线制电流转电压模拟量的接线图。注意:这种电流转电压模块需要带隔离的,否则读出来的示数会波动较大,从而降低精度,除此之外还要注意共地的问题,也有可能会影响精度。
在arduino上接线的时候,不止要接模拟电压输出线放在它的模拟量输入口,还需要把模块的地和mega2560的地接在一起,这样才有电势差,才能读出示数。
连接好所有线后,便可以使用串口助手测得数据,这时得到的数据只是模拟量,mega2560的ad转换位数是2的10次方,也就是1024,我们需要创建一个映射,使得量程和mega2560的ad位数匹配,如下:
double displacement=map(sensorValue, 0, 1023, minDisplacement, maxDisplacement)
注意:如果你使用int类型,并且对该表达式进行了一些线性的变换,例如:
int displacement = 200+((map(sensorValue, 0, 1023, minDisplacement, maxDisplacement)-1121)/126)*100;
此时读取的数据很可能是整百整百的,我们需要把int类型改为double类型,具体原因是因为int类型做除法是取整。
此时你可以测得一个数字,并且在你增大位移传感器示数的时候,该模拟量也不断增大,但是这时你还无法让所得数据和位移传感器示数同步,你需要对传感器进行标定,重新修改他们的关系,比如上面一行代码,就是我找到的函数关系,虽然还存在一些小问题,但是是完全够用的。此时,你便可以得到较为准确的示数啦。
下面是全部的mega2560实现代码:
#define RX_PIN 19
#define TX_PIN 18
// 定义电机控制引脚
#define DIRECTION_PIN 46
#define PULSE_PIN 47
#define MOTOR_PIN 9
#define sensorPin A0
// 定义位移传感器的最小和最大位移值
const int minDisplacement = 200; // 最小位移(mm)
const int maxDisplacement = 4000; // 最大位移(mm)
char command = '0'; // 初始值设为 '0'
void setup() {
pinMode(DIRECTION_PIN, OUTPUT);
pinMode(PULSE_PIN, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
digitalWrite(MOTOR_PIN, LOW);
// 初始化串口通信
Serial.begin(9600);
pinMode(RX_PIN, INPUT);
pinMode(TX_PIN, OUTPUT);
}
void loop() {
// 设定转动方向(逆时针)
digitalWrite(DIRECTION_PIN, HIGH);
if (Serial.available() > 0) {
command = Serial.read();
if (command == '1') {
digitalWrite(MOTOR_PIN, HIGH); // 开始转动电机
} else if (command == '0') {
digitalWrite(MOTOR_PIN, LOW); // 停止电机
}
}
// 发送脉冲信号
if (digitalRead(MOTOR_PIN) == HIGH) {
digitalWrite(PULSE_PIN, HIGH);
delayMicroseconds(300); // 脉冲持续时间,根据实际情况调整
digitalWrite(PULSE_PIN, LOW);
delayMicroseconds(300); // 脉冲间隔时间,根据实际情况调整
}
// 读取传感器值
double sensorValue = analogRead(sensorPin);
// 将模拟电压转换为位移值
double displacement = 200+((map(sensorValue, 0, 1023, minDisplacement, maxDisplacement)-1121.0)/126.0)*100.0;
// 输出位移值到串口
Serial.println(displacement);
// 等待一段时间
delay(1000); // 每隔一秒读取一次传感器值
}
中途问题:
1.在测量200-900mm的时候,发现所得串口数值都是不变的,这是因为传感器内部设置的问题,传感器内部设置在900mm以下的时候,都处于4ma以下的一个固定值,所以不管你怎么增大距离,得到的串口数值是不变的,这需要你联系商家,询问他们这一块的设置问题。同理,在20ma时,也会设置一个最大量程,如果你的量程超过了这个示数,那么它依然只输出20ma,你得到的串口数值也会达到一个最大量,你再增大你的位移传感器示数,你得到的串口值也不会变化,此时,需要你在传感器的设置中更改它在20ma时的最大量程。
2.如何知道是不是上述问题?
当你观察到串口数值不变时,增大位移传感器示数,并不断测量模拟输出线和负线之间的电流,若电流不变,则说明是上述问题。
3.如何确保电流转电压模块是正常工作的?
在你测的上述问题2中的电流为4ma时,去测量电流转电压模块的电压输出端和gnd,查看他的电压是否为0v,然后逐渐增大前面的电流,查看电压是否会逐渐变大,并在电流为20ma时,测得电压为5v,如果没有,则说明电流转电压模块可能损坏了。