hardware

【图文】使用C++完成树莓派和ADC的数据交互系列 part2 SPI ADC芯片


本文编译自 halherta 的文章,原文地址请点击这里

欢迎大家加我们的开发群共同进一步探讨IoT及可穿戴式设备开发,QQ群: 329401876 

在 part1 中,我们大概对 SPI 原理有了了解。接下来我们通过 MCP3008 接入树莓派详细了解 SPI 工作机制和 SPI 器件的使用方法。

MCP3008是SPI总线型模数转换器(ADC),它有8个模拟信号输入端可配置成单端或者差分ADC转换。MCP3008为10位的模数转换器它可以达到200ksps的采样率,封装形式有双列直插式和SOIC两种。下图是 MCP3008的管脚示意图,你也可以下载它的 datasheet 获取更多详细的信息。

MCP3008管脚示意图

图1 MCP3008管脚示意图

通常情况下 VDD 管脚直接接3.3V电源,AGND和DGND可以直接接地。VREF用来限定模数转换器可以表示的最高电压。在我们的示例中我们把VREF直接接3.3V电源(与VDD一致)。如果ADC任何通道采样达到3.3V电压那么它都会得到最大的输出数字量(对于MCP3008来说是10位)2^10=2013。也就是说ADC能够采样到的最小电压(也叫 LSB Size )为 VREF/1024,即 3.3/1024=3.22mv 它表示的数字量为1。用来描述模拟量和数字量之间的等式为 数字量=1024*VIN/VREF,这里的VIN为输入的模拟电压,VREF为参考电压。

MCP3008完整的SPI通信过程如下图所示。该过程完整表示了由主设备( Raspberry Pi )向从设备(MCP3008)传送3个字节的数据,以及从设备向主设备传输3个字节。回忆一下之前提到过的,位移寄存器通过SPI总线的操作过程,主设备向从设备位移3个字节的数据(写MCP3008寄存器)的同时从设备也会向主设备位移3个字节。

SPI 通信过程

图2 SPI 通信过程

  1. 树莓派向MCP3008发出片选信号,将MCP3008 CS管脚置低电平(图示中为 CS0),这个过程通过调用 spidev 驱动里的ioctl()控制树莓派完成。
  2. 树莓派开始向MCP3008发送第一个字节,值为1,表示起始位。与此同时MCP3008向树莓派发回 “Don`t Care” 数据,长度为1字节。
  3. 接下来树莓派发送第二个字节,高四位(SGL/DIFF,D2,D1 & D0 bits)用来设置将要使用哪个通道来进行转换,是采用单端还是差分转换。例如,值为1000时,表示的是使用通道0(CH0)采用单端转换。余下的低4位表示 “Don`t Care”。当MCU发送该字节时,MCP3008把转换输出的数字量的最高两位发回给MCU(bit 9 和 bit 8 )。
  4. 树莓派继续发送 “Don`t Care” 位,同时MCP3008把数字量剩下的8位(bit 7 ~ 0 )发送回树莓派。
  5. 树莓派将之前发送回来的第9和第8位与 bit 7 ~ 0合并成10位的数字量。
MCP3008设置位

图3 MCP3008设置位

 

连接 Raspberry Pi 与 MCP3008                                                                                                     

让我们把树莓派和 MCP 3008 连接起来,如下图所示

连接树莓派与MCP3008

连接树莓派与MCP3008

连接树莓派与外部器件可以使用公对母跳线,也可以使用专用的扩展板(购买)。这里我们将电位器连接到 CH0 上,树莓派支持连接最大两个SPI外围设备,通过CS0和CS1进行片选,这里我们使用CS0。

好了大致关于硬件的方面就这么多,欢迎大家加我们的开发群共同进一步探讨IoT及可穿戴式设备开发,QQ群: 329401876

…… 未完待续

Graphics/3D programming
虚拟头盔 Oculus 获增 7500万美元B轮投资,加快进入消费领域的步伐
General
3D手势控制又添新成员,nimble UX 即将向开发员发布新的 SDK
hardware
如何为Intel Edison 设置开机自动运行程序,systemd 设置篇