C++编程ARM+Linux的IO端口控制

I/O端口有四种标准分类

DI (Digital Input - 数字量输入):接收一个离散的、通常是两态的开关信号。例如:按钮是否按下、接近开关是否检测到物体、继电器的通断状态。

典型值:0 (OFF) 或 1 (ON),有时是 0/24V, 0/5V 等。

DO (Digital Output - 数字量输出):输出一个离散的、控制外部设备的开关信号。例如:点亮指示灯、启动继电器、控制蜂鸣器。

典型值:输出 0 (OFF) 或 1 (ON)。

AI (Analog Input - 模拟量输入):接收一个连续变化的物理量信号。这个信号需要被转换成数字值才能被计算机处理。

典型信号:4-20mA电流,0-10V电压,热电偶的毫伏信号等。

典型值:一个范围内的整数值(如0-4095对应12位ADC)或一个工程单位的浮点数(如25.6°C, 103.5kPa)。

AO (Analog Output - 模拟量输出):输出一个连续变化的控制信号。

典型信号:输出4-20mA电流,0-10V电压。

典型值:接收一个范围内的整数值(如0-4095)或一个工程单位的浮点数(如50.0%的开度),然后由硬件转换为相应的模拟信号。


ARM + Linux架构,集成的io控制模块的方法

第一部分:硬件集成
ARM Linux板子(如树莓派、RK3399、i.MX6ULL等)本身通常只有有限的GPIO引脚。要控制工业上常见的更多、更专业的I/O模块(如多路DI/DO、AI/AO卡),需要通过以下方式集成:

1)片上GPIO (最直接)

直接使用主芯片引出的GPIO引脚。功能简单,数量有限。

连接方式:通过排针引出,直接连接简单的传感器(如按钮、LED)或通过光耦、继电器模块驱动大负载。

2)总线扩展 (最常用)

通过板载的标准总线协议连接专门的I/O扩展芯片或模块。这是扩展I/O能力的主流方式。

常见协议:

I²C (Inter-Integrated Circuit): 2根线(数据线SDA、时钟线SCL),适合中低速、短距离、连接多个从设备(每个设备有唯一地址)。常见I/O扩展芯片如PCA9554/9555(8位I/O)、MCP23008/23017(8/16位I/O)。

SPI (Serial Peripheral Interface): 4根线及以上(时钟SCLK、主出从入MOSI、主入从出MISO、片选CS),全双工、高速。常见I/O扩展芯片如MCP23S08/23S17(SPI接口的I/O扩展器)。

UART (串口): 2根线(TX、RX),通过连接协议转换模块(如Modbus RTU协议转I/O的模块)来控制远程I/O。在工业领域非常普遍。

专用功能扩展 (针对性强)

通过如PCIe、USB等接口连接功能更强大的外部I/O控制卡。这种方式性能高,但成本和复杂度也高。


第二部分:软件控制
软件控制的核心:为硬件I/O找到或创建其在Linux系统中的软件接口。有以下三种层次的方法,从上到下,难度和灵活性递增。

方法一:使用Sysfs (用户空间最常用)
这是最简单的方法,无需编写内核代码。Linux内核的GPIO子系统提供了一个通过文件系统(/sys/class/gpio/)访问GPIO的接口。

控制步骤(以控制GPIO Pin 18为例):

导出GPIO:告诉系统你要使用哪个GPIO。
echo 18 > /sys/class/gpio/export
执行后会出现 /sys/class/gpio/gpio18 目录。

设置方向:设置为输出(out)或输入(in)。
echo "out" > /sys/class/gpio/gpio18/direction
读写值:

输出高电平/低电平:
echo 1 > /sys/class/gpio/gpio18/value  # 输出高电平
echo 0 > /sys/class/gpio/gpio18/value  # 输出低电平
读取输入值:
cat /sys/class/gpio/gpio18/value
取消导出(完成后):
echo 18 > /sys/class/gpio/unexport

对于AI和AO的使用解释:

AI (Analog Input) - 模拟量输入 【主要功能:读】
AI通道的本质是一个测量器。它的工作流程是:

物理信号 -> 数字值 -> 工程值

物理信号:来自现场的传感器,是一个连续变化的电压或电流信号。

常见范围:0-10V, 0-5V, ±10V, 4-20mA 等。

例如:温度传感器(PT100)输出 4-20mA 电流,对应温度范围 0-100°C。

数字值 (Raw Value):

AI模块内部的ADC(模数转换器) 将物理信号转换成一个整型的数字值。

这个值的范围取决于ADC的分辨率(位数)。

例如:一个12位的ADC,转换后的数字值范围是 0 - 4095。

工程值 (Engineering Value / Scaled Value):

数字值对人类来说没有直接意义,需要通过一个量程转换公式,将其转换成具有实际物理单位的数值。

转换公式:工程值 = (数字值 - 数字下限) / (数字上限 - 数字下限) * (工程上限 - 工程下限) + 工程下限

接上例:4mA (对应数字值0) ~ 20mA (对应数字值4095) 对应 0°C ~ 100°C。

当读到的数字值 = 2048时,计算:温度 = (2048 - 0) / (4095 - 0) * (100.0 - 0.0) + 0.0 ≈ 50.0°C


AO (Analog Output) - 模拟量输出 【主要功能:写】
AO通道的本质是一个设定器。它的工作流程是AI的逆过程:

工程值 -> 数字值 -> 物理信号

工程值:你希望输出的具有物理单位的数值。

例如:你希望控制阀门的开度为 65.5%。

数字值 (Raw Value):

AO模块内部的DAC(数模转换器) 会根据量程转换公式,将工程值转换成一个整型的数字值。

接上例:0.0% (对应数字值0) ~ 100.0% (对应数字值4095) 。

数字值 = (65.5 - 0.0) / (100.0 - 0.0) * (4095 - 0) + 0 ≈ 2683

物理信号:

DAC根据数字值2683输出一个对应的模拟电压或电流信号。

例如:输出一个 (2683 / 4095) * 10V ≈ 6.55V 的电压信号去驱动阀门定位器。
 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值