1. 硬件部分(开发板外围)
1.1 DS18B20——数字温度传感器(测量充电桩表面温度)(充电桩正常温度范围是-20~50°C)
(1)传感器参数
VDD:电源输入(3.0V - 5.5V)
GND:地
DQ:数字输入/输出(单总线(OneWire协议))
工作电压:3.0V - 5.5V
测量温度范围:-55°C到+125°C(适用充电桩内部温度测量)
精度:-10°C到+85°C范围内为±0.5°C,其余范围内略有下降
分辨率:可编程的9到12位分辨率,默认值为12位(精度为0.0625°C)
数据位输入:一次传输两个字节十六个比特,前十二位是温度整数位,后四个字节是温度小数位,所以分辨率是0.0625°C
(2)选型原因
1. 适配开发板的GPIO单总线传输、输入电压范围(3~5.5V)
2. 测量精度范围是±0.5°C,适用
3. 当初温度传感器在DS18B20与DHT11之间进行选型,相比DHT11测量精度更高,测量温度范围更大,且不需要测量湿度,节省数据传输开销
(3)涉及知识点与传感器工作原理
<1>单总线协议(OneWire协议)
(1)定义
单总线协议是一种用于单根数据线进行通信的串行通信协议,只需要一根数据线同时进行数据传输和设备控制
(2)原理
1. 主设备(2440)通过定时器(或延时函数),有时间间隔的控制数据线上的高低电平变化,来发送和接收数据
从设备(DS18B20)通过接收主设备发送的电平信号将采集的数据通过数据线发送给主设备(2440)
2. 复位序列:主控设备通过发出一段时间的低电平信号来初始化总线,通知设备开始通信准备
3. 写入时序:主控设备通过在数据线上发送特定的时序脉冲来传输命令或数据给从设备
4. 读取时序:主控设备发送命令后,从设备会在数据线上以时序脉冲形式回复数据
5. 响应确认:从设备在接收到命令或数据后,通常会通过一定的时序脉冲回复确认信号
<2> 2440与DS18B20通信的实质:通过2440的GPIO引脚,按照单总线协议(OneWire),遵照DS18B20使用手册中的时序,完成2440对DS18B20的读写数据访问,最后将DS18B20寄存器中存储的数据传回应用程序
<3>2440与DS18B20的通信时序流程
1. 使用杜邦线将传感器与2440连接起来,DS18B20的数位线接到2440上CON4寄存器的EINT3(12)GPIO引脚上
2. 主控设备产生复位脉冲(通知从设备准备通信)
数据线上空闲状态时,为高电平,要产生复位脉冲时,主控设备2440将数据线电平拉低至少480us,之后主控设备释放总线,总线变为高电平
3. 从设备产生存在脉冲(确认从设备存在,准备通信)
从设备(DS18B20)侦测到复位脉冲并等待15~60微妙之后,从设备发送存在脉冲,将总线电平拉低60~240us,之后释放总线,若之后总线变为高电平的空闲状态,则2440与DS18B20间已经准备好开始通信
4. 之后主设备发送温度采集命令,从设备开始进行温度采集,随后从设备开始采集并发送数据,主设备接收到十六位的数据,采集结束。
1.2 MQ-7——(CO浓度采集)
一氧化碳的浓度达到100 ppm(百万分之一)时就可能存在火灾爆炸的危险
(1)传感器参数
VCC:电源输入(2.5V - 5.0V)
GND:地
AOUT:模拟量输出(单总线(OneWire协议))
DOUT:数字量输出
(2)选型原因
1. 输入电压范围(2.5~5.0V),能够适配开发板
2. 小巧轻便、易于集成到各种设备中的特点,使其成为多种应用场合下的理想选择。无论是家庭、工业还是便携式设备,MQ-7传感器都能提供快速、准确的一氧化碳浓度监测,保障人员安全和环境安全
(3)涉及知识点与传感器工作原理
<1>工作原理
MQ-7一氧化碳传感器内部气敏电阻的电导率随着CO浓度的增加而增大,使得AOUT输出的电压值增大,将MQ-7输出的模拟电压值通过杜邦线接入S3c2440的芯片内部的片内TS-ADC上的其中一个通道,通过TS-ADC,通过ADC内部的比较器,将模拟电压采样量化为数字信号,通过配置ADC中断的方式,使用等待队列实现进程间的同步,即进程等待ADC转化时,使用等待队列,将进程挂起并放入等待队列(程序被阻塞),当ADC将模拟信号转化好之后,触发中断,之后在中断服务函数中将等待队列中的进程唤醒,程序继续向下运行,将ADC寄存器中保存的值从内核驱动程序中传到应用程序中。
<2> S3C2440处理器上搭载的ADC(模数转换器)叫做TS-ADC(Touch Screen Analog to Digital Converter)。这个ADC不仅用于一般的模拟信号采集,还特别设计用于触摸屏的输入检测。TS-ADC支持12位分辨率,并且可以处理多个模拟输入通道,非常适合嵌入式系统的应用
<3> 等待队列(同步和阻塞进程)
(1)定义
等待队列(Wait Queue)是操作系统内核中的一种同步机制,用于管理在等待特定事件发生时被阻塞的进程或线程。
(2)作用
等待队列在内核中非常常见,特别是在Linux内核中,常用于处理各种同步和阻塞操作。进程被放入等待队列后,CPU会被分配给其他可以运行的进程。进程被阻塞时,它不会继续执行任何指令,直到等待的事件发生并且进程从等待队列中被唤醒,。一旦等待的事件发生,进程会被移出等待队列,重新加入就绪队列,等待系统调度器再次将其调度到CPU上运行
(3)如何使用
1. 定义一个全局等待队列头变量和一个等待条件变量
2. 初始化等待队列头变量
3. 需要程序同步阻塞时调用等待函数,以中断的方式
4. 在需要结束等待时,改变等待条件变量的值,唤醒程序
1.3 ACR220E三相电表——(测量充电桩电压、电流)
(1)电表参数信息
1. 电压测量范围
相电压:0~400V
线电压:0~690V
2. 电流测量范围
额定电流范围:0~5A
实际测量必须配置不同倍率的电流互感器(CT)来扩展测量范围
3. ACR220E电表默认通过RS-485接口与上位机进行通信
(2)选型原因
1. ACR220E电表通过RS-485接口进行通信,RS-485具有能够长距离传输和抗干扰能力强的优点,是工业中的首选
2. 电表能够通过485转TTL与开发板通信,适配开发板
3. ACR220E三相电表是一种高精度电力计量设备,在工业生产、商业建筑、公共设施中都有使用
(3)电表工作原理和涉及的知识点
<1> ACR220E三相电表
对于本项目来说,电表带有RS-485通讯接口,A、B线,采用MODBUS-RTU协议,能够实现与2440通信。
<2> 三相电和单相电
1. 单相电
单相电是由两根导线(相线和零线)构成的电力供应方式,常用于住宅、办公室、小型商铺
220V/120V
(相线)
|
[负载]
|
(零线)
2. 三相电
三相电是由三根相线(通常标记为A、B、C)和一根零线构成的电力供应方式,常用于工业和大型商业场所,适用于高功率设备
380V
(A相) (B相) (C相)
| | |
[负载] [负载] [负载]
| | |
(零线)
<3> MODBUS协议
1. 定义
MODBUS协议是一种应用广泛的工业通信协议,用于可编程逻辑控制器(PLC)之间的通信。MODBUS协议通过各种类型的物理网络(如串行线路、以太网等)进行通信,支持主从模式,允许一个设备(主机)向多个设备(从机)发送指令,并接收它们的响应。MODBUS协议有几种常见的变体,主要包括MODBUS RTU、MODBUS ASCII和MODBUS TCP/IP
2. 分类
(1)MODBUS RTU(Remote Terminal Unit)
- 使用二进制编码的数据。
- 每个数据帧由起始标志、从地址、功能代码、数据、错误检查码(CRC)和结束标志组成。
- 高效但不易调试。
数据帧格式
| 起始标志 | 从地址 | 功能代码 | 数据 | CRC校验码 | 结束标志 |
(2)MODBUS ASCII
- 使用ASCII字符编码的数据。
- 每个数据帧由冒号(:)作为起始标志,数据域,LRC(纵向冗余校验)和回车/换行作为结束标志组成。
- 便于调试但效率较低。
数据帧格式
: 起始标志
| 起始标志(:) | 从地址 | 功能代码 | 数据 | LRC校验码 | 结束标志(\r\n) |
(3)MODBUS TCP/IP
- 使用TCP/IP协议在以太网上传输MODBUS消息。
- 每个数据帧包含一个固定的MODBUS应用协议头(MBAP),包括事务处理标识符、协议标识符、长度字段和单元标识符
数据帧格式
| 事务处理标识符 | 协议标识符 | 长度 | 单元标识符 | 功能代码 | 数据 |
3. 功能代码
MODBUS协议支持多种功能代码,用于不同的操作,如读取、写入、诊断等。常用的功能代码包括
- 读取线圈状态(0x01):读取从设备的离散输出(线圈)。
- 读取离散输入(0x02):读取从设备的离散输入状态。
- 读取保持寄存器(0x03):读取从设备的模拟输出(保持寄存器)。
- 读取输入寄存器(0x04):读取从设备的模拟输入。
- 写单个线圈(0x05):写入从设备的单个线圈。
- 写单个保持寄存器(0x06):写入从设备的单个保持寄存器。
- 写多个线圈(0x0F):写入从设备的多个线圈。
- 写多个保持寄存器(0x10):写入从设备的多个保持寄存器
4. 通信过程
(1)请求/响应模型
主机发送一个请求帧,从设备收到后进行处理,并返回一个响应帧,每个请求/响应都是独立的事物
(2)广播模型
主机发送广播消息(地址为0),所有从设备都接收并处理,但不返回响应
5. 错误检测
MODBUS协议提供了两种错误检测机制
(1)RTU模式的CRC校验:使用循环冗余校验码(CRC)来检测传输中的数据错误
(2)ASCII模式的LRC校验:使用纵向冗余校验码(LRC)来检测错误
6. MODBUS中CRC校验原理
(1)数据帧结构:MODBUS数据帧包含设备地址、功能码、数据和CRC校验码。CRC校验码用于检测数据在传输过程中是否发生错误
(2)CRC计算
MODBUS协议使用16位的CRC校验码,生成多项式为 ‘0xA001’
数据帧中的每个字节与当前的CRC值进行异或运算,然后进行逐位处理,按照生成的多项式更新crc值
(3)错误检测
发送端根据要发送的数据帧(地址、功能、数据)计算CRC校验码,并将其附加到数据帧的末尾
接收端接收到数据帧后,对接收到的数据帧中除开CRC校验码的部分,使用同样的方法计算CRC校验码
如果接收端计算的CRC校验码与接收到的CRC校验码值一致,说明数据未发生错误,否则,数据存在错误
在本次项目中,当2440发送携带CRC校验码的数据帧给电表后,若发送数据帧有效,电表会将存储在电表寄存器中的电压值通过包含CRC校验码的数据帧格式发回2440,2440接收到数据帧后,除开末尾的两个字节CRC校验码,对数据帧进行CRC运算,即根据多项式,对数据帧的每一位进行异或处理,若最后计算出的CRC校验与电表发送数据帧中的CRC校验码相同,则数据传输正确无误
unsigned short calculate_crc(unsigned char *buf, int len)
{
unsigned short crc = 0xFFFF;//初始值
int pos = 0;
int i = 0;
for (pos = 0; pos < len; pos++)
{
crc ^= (unsigned short)buf[pos];//与当前的字节进行异或
for (i = 8; i != 0; i--)
{
if ((crc & 0x0001) != 0) //如果最低位是1
{
crc >>= 1; //右移一位
crc ^= 0xA001;//异或生成多项式
}
else
{
crc >>= 1; //最低位是0,仅右移一位
}
}
}
return crc;
}
7. MODBUS应用场景
(1)工业自动化
用于连接和控制工业自动化设备,如PLC、传感器、等,确保设备的协同工作和数据传输
(2)能源管理
用于监测和控制电力设备,如变压器、电表等
(3)交通控制系统
用于监控和控制交通信号灯等设备,确保交通系统的顺畅运行和有效管理
<4> RS-485
(1)定义
RS-485是一种广泛应用于工业和通信系统中的串行通信标准,特点是传输的抗干扰能力强以及长距离传输。是串口通信和RS-232的改良版
(2)特点
1. 差分信号传输
从设备中接出A、B双绞线,传输的0或1根据两根导线的电压差来传输,RS-485信号的电压范围是 -7V 到 +12V之间
若A线电压减去B线电压范围在+(2 ~ 6)V,则传0(A>B)
若A线电压减去B线电压范围在-(2 ~ 6)V,则传1 (A<B)
2. 多点通信
遵循主从应答模式,可以一对多进行通信,最多可同时通信32太设备
3. 半双工通信
同一时间只能进行单向通信,要么发送,要么接收
4. 抗电磁干扰能力强
5. RS-485定义了物理层,在数据链路层及以上使用MODBUS协议
6. 传输距离远
RS-485理论传输距离为1200m,但实际并不能达到1200m,会有信号衰减,产生误差
波特率:一秒内能传输的高低电平个数,即一秒传输的数据位数
<5> RS485、RS232、串口通信之间的区别与联系
(1)串口通信
(2)RS-232
(3)RS-485