跳转到内容

应用机器人/微控制器/读取传感器

来自维基教科书,开放的书籍,开放的世界

读取数字输入

[编辑 | 编辑源代码]

简单的 1 位数字传感器是微控制器上最简单的输入类型。微控制器上的大多数引脚可用作通用 I/O,这允许连接许多 1 位数字传感器。这些传感器的示例可能是限位开关、红外接近传感器、高增益光电探测器(光传感器)或按钮。

二进制开关类型传感器非常容易集成,只需将一个上拉或下拉电阻连接到开关输出即可。

要在 AVR 微控制器上读取传感器,必须使用两个寄存器来处理引脚设置和读取。这两个寄存器是

  • DDRx
  • PINx

其中 x 表示任意的 I/O 端口(例如 A、B、C、D 等)。

DDR(数据方向寄存器)用于将指定引脚配置为给定端口的输入或输出。每个位置的“1”位指定该端口引脚设置为输出,每个位置的“0”位指定该引脚配置为输入。

PIN 寄存器用于读取每个端口上所有 8 个引脚的数字状态,对于每个位的逻辑高返回 1,对于逻辑低返回 0。请注意,这不是 PORTx 寄存器。PORTx 用于设置输出值,而 PINx 用于读取输入。

要使用数字输入,必须将引脚配置为输入,然后从 PINx 寄存器读取相应的位。从 PINx 中提取单个位的最简单方法是使用位掩码。

DDRA = 0b00000000; // All PORTA pins configured as inputs

if (PINA & 0b00000100) {
  // if PA2 is high
}
else {
 // if PA2 is low
}

if ((PINA & 0b00001000) == 0) {
 // if PA 3 is low
}

在这些示例中,位掩码用于从条件中删除端口上所有其他引脚的状态。与数字输出一样,可以使用 AVR-GCC 宏使代码更易于阅读

if ((PINA & 1<<PIN3) == 0) {
 // if PA 3 is low
}

读取模拟输入

[编辑 | 编辑源代码]

许多传感器测量连续信号,例如旋钮的位置、房间的光照水平或物体与传感器之间的距离。通常,这些传感器的输出电压与测量的信号线性相关。要与这些传感器接口,必须使用模数转换器 (ADC)。大多数微处理器包含几个 ADC。ADC 将电压转换为整数,整数的大小取决于 ADC 的精度。大多数 ADC 是 8 位或 10 位,这意味着它们使用 8 位或 10 位来表示整个范围(从 0 到 Vcc)。10 位 ADC 将模拟电压离散化为值,范围从 0(0 V)到 1023(Vcc)。

AVR 的 ADC 需要几个步骤来配置和读取模拟信号。此外,只有微控制器上的引脚可用作模拟输入。请参阅微控制器的规格说明书,以查找哪些引脚可与 ADC 一起使用(它们通常标记为 ADCn,其中 n 是一个数字)。与 ADC 相关的寄存器是

  • PINx:将引脚配置为输入
  • ADMUX:选择正在读取的 ADC 输入
  • ADCSRA:ADC 控制寄存器
  • ADCL:ADC 转换的低 8 位
  • ADCH:ADC 转换的高位

由于 ADC 引脚也可以用作数字输入/输出,因此必须将其配置为输入才能由 ADC 读取。ADMUX 寄存器用于选择哪个 ADC 正在转换,对于单端输入,它只是一个介于 0..N 之间的数字,其中 N 是 MCU 上的最后一个 ADC 引脚。ADCSRA 代表 ADC 控制和状态寄存器 A,用于开始转换并检查转换何时完成。ADCL 和 ADCH 包含转换的结果。

// Configuration:
DDRF &= ~(1<<PIN0); // Configure PF0 as an input (connected to ADC0 on AT90USB64)

// Reading ADC:
ADMUX = 0; // Read ADC0
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADPS0); // Enable ADC (ADEN), Start a Conversion (ADSC), Fast conversion (ADPS0)
while ((ADCSRA & (1<<ADIF))==0); // Wait for Conversion to Complete
unsigned short value = (ADCL) | (ADCH<<8); // Combine low and high portions of result
华夏公益教科书