主要内容

使用SPI的模拟输入

这个例子向您展示了如何使用SPI外设在树莓Pi®硬件上连接到MCP3008 10位8通道ADC。

介绍

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

先决条件

所需的硬件

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

  • 覆盆子PI硬件

  • 一种至少具有1A输出的电源

  • 面包板和跳线电缆

  • MCP3008 ADC

  • 10 kOhm电位计

SPI概述

串行外设接口(SPI)是您用来将一个或多个从外围设备接口到单个主SPI设备的同步串行数据链接。SPI对所有从属外设共用三种信号线:

  • 奴隶大师(MISO)。数据从从站移动到该电线上的掌握。

  • 掌握奴隶(MOSI)。数据从Master到此电线上的从主机移动。

  • 串行时钟(SCLK)。主SPI设备生成这个时钟。

每个从属外设都连接到单独的芯片选择或从发射使能线。在SPI通信期间,主机一次只选择一个从设备。使用其芯片选择线路未激活的总线上的任何其他从站都必须忽略输入时钟和MOSI信号。它也不能驾驶味噌线。

SPI通信是全双工的。当主服务器在MOSI线上发送一个位时,从服务器读取该位,同时在MISO线上发送一个位,然后由主服务器读取。因此,从设备进行读操作时,必须先对从设备进行写操作。

您可以使用四种不同的SPI模式。每个模式相对于数据定义特定的时钟阶段(CPHA)和极性(CPOL)。模式0(CPOL = 0,CPHA = 0)是最常见的用例。覆盆子PI硬件在板上有两个SPI通道:0和1.它可以支持最多两个SPI从设备。金宝app每个SPI通道具有相应的总线速度,可从500 kHz到32 MHz。在每个SPI事务中交换的数据比特数可以在8到16位之间变化,其中8位是最常见的。

查看可用的SPI通道

创建一个raspi对象并检查这个对象的AvailableSPIChannels属性。

清除RPI.零售物价指数= 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} $$ a_ {gnd} $是用于模拟测量的参考电压电平的引脚。缩放数字10位电压测量值,以便0值对应于$ a_ {gnd} $1023(2^10 - 1)对应于美元V_ {REF} $.引脚10到13是用于SPI接口的连接。

连接MCP3008

如下电路图所示,将MCP3008连接到覆盆子PI硬件。为了模拟应用于CH0的可变电压,请使用连接到CH0的10 KOHM电位器。

在该示例中,电位计(罐)是具有端子1和3的三端装置,包括嵌入罐中的电阻器的端点。第二端子连接到可变擦拭器。当刮水器移动时,端子1和2的电阻和终端2和3的变化。在该电路中,POT充当可变分压器。当移动电位器的旋钮时,端子2处看到的电压在3.3伏特和0伏之间变化。

测量CH0的电压

MCP3008使用SPI接口与SPI主机通信,在这种情况下,SPI主机是树莓派硬件。MCP3008和Raspberry Pi之间的SPI事务包含3个字节。树莓派硬件发送一个包含值'1'的字节给MCP3008。同时,MCP3008发送一个不关心字节到树莓派硬件。树莓派硬件发送另一个字节到MCP3008,其最有效的4位包含一个值“1000”。该字节指示MCP3008要求在CH0处进行单端电压测量。同时,MCP3008发送ADC测量的9位和10位。最后,树莓派硬件发送一个不关心字节,同时读取电压测量的最低有效8位。从MCP3008读取的10位值然后转换为电压值。

读取电压

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

清除mcp3008mcp3008 = spidev(零售物价指数,“CE0”);data = uint16(writeRead(mcp3008,[1, bin2dec(“10000000”)、0]));Highbits = bitand(data(2), bin2dec())“11”));电压=双(BITER(比特(高比特(高位,8),数据(3)));电压=(3.3 / 1024)*电压;

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

高级:为MCP3008创建一个MATLAB类

您可以为MCP3008创建一个MATLAB类,以便从MATLAB命令行界面轻松使用该设备。您可以使用这个MATLAB类来压缩本示例中的步骤。

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

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

概括

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