2026/5/21 12:25:00
网站建设
项目流程
深圳专门网站制作,长链接变短链接在线生成,网站分析实例,网站快速排名案例可调量程智能压力开关#xff0c;采用STC15单片机设计#xff0c;RS485modbus输出#xff0c;4-20mA输出#xff0c;继电器输出#xff0c;带数码管显示#xff0c;提供原理图#xff0c;PCB#xff0c;源程序。
可连接上位机实现远程监控#xff0c;RS485使用modbus协…可调量程智能压力开关采用STC15单片机设计RS485modbus输出4-20mA输出继电器输出带数码管显示提供原理图PCB源程序。 可连接上位机实现远程监控RS485使用modbus协议标定方法简单使用三个按键实现标定和参数设定掉电数据不会丢。 有反接和过压过流保护。最近在折腾一个工业级的智能压力开关项目用上了STC15这颗老当益壮的单片机。这玩意儿最大的亮点是自带硬件EEPROM对需要掉电保存标定数据的场景特别友好。先上个全家福4-20mA电流环输出、双路继电器、数码管显示最骚的是RS485还能玩Modbus通讯连上位机搞远程监控稳得一批。硬件部分有几个关键设计点值得唠唠电源入口加了SS34二极管防反接TVS管配自恢复保险丝的过压过流保护组合拳实测能扛住24V接反。模拟前端用的是TI的XTR117电流环芯片这里有个坑要注意——压力传感器的mV信号得先做偏置调整才能喂给XTR不然4mA零点死活调不准。原理图里专门设计了运放调理电路通过更换不同量程的传感器跳线选择对应的放大倍数。![示意图]//ADC采集核心代码STC15的10位ADC uint get_pressure_adc(){ ADC_CONTR 0x88 | 0; //选择通道0启动转换 while(!(ADC_CONTR 0x20)); //等待转换完成 ADC_CONTR ~0x20; //清标志 return (ADC_RES 2) | ADC_RESL; //合并10位结果 }这段代码有个骚操作——STC15的ADC结果寄存器是分开高低位的得用位运算拼起来。实测发现上电后前三次采样值波动较大所以我在初始化时故意丢弃了前三个采样值。标定逻辑是项目的灵魂所在。三个按键玩出花长按SET键进入标定模式这时候数码管会切换显示零点4mA对应值和满量程20mA对应值。具体操作是给传感器施加零点压力时按OK键满量程压力时再按一次自动计算线性参数。关键数据保存在EEPROM的0x2000地址区掉电十年都不丢。//EEPROM存储结构体 typedef struct{ uint zero_point; //零点AD值 uint full_point; //满量程AD值 float k_coeff; //线性系数 } CalibParams; void save_calibration(){ CalibParams params; params.zero_point ad_zero; params.full_point ad_full; params.k_coeff (20.0 - 4.0)/(ad_full - ad_zero); ISP_CONTR 0x81; //使能ISP操作 sector_erase(0x2000); byte_write(0x2000, (uint8*)params, sizeof(params)); ISP_CONTR 0; //关闭ISP }注意STC15的EEPROM其实是Flash模拟的写之前必须整扇区擦除。我专门做了数据校验机制如果读取的校验码不对就自动恢复出厂参数。Modbus协议处理用了状态机实现比裸写if判断优雅得多。帧超时控制在30ms完美兼容主流组态软件。有个小技巧——把保持寄存器地址映射到结构体直接用指针操作省去一堆赋值语句。//Modbus寄存器映射技巧 #pragma pack(1) typedef struct{ uint16 pressure; //寄存器40001 uint16 max_range; //寄存器40002 uint16 alarm_h; //寄存器40003 uint16 alarm_l; //寄存器40004 } ModbusRegs; #pragma pack() ModbusRegs *mb_reg (ModbusRegs*)0x30; //指定内存区域 //在定时器中更新压力值 mb_reg-pressure current_pressure * 10; //扩大10倍保持精度工业现场最怕通讯干扰我在每个modbus帧处理完成后都会重置看门狗。实测在变频器旁边也能稳定通讯这波稳了。继电器控制逻辑有点意思除了基本的上下限报警还做了回差处理防止频繁跳动。比如设定上限10MPa时实际会在9.8MPa断开10.2MPa吸合这个滞回区间可调。//继电器状态判断 if(pressure (alarm_high hysteresis)){ RELAY_HIGH 1; }else if(pressure (alarm_high - hysteresis)){ RELAY_HIGH 0; } //同理处理低压继电器最后说说调试踩过的坑4-20mA输出刚开始线性度总是不好后来发现是PCB布局时电流环芯片的地没处理好。改成分离地单点连接后精度直接怼到0.5%FS。数码管驱动用了74HC595级联动态扫描时要注意消影不然会有拖尾现象。整个项目开源了立创EDA的工程文件和KEIL源码需要自取的老铁可以评论区留言。下期准备魔改个支持HART协议的版本想看的兄弟点个关注呗。