单片机串口通信,使用串口通信控制设备,pc端界面使用javafx开发,后台使用java语言开发,使用java语言通过串口通信控制单片机外围设备,
控制的设备是气体流量控制器,气体流量控制器排气量,根据压力传感器返回的压力值控制气体流量控制器排气量,能够实现压力值稳定到配置的压力
值左右,通过调节气体流量控制器的排气量实现实验舱内压力稳定在配置的压力值附近。目前现象是压力值和排气量比例关系不确定。
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
return;
}
byte[] newData = new byte[serialPort.bytesAvailable()];
if (newData.length < 9) {
logger.info("receive package error! length little 9 " + ProtoUtil.hex(newData));
return;
}
serialPort.readBytes(newData, newData.length);// 读取串口的数据
//检查数据的起始标记,俩个字节
if ((byte) 0xad == newData[0] && (byte) 0xba == newData[1]) {
//第4个字节是命令编码el
if ("e1".equals(String.format("%2x", newData[3]))) {
//只保留完整的数据,就是31个字节
if (newData.length == 31) {
//保存从串口读取的数据到队列里
communicationService.getReceiveQueue().add(newData);
}
} else {
//保存从串口读取的数据到队列里
communicationService.getReceiveQueue().add(newData);
}
}
commlogger.info("RECEIVE: " + ProtoUtil.hex(newData));
// msgListener.processMessage(newData);
}
});
} else {
//未打开串口,添加心跳检测定时任务
isConnected = false;
logger.info("Failed connect port: " + portName);
commlogger.info("Failed connect port:" + portName);
//添加心跳监控
serialPortHeartBeat(portName);
}
//添加心跳监控
// serialPortHeartBeat(portName);
}
有一些数据对应的效果,不能实现预期。
压力差使用分段法,分段控制压力对应的排气量。
类似PID算法达到的效果,实际值会接近目标值,开始的时候实际值会快速的接近目标值,到达目标值后实际值就会等于目标值。
之前做了一个类似的项目,但是是使用c#联合plc的。用压力及流量传感器进行模拟量输入,得出的数据进行峰值处理及报警limit的设置,然后plc输出电磁阀开闭。感觉还是plc比较简单。你这个项目实验舱的压力是多少,精度要求多少。
从描述来看,这不是一个超前滞后系统,传感器是及时响应,控制器也是及时控制,在传感器没有外界扰动的情况下,保持控制目标,也就是气压稳定,理论上是一个很干净的控制系统,使用PI就可以做到稳定。压力值和排气量比例关系不确定并不重要,只要可以确定他是个单调的关系,那PI就可以解决。直接套公式就行了,参数要自己调。
可以使用PID算法实现,参考
https://en.wikipedia.org/wiki/PID_controller
粘贴的代码块并不是控制模块的插入区,这只是串口数据接收处理点,现在排气控制变量,压力值啥都没有 咋做呀!
用机器学习,让它自己掌握规律
看看有没有帮助
https://b23.tv/wxz3CHx
供参考:
【模糊pid算法实现(Java)】https://mbd.baidu.com/ma/s/V5KKpRNU