描述
<p>注:*为必填项。</p>
<p>【请在报名阶段填写 ↓】
<em> 简要介绍作品:
该设备通过串口与计算机通讯,计算机可以通过串口来控制继电器的开合以及模拟自复位开关;同时还具备四路电压检测通道,可以检测5~50V的电压输入,且通过光耦隔离。因此为实现计算机控制监测现场设备及远程控制监测提供了硬件条件。
【请在竞赛阶段填写 ↓】
</em> 一、作品详情;
该硬件由电压转换模块,串口通讯模块,继电器驱动模块,电压信号采集模块四部份组成。电源接口采用常见的12V,12V给输入光耦供电,同时驱动继电器。并且12V经78M05转化后给·MCU供电。输入通道通过光耦隔离输入,可有效地保护硬件安全。继电器采用集成8路达林顿管的ULN2803来驱动,该芯片内部的泄流二极管有效避免了继电器感性线圈断电时产生的反向电动势对元器件的损害,同时是的外围电路简单,减少因器件故障带来的故障率。串口通讯模块采用USB转TTL芯片ch340c,该芯片自带内部晶振,连接可靠,外围电路简单。
串口IO具有输入检测及输出功能且均通过串口控制。
1 输出端口采用继电器,达到电器隔离,实现弱电控制强电,满足工业控制需求;输出端口继电器可实现常闭、常开、自复位功能,可以代替现场中任意按键控制设备实现远程控制;继电器触点处均并联压敏电阻,当断开感性负载时可以保护继电器触点。
2 输入端口采用光耦隔离,满足工业现场使用需求;通过选用不通电阻可实现对不同输入电压的检测,与此同时还可实现5~30V的宽电压检测。向串口发送查询字节命令时,串口返回一字节,该字节低四位代表四路输入通道状态,通道电压为5V~30V时对应通道二进制为0,通道电压低于5V时对应二进制为1。
* 二、描述作品所面临的挑战及所解决的问题;
随着5G技术及互联网技术的发展,传统制造业要向着信息化数字化转型。传统设备大多数为独立设备按键操作,不能满足互联及数字化需求。更换新设备价格高昂不现实,因此改造现有设备很有必要。针对传统设备多采用按键操作这一特点,开发了串口IO设备。利用串口控制的继电器代替设备按键控制设备,并且读取设备上的电压信息,架起了传统设备与计算机之间的桥梁。
1 解决了信息化及物联网的发展对传统工业设备提出的新需求。互联网及计算机技术的发展使得在将来各种设备必然要同时满足现场控制和远程计算机控制两种需求。该串口IO硬件电路通过串口与计算机之间通讯,实现了现场设备与计算机之间的的信息互通,在传统设备与信息化物联网之间搭建了桥梁。
2 解决了严苛工业环境下的可靠性问题
输入端通过光耦隔离达到安全输入的目的;输出端采用继电器加压敏电阻可实现弱电控制强电,以及对感性负载等多种负载的适应性。</p>
<p><em> 三、描述作品硬件、软件部分涉及到的关键点;
一:硬件
1 继电器线圈在断电时会产生高达几百伏的感应电压,持续时间约为100微妙,该电压会对硬件造成损害,因此选择合适的方式来驱动继电器线圈至关重要。本 方案采用达林顿管来驱动继电器线圈,达林顿管内部反向并联了泄流二极管,对线圈突然断电后产生的反相感应电压起到很好的抑制作用,有效的保护了电 路。
2 光耦在一定范围的输入电流下均起到开关作用,只要通道电压产生的电流大于光耦开通电流且小于光耦额定工作电流,输入通道均可检测出电压信号,因此输入通道可承受较宽的电压范围。经测试该硬件可检测的电压范围是5V~30V。
3 简单可靠的串口通讯
二:软件
该模块支持工业上常用的MODBUS协议。支持0x01 ,0x06命令,设备地址0x03.。可以读取输入通道状态,也可以读取读取继电器状态,还可以同时读取两个寄存器状态。五路输出继电器通过一个寄存器控制。
</em> 四、作品材料清单;
1 宏发12VDC-1ZS继电器
<em> 2 东芝TLP521直插光耦</em>
3 STC15W401AS
<em> 4 沁恒CH340C</em>
5 78M05
<em> 6 压敏电阻10D471K</em>
7 0805贴片电阻
8 0805贴片电容
9 IN4148二极管
10 220uf电解电容
11 mini usb接口,12VDC接口,QHUIKJ拔插式5.08接线端子
* 五、作品图片上传;(PCB上须有大赛logo标识并拍照上传,若无视为放弃参赛)
1 原理图
<img src="//image.lceda.cn/pullimage/pum85gpHVapLZ1s08gG23J4BEHG8cnuFJZ1Ogvs1.png" alt="原理图">
2 PCB
<img src="//image.lceda.cn/pullimage/CgNgU3HDVIOr9iDiGJm6CeN17razAFAJerxjzmeY.png" alt="PCB">
六、演示您的作品并录制成视频上传;(视频内容须包含:作品介绍;功能演示;性能测试;PCB上大赛logo标识特写镜头,若无视为放弃参赛)
演示视频在附件《演示视频》文件中
七、开源文档。
程序中采用了部分STC官网例程,特此说明!程序如下:</p>
<h1>include "STC15.h"</h1>
<h1>define MAIN_Fosc 11059200L //定义主时钟</h1>
<h1>define Baudrate1 38400L</h1>
<p>#define UART1_BUF_LENGTH 32</p>
<p>typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;</p>
<p>u8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志
u8 RcevFlag ; //帧接收完成标志
u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
//u8 idata RX1_Buffer[0x04,0x06,0x20,0x21,0x00,0xff,0xdf,0x93]; //接收缓冲
u8 idata TX1_Buffer[10];</p>
<p>u8 Adress =0x04; //模块地址
u16 RelayAdress=0x2002; //继电器寄存器地址
u16 InAdress =0x2001; //输入通道寄存器</p>
<p>u8 RelayStateL;
u8 InStateL;</p>
<p>u16 RecvAdress ;
u16 RecvNum ;</p>
<p>u16 T0InitNum;</p>
<p>u8 EmgcStop;
u8 Power;
u8 Close;
u8 Stop;
u8 Open;</p>
<p>u8 In1State;
u8 In2State;
u8 In3State;
u8 In4State;</p>
<p>u16 crc;</p>
<p>sbit Relay1 = P1^0;
sbit Relay2 = P3^7;
sbit Relay3 = P3^6;
sbit Relay4 = P3^3;
sbit Relay5 = P3^2;</p>
<p>sbit In1 = P1^2;
sbit In2 = P1^3;
sbit In3 = P1^4;
sbit In4 = P1^5;</p>
<p>void UART1_config(void); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void Timer0_init(void);
void delay_ms(u8 ms);
void GetInState(void);
void GetRelayState(void);
u16 CRC16(u8 *buf,u8 len);</p>
<p>//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void main(void)
{
u8 i;
// P0M1 = 0; P0M0 = 0; //设置为准双向口
// P1M1 = 0; P1M0 = 0; //设置为准双向口
// P2M1 = 0; P2M0 = 0; //设置为准双向口
// P3M1 = 0; P3M0 = 0; //设置为准双向口
// P4M1 = 0; P4M0 = 0; //设置为准双向口
// P5M1 = 0; P5M0 = 0; //设置为准双向口
// P6M1 = 0; P6M0 = 0; //设置为准双向口
// P7M1 = 0; P7M0 = 0; //设置为准双向口
Relay1=0;
Relay2=0;
Relay3=0;
Relay4=0;
Relay5=0;
T0InitNum=65536-MAIN_Fosc*40/Baudrate1 ;</p>
<p>UART1_config(); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
Timer0_init();
EA = 1; //允许总中断
while (1)
{
if(RcevFlag==1)</p>
<p>{
ES = 0; //解析帧时关闭串口
if(RX1_Buffer[0]==Adress)
{
if(RX1_Buffer[1]==0x03)
{ TX1_Buffer[0]=RX1_Buffer[0];
TX1_Buffer[1]=RX1_Buffer[1];
TX1_Buffer[2]=RecvNum*2;
TX1_Buffer[3]=0x00;
CRC16(RX1_Buffer,6); //首先进行CRC校验
TX1_Buffer[5]=crc;
TX1_Buffer[6]=crc>>8;
if(RX1_Buffer[6]==TX1_Buffer[5]&&RX1_Buffer[7]==TX1_Buffer[6])//CRC校验通过
{
RecvAdress = (RX1_Buffer[2]8; //存放校验高位
if(RX1_Buffer[6]==TX1_Buffer[5]&&RX1_Buffer[7]==TX1_Buffer[6])
{
RecvAdress = (RX1_Buffer[2]4;
if((RX1_Buffer[5]&0x08)>>3)
{
Relay2=1;
}
if((RX1_Buffer[5]&0x04)>>2)
{
Relay3=1;
}
if((RX1_Buffer[5]&0x02)>>1)
{
Relay4=1;
}
if(RX1_Buffer[5]&0x01)
{
Relay5=1;
}
ES = 1; //解析完成时打开 串口
while(TX1_Cnt= UART1_BUF_LENGTH) TX1_Cnt = 0;
}
}
delay_ms(50);
Relay2=0;
Relay3=0;
Relay4=0;
Relay5=0;</p>
<p>}
}
else
{
//CRC校验错误
}
}
}
for(i=0;i</p>
评论(5)