主要内容

使用SPI的模拟输入

这个例子展示了如何使用树莓派™硬件上的SPI外设连接到MCP3008 10位8通道ADC。

简介

各种各样的传感器输出模拟电压水平,以响应环境刺激。模拟传感器的例子有TMP36温度传感器和光电阻。树莓派硬件没有任何内置的模拟输入端口。太使用模拟传感器,就需要一个外部ADC。在本例中,使用SPI外设将ADC芯片连接到树莓派硬件。

先决条件

所需的硬件

要运行这个示例,您需要以下硬件:

  • 覆盆子π硬件

  • 至少输出1A的电源

  • 面包板和跳线电缆

  • MCP3008 ADC

  • 10 kOhm电位计

SPI的概述

串行外围接口(SPI)是同步串行数据链路,用于将一个或多个外围设备连接到单个控制器SPI设备。SPI使用三条对所有外设通用的信号线:

  • 串行数据输入(SDI)。数据通过这条线从外设移动到控制器。

  • 串行数据输出(SDO)。数据通过这条线从控制器移动到外设。

  • 串行时钟(SCLK)。该时钟由控制器SPI设备生成。

每个外设都连接到单独的芯片选择或外设传输使能线。在SPI通信过程中,控制器一次只选择一个外围设备。总线上没有使用其芯片选择线激活的任何其他外设都必须忽略输入时钟和SDO信号。它也不能驱动SDI线。

SPI通信是全双工的。当控制器在SDO线上发送一个位时,外围设备读取该位,同时在SDI线上发送一个位,然后由控制器读取该位。因此,要从外围设备读取数据,必须向它写入数据。

您可以使用四种不同的SPI模式。每种模式都定义了一个特定的时钟相位(CPHA)和相对于数据的极性(CPOL)。模式0 (CPOL = 0, CPHA = 0)是最常见的用例。树莓派硬件在单板上有两个SPI通道:0和1。它最多可以支持两个SPI外围设备。每个SPI通道都有相应的总线速度,可以从500千赫到32兆赫。在每个SPI事务中交换的数据位的数量可以在8到16位之间变化,其中8位是最常见的。

查看可用的SPI通道

创建一个树下对象,并检查树下对象的AvailableSPIChannels属性。

清晰的零售物价指数零售物价指数= raspi ();零售物价指数。AvailableSPIChannels

如果没有启用SPI外围设备,您将看到一个空单元格数组。要启用SPI外设,请使用随Raspbian Linux映像附带的raspi-config实用程序。rpi对象的AvailableSPIChannels属性应该产生'CE0'和'CE1'作为可用的SPI通道。

概述MCP3008

MCP3008是一个10位8通道模拟数字转换器(ADC),具有SPI接口。

如图所示,引脚1到8是模拟输入通道。引脚16是数字电源电压,引脚9是数字接地。美元V_ {ref} $而且美元现代{接地}$是否引脚用于模拟测量的参考电压水平。数字10位电压测量值按比例缩放,使0对应美元现代{接地}$值为1023(2^10 - 1)对应美元V_ {REF} $.引脚10到13是SPI接口的连接。

连接MCP3008

将MCP3008与树莓派硬件连接,如下图所示。为了模拟施加到CH0的可变电压,使用连接到CH0的10 kOhm电位器。

在本例中,电位器(POT)是一个三端设备,其端子1和3由嵌入在POT中的电阻的端点组成。第二个端子连接到可变雨刷。当雨刷移动时,穿过端子1和2以及端子2和3的电阻会发生变化。在这个电路中,POT充当可变分压器。当你移动电位器的旋钮时,端子2处的电压在3.3伏特和0伏特之间变化。

测量CH0处的电压

MCP3008使用SPI接口与SPI控制器通信,在本例中SPI控制器是树莓派硬件。MCP3008和树莓派之间的SPI事务长度为3个字节。树莓派硬件向MCP3008发送一个值为“1”的字节。同时,MCP3008向树莓派硬件发送一个不在乎字节。树莓派硬件向MCP3008发送另一个字节,其中最有效的4位包含“1000”的值。此字节指示MCP3008要求在CH0处进行单端电压测量。同时,MCP3008发送ADC测量的位9和位10。最后,树莓派硬件发送一个不关心字节,同时读取电压测量的最低有效8位。然后将从MCP3008读取的10位值转换为电压值。

读取电压

要从MCP3008读取电压值,首先创建一个连接到SPI通道“CE0”的spidev对象。按照前面描述的方式执行SPI事务。

清晰的mcp3008mcp3008 = spidev(零售物价指数,“CE0”);data = uint16(writeRead(mcp3008,[1, bin2dec(“10000000”)、0]));Highbits = bitand(data(2), bin2dec(“11”));Voltage = double(bitor(bitshift(highbits, 8), data(3)));电压=(3.3/1024)*电压;

的变量电压持有从MCP3008的CH0引脚读取的电压值。您可以替换各种模拟传感器,如TMP36温度传感器,以取代该电路中的POT。

高级:为MCP3008创建一个MATLAB类

您可以为MCP3008创建一个MATLAB®类,使其易于从MATLAB命令行界面使用该设备。您可以使用这个MATLAB类来简化本示例中的步骤。

清晰的mcp3008mcp3008 = raspi.internal.mcp3008(零售物价指数,“CE0”);i = 1:20 voltage = readVoltage(mcp3008, 0);流(“电压= % 0.2 f \ n”、电压);暂停(0.2);结束

在执行前面的循环时,试验POT旋钮。您可以看到打印在MATLAB提示符上的电压值发生了变化。

总结

此示例介绍了使用SPI接口的工作流程。您学习了如何使用MCP3008 ADC读取模拟输入电压。

Baidu
map