树莓派使用MCP3008模数转换器(ADC)

树莓派是一款出色的小型台式计算机,可用于控制数字输入和输出。但是,当你想读取模拟信号(例如从热敏电阻,电位器或许多其他类型的传感器获得的信号)时会怎么做?通过将小型的模数转换器(ADC)芯片连接到P树莓派,可以为程序打开模拟信号的世界!
我这边的目的是想测电瓶里面还剩多少电,通过数模转换器拿到电瓶此时输出的电压,再根据电瓶电压衰减曲线大概估算所剩百分比。

1. 方法总结

用上面的三种方法都能拿到最后所需要的转换值。第一种比较原生。推荐第二种跟第三种方法,原因下面讲。

2. 一些小细节

  • 市面上常用的模数转换器,一种是简单的MCP3008 模数转换器,可以读取8个10位精度的模拟输入通道;另外一种是相对更高级的ADS1x15系列可以读取4个12位至16位精度的通道,大部分情况前者就够用
  • 当你使用MCP3008芯片时,务必使用第三种方法,gpiozero MCP3008函数,依旧是熟悉的味道,简单好用,三行代码就解决;当使用ADS1x15系列时,需要用第二种方法中的库在这里往下翻翻
  • 第二种方法中的adafruit-circuitpython-mcp3xxx库有个注意点,虽然MCP是10位精度的,也就是转换的最大值本应该是1023,但用这个方法的时候默认返回16位精度的值,为了与ADS1x15系列的借口保持统一,所以结果要么右移6位,要么就当成是16位精度也行。

另外的,在gpiozero中,有下列方法实例化模数转换器:

1
2
3
4
5
6
7
from gpiozero import MCP3008

MCP3008(channel=0)
MCP3008(channel=0, device=0)
MCP3008(channel=0, port=0, device=0)
MCP3008(channel=0, select_pin=8)
MCP3008(channel=0, clock_pin=11, mosi_pin=10, miso_pin=9, select_pin=8)

上面device=0(默认) 或者device=1,其实默认意味着MCP3008的cs引脚接的是GPIO08(也就是SPI0_CE0_N),所以device=1意味着接的GPIO07

我一开始以为cs引脚只能接这两个,后来发现,所有通用IO引脚都能接,只要加个select_pin参数,简简单单,好用的。

Arduino是自带模数转换功能,实在着急,先用个Arduino救救急,不展开~