视频连接
Input/Output简写为IO,有些地方也称为GPIO(General purpose Input Output),是单片机输入数据和输出数据的引脚或者叫接口。虽然IO口可以用作输入和输出,但在输入和输出时使用的底层电路是不一样的,比如用作输入的引脚往往配置为高阻态减少电流输入,这也是使用IO口前必须配置工作状态的原因。
有些单片机的引脚不能用作输出,但仍延续IO的叫法,如esp32的IO34、IO35、IO36、IO39。
如上图中,每个排针都有编号,如D2、D4等,这些排针的编号对应着单片机引脚的编号,控制软件通过编号控制排针的电平,这就是IO口。
宏观上讲,程序中通过编号(如2对应D2口)实例化IO口,然后对IO口的赋值操作直接映射到IO口的电平上,如下例:
from machine import Pin #导入模块
Led = Pin(2,Pin.OUT) #编号2对应D2口
Led.on() #D2输出高电平
Led.off() #D2输出低电平
对单片机控制,实际上就是对单片机的IO口控制,分为三种:
1.3.1. 开关量控制
单片机系统是数字系统,本质上IO口有且只有高电平、低电平两个状态,对应于于开关的ON、OFF状态,所以称为开关量。
在3.3v的单片机系统中,IO口为1对应着引脚输出高电平3.3V,IO口为0对应着引脚输出低电平0V。(严格讲:这个说法并不准确,因为高低电平是满足TTL电平的区间值,如在3.3v系统中,大于3v的都是高电平,低于0.3v的都是低电平)。
同理在5v的单片机系统中,IO口为1对应着引脚输出高电平5.0V,IO口为0对应着引脚输出低电平0V。
其他类似,不一一列举。
下图是单片机系统中LED的2种接法示意图,LED通过限流电阻接上电源,则可以点亮。LED的亮度与流经LED的电流成非线性正比,电流越大亮度越大。估算时,LED的压降按2.0v,如下式:
如,vcc=5v/R=1k时,i≈3MA。
做为指示灯,LED一般工作在1MA左右(亮度适中)。
上图中LED的两种接法,对应两种控制方式:
方式1,LED负极经由限流电阻接地,单片机IO接LED正极,IO=1时输出高电平,LED上电点亮,IO=0时输出低电平,LED两端均为低电平熄灭。LED点亮时,电流是从单片机流出的,称为拉电流。
方式2,LED负极经由限流电阻单片机IO,LED正极端接电源,IO=1时输出高电平,LED两端均为高电平熄灭,IO=0时输出低电平,LED上电点亮。LED点亮时,电流是从电源流出的,最终流向单片机,称为灌电流。
单片机对灌电流的耐受度高于拉电流,所以一般采用第二种模式。
单片机IO口能承受拉电流、灌电流的能力是有限的,过大电流会造成单片机烧毁,这个承受能力称为单片机IO口的驱动能力。
一般用于驱动LED等小功率器件没有问题,但驱动不了继电器等大功率器件。要驱动大功率器件,需要用到转换电路,如图是常用的功率转换器件--光耦的工作原理:
1.3.2. PWM模式
PWM全称脉冲宽度调制(Pulse width modulation,PWM)技术,通过调整特定频率的矩形波占空比,达到控制的目的。
PWM有两个主要参数,频率和占空比。频率反映的是IO口切换一次高、低电平的时间间隔。占空比反映的是在一次切换周期内,高、低电平的占比。
占空比的小数范围是0~1。但单片机系统对小数运算会占用更多的资源,所以往往用整形替代,比如micropython中使用0~1023的整形对应0~1的小数,相当于把0~1分成1024份,并一一对应。
直接影响是占空比的计算方式随取整区间变化,如下图所示的案例中,时间间隔t=1S对应的是频率f,f=1/t。0.75s对应的是占空比duty,在这个实验条件下duty=((0.75*1024/t)-1)=767。
备注:占空比duty在不同的技术平台下可用赋值区间不同。
1.3.3. 模拟量控制
更进一步,在PMW输出的方波尾端增加低通滤波器,经过低通滤波后将输出一个恒定的电压值,该电压值与占空比成线性关系,这就是DAC转换。
在现有实验条件下,相当于把3.3v的高电平分成1024小段,每一段对应这一个电平。
有些单片机的特定IO口集成了DAC转换功能,设定指定的值会自动转换为对应的模拟量输出。
1.3.4. IO口编号
不同的单片机采用不同的IO口编号模式,如stm32单片机有GPIOA、GPIOB...,Esp32单片机有IO0、IO1...。
不同的编程环境也有不同的编号方式,如micropython中采用顺序编号,arduino对应stm32单片机时则采用pa0、pa1...等类似编号。
根据单片机及编程环境,选择适用的编号,则可以直接操控单片机对应的IO口。