High-Precision AD HAT
| ||||||||||||||||
| ||||||||||||||||
说明
适用于树莓派的高精密模数转换器
产品参数
- 分辨率(Bits):32
- 输入通道数:10
- 采样率(最大)(kSPS):38
- PGA倍数(最大):32
- 接口类型:SPI
- 架构:Delta-Sigma
- 输入类型:差分、单端
- 参考电压:内部、外部
- 输入电压范围(最大)(V):2.5,5
- 输入电压范围(最小)(V):-2.5,0
产品特点
- 板载ADS1263芯片,低噪声、低温漂,10通道32位精密ADC(5通道差分输入),最大38.4kSPS采样速率
- 芯片自带24位辅助ADC、内部ADC测试信号、IDAC、2.5V内部基准电压、8个复用GPIO、PGA(最大32倍)
- 板载排针封装输入接口,可接入模拟信号,兼容微雪传感器接口标准,方便接入各种模拟传感器模块
- 板载接线端子封装输入接口,可接入模拟信号及模拟电源,方便在各种场合使用
- 板载排针封装控制接口,可接入控制信号,方便使用树莓派以外的设备控制本模块
- 板载三线RTD电路,通过焊接0R电阻可以方便使用三线RTD进行测量
功能引脚
功能引脚 | 树莓派接口(BCM) | 树莓派接口(WiringPi) | 描述 |
DRDY | D17 | P0 | ADS1263数据就绪输出,低电平有效 |
RESET | D18 | P1 | ADS1263复位输入 |
CS | D22 | P3 | ADS1263片选,低电平有效 |
DIN | D10 | P12 | SPI数据输入 |
DOUT | D9 | P13 | SPI数据输出 |
SCK | D11 | P14 | SPI时钟信号 |
DIN0 | D6 | P22 | 数字输入信号 |
DIN1 | D13 | P23 | 数字输入信号 |
DIN2 | D19 | P24 | 数字输入信号 |
DIN3 | D26 | P25 | 数字输入信号 |
硬件配置
PS:若使用其他控制器进行作业(即使用8Pin贴片排针输入控制信号),AVDD也必须接电源(5V),否则芯片不工作
单端输入配置
本模块默认为单端测量模式,即AVDD连接5V,AVSS连接GND,并将COM口配置成负端输入且用跳线帽连接到GND。
所以此时您可以直接引出 AD HAT 模块的GND(或COM)连接至目标板的GND然后将 AD HAT 的任意IN连接至待测目标处测量电压。
差分输入配置
- (可选)引出 AD HAT 模块的GND(或COM)连接至目标板的GND
- 将您的差分信号接入 AD HAT 的差分信号输入端口(IN0&IN1或其他四组任意一组差分输入接口)
- (可选)如果您需要测量的信号比较小需要使用PGA,需要进入程序将参考电压设置为内部±2.5V(默认为AVDD-AVSS为单极性激励不支持PGA),并将main.c中宏定义“REF”的值修改为2.5,且要根据需求自行调整PGA参数
修改内部参考电压: 在 ADS1263.c 中的 ADS1263_ConfigADC1() UBYTE REFMUX = 0x24; 改为 UBYTE REFMUX = 0x00;
- 程序使用差分测量模式:
将main.c中的33行(python也有同名函数) ADS1263_SetMode(0); 改为 ADS1263_SetMode(1);
- 注意:差分模式测量通道号需要小于5,请根据实际情况修改
RTD配置
如果您需要使用RTD功能,请按照以下方式操作硬件:
- 在背面“RTD 0R”处焊上四个0R电阻
- 取下COM-GND的跳线帽
- 将您的三线RTD模块的正极连接至IN7,其他两线任意连接至IN6和IN4
- 最后在程序中做好配置即可测量
通信协议
SPI协议
本模块使用的通信类型为SPI通信,具体描述可以查阅数据手册Page 11-12
SPI通信部分在手册中的时序图如下图所示:
CS为从机片选, 仅当CS为低电平时,芯片才会被使能;
SCLK为SPI通信时钟;
DIN为数据输入即MOSI,主设备数据输出,从设备数据输入;
DOUT为数据输出即MISO,主设备数据输入,从设备数据输出;
DRDY,为数据准备状态输出脚,当ADC1的数据准备就绪时DRDY会输出低电平。
对于SPI通信而言,数据是有传输时序的,即数据的捕获需要时钟信号的某个边沿触发,而这个边沿就是由时钟极性(CPOL)与时钟相位(CPHA)的组合决定的:
CPOL的高低决定串行同步时钟的空闲状态电平,CPOL = 0,为低电平;CPOL = 1,为高电平。
CPHA的高低决定串行同步时钟是在第一时钟跳变沿还是第二个时钟跳变沿数据被采集,
当CPHA = 0,在第一个跳变沿进行数据采集;CPHA = 1,在第二个跳变沿进行数据采集。
从图中可以看出,SCL空闲时是低电平,在第二个边沿时开始传输数据,所以是模式一(0x01),一个时钟周期传输8bit数据,按位传输,高位在前,低位在后(MSB)。
使用
提供C语言与python例程
开启SPI接口
- 打开树莓派终端,输入以下指令进入配置界面:
sudo raspi-config 选择Interfacing Options -> SPI -> Yes 开启SPI接口
- 重启树莓派:
sudo reboot
- 检查 /boot/config.txt,可以看到 'dtparam=spi=on' 已被写入
- 为了确保 SPI 没有被占用,建议其他的驱动覆盖暂时先关闭。可以使用 ls /dev/spi* 来检查 SPI 占用情况,终端输出 /dev/spidev0.0 和 /dev/spidev0.1 表示 SPI 情况正常
安装库
如果使用bookworm系统,只能使用lgpio库,bcm2835跟wiringPi无法安装与使用,python库可以不安装,直接运行程序即可
BCM2835
#打开树莓派终端,并运行以下指令 wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz tar zxvf bcm2835-1.71.tar.gz cd bcm2835-1.71/ sudo ./configure && sudo make && sudo make check && sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
wiringPi
#打开树莓派终端,并运行以下指令 cd sudo apt-get install wiringpi #对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级: wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 #Bullseye分支系统使用如下命令: git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build gpio -v # 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
lgpio
wget https://github.com/joan2937/lg/archive/master.zip unzip master.zip cd lg-master sudo make install # 更多的可以参考官网:https://github.com/gpiozero/lg
- python
sudo apt-get update sudo apt-get install ttf-wqy-zenhei sudo apt-get install python-pip sudo pip install RPi.GPIO sudo pip install spidev # bookworm 系统 sudo apt install python3-rpi-lgpio sudo apt-get install python3-spidev sudo apt-get install python3-RPi.GPIO
下载例程
方法一:微雪官网下载,在树莓派终端运行:
cd ~ sudo apt-get install p7zip-full wget http://www.waveshare.net/w/upload/a/a1/High-Precision_AD_HAT_Code.7z 7z x High-Precision_AD_HAT_Code.7z -r -o./High-Precision_AD_HAT_Code
方法二:使用github仓库,github可能更新会有延迟,推荐使用方法一。
cd ~ sudo git clone https://github.com/waveshare/High-Pricision_AD_HAT.git
例程使用
C
- 进入C例程文件夹,并编译例程
cd ~/High-Precision_AD_HAT_Code/c sudo make clean sudo make
- 如果是jetson nano:
cd ~/High-Precision_AD_HAT_Code/c sudo make clean sudo make JETSON
- 在编译前您可以在 Makefile 文件中修改注释以切换使用库(默认为BCM2835,若使用过BCM2835必须重启树莓派后才能使用别的库)
sudo nano Makefile 将 line 13-15 的 USELIB_RPI 的注释切换即可
- 编译完成后会在该目录生成 main 文件,执行即可
sudo ./main
- 当然您也可以在例程中做一些修改以实现不同的功能,详细介绍请参阅‘函数简介’段落
Python
- 进入Python例程文件夹,并执行例程
cd ~/High-Precision_AD_HAT_Code/python sudo python main.py or sudo python3 main.py
- 如果使用的是Jetson Nano需要先开启SPI:
sudo /opt/nvidia/jetson-io/jetson-io.py 会弹出GPIO工具菜单,选择“Configure 40-pin expansion header”按下回车进入次级菜单。 然后勾选spi1并返回上级菜单,最后选择“Save and reboot to reconfigure pins”使设备重启配置生效。 安装以下库
sudo apt install python-pip sudo pip install spidev
- 如果开启SPI失败,请参考官方文档:NVIDIA Jetson Linux开发人员指南
- 当然您也可以在例程中做一些修改以实现不同的功能,详细介绍请参阅‘函数简介’段落
函数简介
硬件部分
为了方便后续阅读,简单介绍一下硬件。
本模块使用的ADC是ADS1263,使用的SPI通信,需要关注的是模式(模式一)、速率(最大8M)、数据格式(MSB),在可以正常通信后就可以开始实现功能了。
控制主要分为发送命令和读写寄存器,命令表和寄存器表都可以在数据手册中找到。
常用的命令就是开始/结束ADC转换、读/写寄存器、重启等;寄存器主要是用来写入配置参数,程序的核心就是读写寄存器。
PS:读/写寄存器是一种特殊的命令,普通的命令是单字节的,读/写寄存器是多字节的,即读/写寄存器命令 + 需要写入/接收的数据。
软件部分
因为C例程和Python例程的函数和功能是一模一样的,所以放在一起讲解。
下面以 ADS1263.c 的代码为例,在 ADS1263.py 也可以找到对应的函数:
- 复位函数,DEV_RST_PIN 为IC复位引脚,低电平有效,每次使用前需要进行复位操作,复位后寄存器配置会恢复默认值,需要重新配置。
static void ADS1263_reset(void)
- 数据读写函数,这三个函数分别为写命令、写寄存器、读取寄存器,每次SPI操作需要拉低DEV_CS_PIN(片选,CS)引脚,读写寄存器因为命令是两个字节所以需要发送一次0x00
static void ADS1263_WriteCmd(UBYTE Cmd) static void ADS1263_WriteReg(UBYTE Reg, UBYTE data) static UBYTE ADS1263_Read_data(UBYTE Reg)
- 数据校验函数——和校验函数,本例程的读取数据都使用了和校验,也可以通过寄存器配置CRC校验
和校验主要原理是取数据的低八位相加,最后加上一个固定参数,取和后的低八位与读取到的校验字节异或,如果数据读取正确返回0(相同异或为零)
static UBYTE ADS1263_Checksum(UDOUBLE val, UBYTE byt)
- 数据等待函数,DEV_DRDY_PIN为DRDY引脚,在ADC1进行数据转换时有效,在数据准备好之后会发送一个低电平
PS:ADC2不适用
static void ADS1263_WaitDRDY(void)
- 芯片校验函数,返回值为1则IC为ADS1263,0为ADS1262
UBYTE ADS1263_ReadChipID(void)
- 模式设置函数,1为差分模式,默认为0单端模式
void ADS1263_SetMode(UBYTE Mode)
- ADC设置函数,设置ADC的速率、PGA增益倍数、参考电压等。
具体寄存器信息都可以查表确认,需要配置其他寄存器最好按例程方式每次写入后再读取验证。
为保证数据稳定减少多通道及两个ADC之间的串扰,例程使用的数据转换延时较大且转换速率较慢,如果有速度需要可以自行修改。
PS:ADC1在使用单端测量时不建议开启PGA(默认关闭)。
void ADS1263_ConfigADC1(ADS1263_GAIN gain, ADS1263_DRATE drate) void ADS1263_ConfigADC2(ADS1263_ADC2_GAIN gain, ADS1263_ADC2_DRATE drate)
- 芯片初始化函数,包括复位、验证、配置ADC步骤。
UBYTE ADS1263_init(void)
- 选择通道函数,在需要切换ADC通道前先调用该函数。
static void ADS1263_SetChannal(UBYTE Channal) static void ADS1263_SetChannal_ADC2(UBYTE Channal) void ADS1263_SetDiffChannal(UBYTE Channal) void ADS1263_SetDiffChannal_ADC2(UBYTE Channal)
- 读取ADC数据函数,ADC1返回值为32位数据,ADC2为24位数据。
static UDOUBLE ADS1263_Read_ADC1_Data(void) static UDOUBLE ADS1263_Read_ADC2_Data(void)
- 获取指定通道的数据,根据模式的不同会有不同的效果,包含设置通道,读取数据操作。
UDOUBLE ADS1263_GetChannalValue(UBYTE Channel) UDOUBLE ADS1263_GetChannalValue_ADC2(UBYTE Channel)
- 获取所有通道的数据,封装供其他文件调用,循环获取指定数量通道的数据。
获取到32位或24位的原始数据,如果要得到电压数据需要先将原始数据除以最大量程然后乘上参考电压。
而例程使用的树莓派5V(实测5.08V),因此最终电压数据为:ADC[i]/0x7fffffff*REF,负电压同理。
void ADS1263_GetAll(UDOUBLE *ADC_Value) void ADS1263_GetAll_ADC2(UDOUBLE *ADC_Value)
- RTD测试函数,包含了RTD的寄存器配置、ADC1的数据转换及读取。
要得到温度数据需要先算出热电阻的阻值,根据 R=U/I,将两个电阻(热电阻、参考电阻)相除化简可得:R(热电阻)/R(参考电阻) = U(热电阻) * U(参考电阻) * 2
所以 RES = (ADC[0] / 0x7fffffff * 1) * 1 * 2 * 2000
最后根据热电阻公式可得温度,例程使用的是Pt100
因此 TEMP = (RES/100 - 1) / 0.00385
UDOUBLE ADS1263_RTD(ADS1263_DELAY delay, ADS1263_GAIN gain, ADS1263_DRATE drate)
- DAC测试函数,电压设置、输出引脚设置(正负极性)、打开或关闭DAC输出。
void ADS1263_DAC(ADS1263_DAC_VOLT volt, UBYTE isPositive, UBYTE isOpen)
PS:在main文件中,可以通过宏定义来快速修改需要进行的试验(ADC/RTD),REF 为参考电压如果需要精确测量可能需要您根据实际使用情况进行修改。
资料
提供文档、程序、数据手册等全套资料
文档
程序
数据手册
软件
相关链接
FAQ
示例程序默认开启8通道高精度ADC,为了保证稳定性和准确性,程序读取数据及处理数据时加了延时,如果需要较高速率,可以将延时注释掉。优化输入的例程如下:
30K+_High-Precision_AD_HAT_Code
- 未连接的空闲通道显示5.08V;芯片内部结构原因,是正常现象。
- 默认浮动电压为5.08V,不影响使用,如果不需要其他通道,可以关闭该通道或接GND