今天面试了一个很有趣的企业,HR 超级友善,虽然技术有一些问题没有回答上来,(挠头)

例如,舵机的控制脉宽,和脉宽周期 还有 modbus rtu 协议的开始和结束的条件,以及位置 PID(本质是一样的嘛)

趁这次机会回顾一下这些内容

# 舵机脉宽

# 舵机控制信号

image

# UART

# 疑惑

# UART 是不是协议

技术面说 UART 不是协议,当时没反应过来就顺着说 UART 是外设。

但是等缓过来思考 UART 的确是一个协议,因为他是被设计出来用于将并行数据转化为并行数据的,有开始信号,有结束信号,还可以有校验位,严格意义上来说串口是物理层通信协议。

与 IIC 和 SPI 实在同一层的,只不过 IIC 和 SPI 还涉及数据链路层 更偏向于 LLC 子层

而 Modbus-RTU 虽然是在物理层和数据链路层实现的协议,但是在实际的工业控制中会被列为应用层,需要具体问题具体分析

# UART 与串口的关系

UART 是一种串行通信接口,它定义了数据传输的格式和机制

而串口通常指的是连接计算机与外部设备的串行通信接口,它也是一种串行通信接口

在计算机中,串口通常是指 RS-232 串口,它是一种标准的串行通信接口

RS-232 串口支持异步通信方式,并且使用了 UART 协议来进行数据传输

在 RS-232 串口中,每个字节都由起始位、数据位、校验位和停止位组成,构成了 UART 协议定义的数据帧结构

所以 UART 和串口之间的关系是,UART 定义了数据传输的格式和机制,而串口(如 RS-232 串口)则是一种支持 UART 协议的物理接口

# 协议

# 波特率

波特率是 UART 协议,或者说所有异步串行协议,非常重要的一个概念,即单位时间内(1 秒)可表示的 bit 位个数,或者也可以表述为 bit 位宽的倒数

例如一个波特率为 115200 的 UART 波形表示 1 秒可容纳 115200 个 bit 位,也就是说每一位 bit 数据占大约 8.68uS 的时长,即 8.68bit/simage

# 时序

# 空闲信号

设备之间不传输数据时以持续的高电平表示空闲

空闲位持续时间越长,两个数据帧间隔也越长,单位时间传输的数据就越少

image

# 起始位

UART 接收端会一直检测信号线上的电平变化

开始传输数据时,发送端将信号线从高电平拉到低电平结束空闲状态,并保持一个 bit 位的时长

接收器检测到高低电平转换时,开始接收信号

image

# 数据

数据位包含传输的实际数据,如果使用了奇偶校验,那么数据位长为 5~8 bits
如果没有使用奇偶校验,则位长为 5~9 bits
在一般情况下,数据位为 8 bits,数据首先从最低有效位开始发送,高位在后

image

# 校验位

校验位可以用来提高传输的可靠性。如果信号在传输过程中因为干扰而导致某些位置的电平产生错误,通过计算接收的数据和校验位是否匹配即可判断数据是否有传输错误,从而给应用层提供有效信息来决定接受 / 丢弃对应的数据。

image

# 停止位

停止位表示一帧数据的结束,实际是一段时间的高电平

停止位的时间长短可以设置为 1、1.5 或者 2bits 的停止位

大部分情况使用 1bit 的停止位。

UART 是一个异步协议,每一帧的开头可以用跳变沿来同步

但是停止位只能通过波特率来计算相对位置,如果在停止位的位置识别到一个低电平,则会产生帧错误

所以在通讯过程中,为了减少波特率的误差导致的问题,可以设置不同的停止位长度来适配

image

# 数据帧

UART 的协议帧由 1 位起始位,数据为 5-8 位,校验位 1 位 (可选) 和一位的停止位

image

以字符 D 为例子,使用 8 位数据为,0 位校验位,形成的波形理论如下

image

以字符 D 为例,其波形在示波器中实际为下图

image

# MODBUS

modbus 分为三种,常用的是 modbus-RTU, 少部分是 Modbus-ASCII

总体来说,MODBUS-RTU 比 MODBUS-ASCII 具有更高的传输效率,MODBUS-RTU 的传输速率通常可以达到 9600bps 或更高,而 MODBUS-ASCII 的传输速率一般在 1200bps 左右

# Modbus RTU

ModBus RTU(Remote Terminal Unit)是 ModBus 协议最常见的实现方式,采用二进制数据传输,具有较高的传输效率和稳定性。它使用串行通信,支持 RS232 和 RS485 两种接口。在 RTU 模式下,每个字节可以传输两位十六进制字符。比如 0xAB 会直接以十六进制 0xAB(二进制 10101011)进行发送。其消息帧格式由以下部分组成:

image

RTU 模式采用 16 位 CRC 校验,后续的命令 / 数据带有循环冗余校验的校验和。RTU 模式比较常用,而 ASCII 一般很少用

# 介质管理

对于 ModBus-RTU 来说,对帧的时间管理,就是对介质的冲突管理

ModBus-RTU 对于介质管理规定了 2 个重要的时间参数,以实现成帧、冲突管理等。参考下图

1678957117951

这个图可以用于断帧,也就时判断是否接收到一个完整的帧,因此只需要使用一个定时器在每次收到一个字节后,就重启一个 3.5 字节定时器,如果这个 3.5 字节定时器中断了,就证明收到了一个 Modbus 报文,至于这个报文是不是正确的报文,可以在进一步根据帧格式进行校验

除此之外还规定了,当报文需要连续发送,字节间隔不得超过 1.5 字节时间image

# Modbus ASCII

ModBus ASCII 采用 ASCII 码传输文本信息,每个 8Bit 字节都作为两个 ASCII 字符发送。相对 ModBus RTU 而言,它的传输效率较低,但具有更好的可读性。ModBus ASCII 也使用串行通信,并支持 RS232 和 RS485 两种接口,适用于短距离通信。在 ASCII 模式下,每个 8 位的字节拆分为两个 ASCII 字符进行发送,消息帧以英文冒号 “:” 开始,以回车和换行(CRLF)符号结束。例如十六进制数 0xAB,会被分解成 ASCII 字符 “A” 和 “B” 进行发送

# PID

技术面说 位置式 PID 和 增量式 PID 没有区别

虽然我觉得哪里不太对,但是没敢反驳,毕竟我对 PID 的理解还是有限的,所以我先来整理一下

# 普通 PID

image

正儿八经的 PID 公式如上, 离散化之后,KdK_dKiK_i 都与 KpK_p 以及采样时间 T 相关

# 位置式 PID

在不考虑 PI 的情况下

image

从公式中可以看出,比例部分只与当前的误差量有关,而积分部分则是系统过去偏差的累积

所以很显然的可以看到位置式 PI 需要进行一个计算的累加从e0e_0~eke_k

当 k 值较大时,消耗大量的空间

但是,在实际实现中我们只会保留每一次积分的累计和,根本不需要大量的内存空间

另外由于输出有可能超过允许值,因此需要对输出进行限幅, *** 而当输出限幅的时候,积分累加部分也应同时进行限幅 ***,以防输出不变而积分项继续累加,也即所谓的积分饱和过深

# 增量式 PID

image

由于u(0)=0u(0)=0,在具体编程操作中,对每一拍的Δu(k)Δu(k) 进行累积,即为 PI 调节器的输出

同样地,为了避免超过允许值, ** 仅需对输出限幅即可 **

# 小结

可以理解为无论用增量叠加的方式来计算位置式 PI,还是直接计算,结果都是相同的

唯一的区别:位置式 PI 需要同时设置积分限幅和输出限幅,而增量式 PI 只需输出限幅


大道五十,天衍四十九,人遁其一!

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

黑羊 支付宝

支付宝