项目进展(十一)--重新绘制ADS1285采集板并学习

   声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。
  由于项目的需要,上周又设计了ADS1285的采集电路板,最近几天焊接了一下,重新进行测试。由于之前对ADC采集不是重点,所以就草草了事,交给了其他同学负责,现在出现了一些问题,所以本篇博客争取再把ADS1285的数据手册过一遍,仔细学习一下。
本博客可能存在一些错误,还希望各位小伙伴们能够指出错误,和诸位努力又帅气的小伙们共同学习、共同进步!
  由于本博客中会直接使用数据手册的译文,所以为了区分,数据手册的译文均使用引用的形式:

引用:…

  下面是我新绘制的PCB,不过在调试时还是出现了一些问题,这些问题会逐渐进行测试解决的,在本文以后会放上代码,需要的小伙伴关注即可,即可观看全文。
在这里插入图片描述

一、 简单认识一下

1.1 引脚说明

在这里插入图片描述
  引脚说明比较简单,在这就不一一接收了,小伙伴可以去数据手册阅读,这里直接把原理图放出来,与大家参考一下。
在这里插入图片描述

1.2 电气特性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  在这突然发现一点, V I N H V_{INH} VINH的最低值要0.8×IOVDD,这一点之前没有想过,这个点需要多多注意。

1.3 时序

在这里插入图片描述
  上图主要是SPI里面CS、CLK、DIN三条线的时序,可以注意到CLK在空闲时为低电平;在上升沿采集DIN上的数据,这一点在软件设计上是非常重要的,需要注意一下。
在这里插入图片描述
  上图主要介绍了DRDY引脚的时序,DRDY引脚是表面数据已经准备好了,所以在读取到DRDY位低电平时,说明就可以读取数据了。

二、概述

2.1 程序框图

在这里插入图片描述

  调制器数据由数字滤波器处理,提供最终的转换结果。该数字滤波器由一个sinc滤波器和一个可编程相位、FIR低通滤波器和一个IIR高通滤波器组成。高通滤波器从数据中去除直流和低频分量。
  采样率转换器(SRC)通过对输出数据重采样来补偿时钟频率误差。时钟频率补偿范围为±244ppm,分辨率为7ppb。
  用户可编程增益和失调校准寄存器纠正失调和增益错误。
  SYNC引脚同步ADC。同步有两种操作方式:脉冲同步和连续同步。RESET引脚复位ADC,包括用户配置设置。引脚是抗噪声的,施密特触发输入,以提高在高噪声环境中的可靠性。
  PWDN引脚在ADC不使用时切断电源。通过串行接口提供软件下电模式(STANDBY)。
  4线制spi,串行接口读取转换数据和读写设备寄存器数据。
  两个通用数字I/O可用于系统级控制。
  PGA和缓冲器的电源由AVDD1和AVSS提供。电荷泵稳压器增加PGA后面缓冲器的输入电压范围。调制器的电源由AVDD2提供。IOVDD通过1.8v低压差稳压器(LDO)提供数字逻辑核心。IOVDD是数字I/O供应。

三、细节描述

3.1 模拟输入

在这里插入图片描述

  ADC包含两个差分输入通道,多路复用器在两个差分输入之间选择进行测量。多路复用器还提供了测量噪声和偏置的测试模式。短输入测试配置可带或不带400-Ω电阻,以模拟800-Ω检波器产生的热噪声。多路复用配置如下表所示。

在这里插入图片描述
  本项目只使用AIN1引脚,所以在此只需要配置MUX[2:0]为000即可。

3.2 可编程增益放大器(PGA)与缓冲区(Buffer)

在这里插入图片描述

  上图为PGA和Buffer的框架

  该器件可与PGA或单位增益缓冲器一起工作。缓冲操作禁用PGA偏置,降低设备功耗。当AVDD1 = 3.3 V时,由于PGA增益= 1的输入余量有限,因此必须在此条件下使用缓冲器。

  上面有句话非常重要:“当AVDD1 = 3.3 V时,由于PGA增益=1的输入余量有限,因此必须在此条件下使用缓冲器。”我们使用的AVDD1为5V,所以可以不使用缓冲器。当然,使用缓冲器的好处是降低功耗,所以最后还是得根据功耗去选择是否使用缓冲器。
  PGA增益由CONFIG1寄存器的gain[2:0]位编程:
在这里插入图片描述

  无论PGA或缓冲操作,从每个缓冲输出连接两个47-nF, c0g介电电容器到AVSS (CAPBP和CAPBN)。电压电荷泵增加了缓冲输入的操作净空。在CAPC和AGND之间连接一个外部4.7-nF电容器,用于电荷泵操作。

3.3 参考电压

  ADC需要一个参考电压才能工作。参考电压输入是差分的,定义为REFP和REFN引脚之间的电压:VREF = VREFP - VREFN。由于差分输入,VREFN走线可以路由到电压基准接地端子,以避免地噪声干扰。
  该器件提供三种参考电压选择:5 V、4.096 V或2.5 V。使用VREF = 5 V或4.096 V实现最大动态范围性能,这需要AVDD1 = 5 V才能运行。如果AVDD1 = 3.3 V,则限制参考电压为2.5 V。通过CONFIG1寄存器的REF[1:0]位编程使参考电压与物理电压匹配。使用低噪声的精密电压基准,在测量带宽内最佳小于0.5 μVRMS。

  “使用VREF = 5 V或4.096 V实现最大动态范围性能,这需要AVDD1 = 5 V才能运行。如果AVDD1 = 3.3 V,则限制参考电压为2.5 V”,这句话是电路设计时必须要的,在这给大家提醒一下。

3.4 IOVDD电压输入

  IOVDD数字电源工作在两个电压范围:1.65 V至1.95 V和2.7 V至3.6 V。如果IOVDD工作在1.65 v ~ 1.95 v范围内,请将IOVDD直接连接到CAPD引脚上。
  当IOVDD工作在1.65 v ~ 1.95 v范围时,接线方式如下图所示。否则,如果工作在2.7 v ~ 3.6 v范围内的IOVDD,请勿将这些引脚连接在一起。
在这里插入图片描述

  “如果工作在2.7 v ~ 3.6 v范围内的IOVDD,请勿将这些引脚连接在一起。”

3.5 数字滤波器

在这里插入图片描述

  该数字滤波器由三部分组成:可变sinc滤波器;可变系数、固定抽取FIR滤波器;和一个可编程高通滤波器(IIR)。所需的滤波器路径由CONFIG0寄存器的filter[1:0]位选择。sinc滤波器提供部分滤波的数据,绕过FIR和HPF滤波器和用户校准。对于完全过滤的数据,选择FIR过滤器选项。IIR滤波器级去除直流和低频数据,FIR和组合FIR + IIR滤波器被送到到用户校准块和输出代码裁剪块。

3.5.1 Sinc滤波器

  数字滤波器的第一部分是可变抽取的五阶sinc滤波器(sinx/x)。调制器数据通过采样率转换器以fMOD = fCLK / 4 = 2.048 MHz (1.024 MHz低功耗模式)的标称速率传递到sinc滤波器。sinc滤波器部分地为FIR滤波器过滤数据,FIR滤波器产生最终的频率响应。sinc滤波器数据旨在与后处理滤波器一起使用,以形成最终的频率响应。
  下表显示了抽取比和sinc滤波器的输出数据率。sinc滤波器数据速率由CONFIG0寄存器的DR[2:0]位编程。
在这里插入图片描述

3.5.2 FIR滤波器

  数字滤波器的第二部分是多级FIR低通滤波器。从sinc滤波器部分过滤的数据被输入到FIR滤波器。FIR滤波器决定数据的最终频率和相位响应。FIR滤波器由四个阶段组成,如下图所示。
在这里插入图片描述
  前两个FIR级是半带滤波器,每级抽取= 2。第三和第四FIR级决定最终的频率和相位响应。抽取是4和2,对于FIR阶段3和4。FIR滤波器的整体抽取比为32。第3级和第4级的唯一系数集决定线性和最小相位滤波器响应。相位响应由CONFIG0寄存器的phase位选择。
  下表列出了sinc和FIR滤波器阶段的组合抽取比以及相应的FIR滤波器数据率。
在这里插入图片描述

3.5.3 高通滤波器阶段

  数字滤波器的最后一级是高通滤波器(HPF)。高通滤波器被实现为一级滤波器,IIR滤波器。高通滤波器从数据中去除直流和低频。通过编程CONFIG0寄存器的FILTR[1:0]使能HPF。
  下表给出了高通滤波器编程的示例。
在这里插入图片描述
  HPF通过积累数据来实现高通功能。类似于模拟HPF在输入端施加直流阶跃变化后的操作,滤波器需要时间来积累数据以从信号中去除直流。转角频率越低,滤波器安定下来的时间就越长。
  为了缩短HPF的设置时间,偏移寄存器被用作HPF累加器的种子值。每次HPF状态从禁用变为启用时,累加器都会加载偏移寄存器。偏置寄存器可以预置一个估计值,如果直流电平已知,也可以预置一个校准值。为了提高精度,将偏移值按GAIN[3:0] / 400000h的逆值进行缩放。使能HPF后,正常偏移操作被禁止。

  用OFFSET[2:0]寄存器初始化HPF累加器:

  1. 关闭HPF
  2. 将所需的值写入OFFSET[2:0]寄存器
  3. 使能HPF。OFFSET[2:0]被加载到HPF数据累加器中
  4. HPF跟踪来自信号的剩余直流值

  后续对OFFSET[2:0]寄存器的写入将被忽略。要重新加载OFFSET[2:0]寄存器的内容到HPF,请禁用并重新启用HPF。

3.6 时钟输入

  操作需要时钟信号。时钟信号应用于CLK引脚,fCLK = 8.192 MHz用于高功率和中功率模式,4.096 MHz用于低功率模式。与许多精度数据转换器一样,需要低抖动时钟来实现数据表性能。避免使用rc时钟振荡器。建议使用水晶时钟源。为了避免时钟信号振铃,可以在到源端的时钟PCB线路中放置一个串联电阻。时钟信号走线应远离其他时钟信号、输入引脚和模拟组件。

四、设备功能模式

4.1 电源模式

  有三种功率分辨率模式提供功耗和动态范围之间的权衡。
  模式分为高功率、中功率和低功率。有关噪音性能的详细资料,请参阅噪音性能部分。CONFIG0寄存器的MODE[1:0]位选择电源模式。低功耗模式时钟频率为4.096 MHz(半速时钟);因此,输出数据速率也被缩放了一半。

4.2 省电模式

  通过将PWDN引脚设为低电平或通过发送STANDBY命令的软件控制来进行下电。如果需要退出下电,可以将PWDN调高或发送WAKEUP命令退出软件下电(时钟运行)。断电使模拟电路失效;然而,数字LDO (CAPD引脚)仍然偏置,从IOVDD提取小偏置电流。相比之下,软件下电会产生更大的IOVDD偏置电流。在两种断电模式下,数字输出的交流信号停止,但保持高或低驱动。数字输入不能浮动;否则,漏电流会从IOVDD电源流出。如果下电时时钟中断,则复位ADC。断电时同步丢失;因此,请重新同步ADC。

4.3 复位

  ADC有三种复位方法:上电复位(POR)、reset引脚或reset命令。当电源电压超过相应的阈值时,上电复位。通过引脚复位ADC,驱动reset低电平至少两个fCLK周期,然后返回高电平进行复位。通过命令复位,在复位命令的SCLK上升沿第8条之后的下一个fCLK上升沿生效。在重置时,过滤器将重新启动,用户寄存器将重置为默认值。

4.4 同步

  通过SYNC引脚或SYNC命令对ADC进行同步,从而重新启动数字滤波器周期。在CLK的下降沿上同步后,引脚的同步发生在CLK的下一个上升沿上。SYNC命令的同步发生在CLK的上升沿,在该命令的第8位之后。

  以下情况会导致同步丢失:

  • 上电周期,ADC复位,或当硬件或软件进入断电模式
  • 模式变化如下:DR[2:0] (data rate);PHASE (filter phase);MODE[1:0] (power mode);SYNC (synchronization mode);SRC[1:0] (sample rate converter enabled or disabled)

  同步控制方式有脉冲同步和连续同步两种。同步模式由ID/SYNC寄存器的SYNC位编程。

4.4.1 脉冲同步模式

  脉冲同步模式无条件同步SYNC上升沿上的ADC。当同步时,内部过滤器内存复位,DRDY变高,过滤器周期重新开始。以下63个DRDY周期被禁用,以允许数字滤波器沉降。当转换数据准备好时,DRDY断言为低。

4.4.2 连续同步模式

  连续同步模式提供了接受连续时钟信号到同步引脚的选项。ADC将SYNC时钟信号的周期与DRDY信号的N个周期进行比较,以确定是否可以重新同步。
  最初,第一个SYNC正边同步ADC。只有当SYNC的上升沿在N多个DRDY周期之间的时间间隔相差至少±1个fCLK周期时,才会发生重新同步,其中N = 1,2,3等等。否则,SYNC时钟周期与已经存在的DRDY脉冲处于同步状态,不会发生重同步。请注意,当采样率转换器启用时,不能使用连续同步模式。
  同步完成后,DRDY继续脉冲;然而,数据保持低63个数据周期,以允许数字滤波器沉淀。由于数字滤波器的初始延迟,同步输入信号和DRDY脉冲表现出偏移时间。偏移时间是数据速率的函数。

4.5 采样率转换器

  采样率转换器(SRC)通过对调制器数据以写入SRC寄存器的补偿因子设定的新速率重新采样来补偿时钟频率误差。频率补偿范围为±244ppm,分辨率为7.45 ppb(1 / 227)。
  时钟频率误差通过向SCR0和SRC1寄存器写入一个值来补偿。寄存器值为2补码格式,用于正负频率误差补偿。正寄存器数据值降低数据速率频率(增加周期)。新的数据速率频率由DRDY信号的频率观测到。
频率补偿样例如下表所示。8000h禁用采样率转换器。0000h使数据不加补偿地通过,但在同步输入到DRDY脉冲的时间延迟上增加了8 / fCLK延迟。
在这里插入图片描述

4.6 偏置和增益校准

  ADC集成了校准寄存器来校正偏移和增益误差。如下图所示,从滤波器数据中减去24位偏移量(offset[23:0]),然后乘以24位增益值(gain[23:0]),再除以400000h。数据被裁剪为32位以产生最终输出。当高通滤波器启用时,偏移操作被绕过。
在这里插入图片描述

4.6.1 偏移寄存器

  偏移量校正是由一个24位字组成的三个8位寄存器(高地址是MSB)。偏移值左对齐以与32位数据对齐。偏移值为2补码,最大正值为7FFFFFh,最大负值为800000h。从转换数据中减去OFFSET;如下表所示。
在这里插入图片描述
  偏置误差通过带输入短多路复用器选项的偏置校准命令或通过收集短输入ADC数据并将值写入寄存器来纠正。
  虽然偏置校正范围从-FS到+FS,但偏置和增益校正的总和不得超过未校准范围的106%。
  当高通滤波器被启用时,偏移校正被禁用。偏移值被用作起始值,以缩短高通滤波器的沉降时间。要重新加载偏移值到HPF,请禁用并重新启用高通滤波器。

4.6.2 增益寄存器

  增益校正是通过一个24位字,由三个8位寄存器(高地址= MSB)组成。增益值为24位,用直二进制编码,对于gain[23:0],归一化为1.0,等于400000h。应用校准信号后,通过增益校准命令或通过收集ADC数据并将计算值写入增益寄存器来校准增益误差。下表列出了GAIN[23:0]寄存器值的示例。
在这里插入图片描述
  虽然增益值的范围可以大于或小于1,但偏置和增益校正的总和不得超过未校准范围的106%。

4.6.3 校准步骤

  可以使用ADC校准命令或手动校准来执行ADC校准。
  校准程序如下:
  1.选择PGA或缓冲操作,输入通道和PGA增益条件进行校准。
  2.预置OFFSET寄存器= 000000h和GAIN寄存器= 400000h。
  3.禁用高通滤波器进行偏移校准。短输入到系统,或使用输入MUX提供输入。系统级输入短可以产生更精确的校准。输入确定后,发送OFSCAL命令或执行手动校准。
  a. OFSCAL命令。命令发出后,DRDY在81个转换周期后被驱动至低电平,表示校准完成。OFFSET寄存器用新的校准值更新。如下图所示,第一个数据输出使用新的OFFSET值。
在这里插入图片描述
  b.手动校准。等待数字滤波器至少64次转换,然后平均一些数据点,以提高校准精度。将该值写入24位OFFSET寄存器。
  4.施加增益校准电压。输入确定后,发送GANCAL命令或执行手动校准。
  a.GANCAL命令。施加正直流满量程校准电压。命令发出后,DRDY在81个转换周期后被驱动至低电平,表示校准完成。ADC计算增益,使满量程码等于应用的校准信号。如下图所示,第一个数据输出使用新的“GAIN”值。
在这里插入图片描述
  b.手动校准。对采样率或略低于满量程(例如,增益= 1时为2.4 V)的直流校准信号应用交流相干信号。使用小于满量程的校准信号可防止截断输出代码,否则会导致不正确的校准。等待64转换的数字滤波器解决,然后平均一些数据点,以提高校准精度。对于交流信号校准,使用一些相干信号周期来计算均方根值。

五、编程

  相关的SPI接线在这里就不再详细介绍了,只介绍较为重要的命令和接口。

5.1 数据准备(DRDY)接口

  DRDY是一个active-low输出,表示转换数据准备就绪。无论CS的状态如何,DRDY都是活动的。DRDY在SCLK的第一个下降沿上被驱动为高电平,无论是否正在读取数据或输入命令。如下图所示,如果没有检索到数据,DRDY脉冲为8个fCLK周期。
在这里插入图片描述

5.2 数据转换格式

  如下表所示,转换数据采用32位2补码格式,表示正负数。如果需要,可以将CS调高,将数据读取操作缩短为24位。来自Sinc滤波器的数据缩放取决于VREF的值以及PGA或缓冲区操作。
在这里插入图片描述

5.3 命令

  ADC的命令如下表所示。大多数命令的长度都是一个字节。然而,寄存器读和写命令的字节数取决于命令中指定的寄存器数据的数量。
在这里插入图片描述

5.3.1 单字节命令

单字节命令的一般格式如下图所示
在这里插入图片描述

5.3.2 WAKEUP命令

  WAKEUP命令用来退出备用模式,恢复系统正常运行。如果ADC已经上电,则该命令为no operation (NOP)。当退出备用模式时,ADC需要重新同步。

5.3.3 STANDBY命令

  STANDBY命令进入软件下电模式。ADC通过WAKEUP命令退出软件下电模式。

5.3.4 SYNC命令

  SYNC命令用来同步ADC。同步发生在SYNC命令字节的第8位。同步时,当前转换停止并重新启动。如果需要使用软件命令同步多个ADC,需要同时向所有设备下发命令。使用该命令时,SYNC引脚必须为高电平。

5.3.5 RESET命令

  RESET命令用来复位ADC。

5.3.6 直接读取数据

  读取转换数据有两种方法:直接读取数据和命令读取数据。
  直接读取数据不需要命令,而是在DRDY降低后,只需应用SCLK来读取数据。
读数据直接操作如下图所示。当DRDY低时,取CS低开始读操作。
在这里插入图片描述
  CS低导致DOUT从三态模式转换到数据MSB的输出。数据在SCLK的上升沿上读取,在SCLK的下降沿上更新。DRDY在SCLK的第一个下降沿返回高值。
  读32位数据后DOUT是低的。要在新数据可用之前再次读取相同的数据,请使用RDATA命令。
  读取转换数据时保持DIN低。如果发送了RDATA(读转换数据)或RREG(读寄存器数据)命令,输出数据会因该命令而中断。如果在读取操作期间DRDY降低,则除非读取至少三个字节的旧数据,否则新数据将丢失。

5.3.7 读转换数据命令

  RDATA命令(如下图)用于在同一转换周期内重新读取数据或读取被读寄存器命令中断的数据。在这两种情况下,DRDY都是高的,因为DRDY在前一个操作的第一个SCLK上被驱动为高。如果DRDY值高,第一个输出字节是0,后面跟着data。如果为低,则第一个输出字节是转换数据的字节1,它将为输出字节2重新启动。
在这里插入图片描述

5.3.8 RREG:读寄存器命令

  RREG命令读取寄存器数据。该命令由两个字节组成,后面跟着指定寄存器字节数的输出。ADC自动将地址递增到命令的第2字节中指定的寄存器数。递增地址不换行。该命令的第一个字节是添加到寄存器起始地址的操作码,第二个字节是要读取的寄存器数- 1。
  --第一个命令字节:0010 rrrr,其中rrrr是起始寄存器地址
  --第二个命令字节:0000 nnnn,其中nnnn是要读取的寄存器数减去1
  下图给出了一个从寄存器地址01h开始的3个寄存器读操作的示例。第一个寄存器数据出现在DOUT上,位于SCLK的第16个下降沿。数据被锁存在SCLK的上升沿上。
在这里插入图片描述

5.3.9 WREG:写寄存器命令

  WREG命令用于写寄存器数据。该命令是两个字节,后面跟着要写入的指定寄存器字节数。ADC自动将地址递增到命令中指定的寄存器数。递增地址不换行。该命令的第一个字节是添加到寄存器起始地址的操作码,第二个字节是要写入的寄存器数- 1。
  --第一个命令字节:0100 rrrr,其中rrrr是第一个寄存器的起始地址。
  --第二个命令字节:0000 nnnn,其中nnnn是要写入的寄存器数- 1。
  数据字节:取决于指定的寄存器数。
在这里插入图片描述

5.4 寄存器

在这里插入图片描述
在这里插入图片描述

5.4.1 ID/SYNC寄存器

在这里插入图片描述

5.4.2 CONFIG0寄存器

在这里插入图片描述

5.4.3 CONFIG1寄存器

在这里插入图片描述

5.4.4 HPF0, HPF1寄存器

在这里插入图片描述

5.4.5 OFFSET0, OFFSET1, OFFSET2寄存器

在这里插入图片描述

5.4.6 GAIN0, GAIN1, GAIN2寄存器

在这里插入图片描述

5.4.7 GPIO寄存器

在这里插入图片描述

5.4.8 SRC0, SRC1寄存器

在这里插入图片描述

六、代码

ADS1285.C文件

#include "ADS1285.h"
#include "MCT8316.h"
#include "spi.h"
#include "math.h"uint8_t readData[4] ={0x00};uint8_t data[20] = {0x00};uint32_t readDataFinal = 0x0000000;uint32_t offsetFinal = 0x0000000,gainFinal = 0x0000000;uint8_t readData1,readData2,readData3,readData4;// 直接读取数据
void Direct_Read_Data(uint8_t * Data)
{int i = 0;uint8_t command;uint8_t data_temp;while(DRDY);ADC_X_CS_LOW;  // 拉低CS引脚for(i=0;i<4;i++){HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,50);// 读取数据}readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);ADC_X_CS_HIGH;  // 拉低CS引脚HAL_Delay(1);
}// 读取数据,指令--0x12
void ReadConversionData(uint8_t * Data,uint8_t command)
{int i = 0;ADC_X_CS_LOW;  // 拉低CS引脚HAL_SPI_Transmit(&hspi2,(uint8_t *)&command,1,10);for(i=0;i<4;i++){HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,10);// 读取数据}readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);ADC_X_CS_HIGH;  // 拉低CS引脚	}
// 写寄存器
uint8_t  writeData = 0;
void WriteReg(uint8_t *writeRegData, uint8_t number,uint8_t first)
{uint8_t  i=0;// 要写入的数据uint8_t subNumber = number - 1;writeRegData[0] = first;writeRegData[1] = subNumber;  // 将代码个数写入ADC_X_CS_LOW;  // 拉低CS引脚for(i=0;i<number+2;i++){writeData = writeRegData[i];HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeData,1,10);}ADC_X_CS_HIGH;  // 拉高CS引脚
}
// 读寄存器的值
void ReadReg(uint8_t const startAddr, uint8_t *regData, uint8_t number)
{uint8_t  writeReadData = 0,i,readDataTemp = 0;ADC_X_CS_LOW;  // 拉低CS引脚writeReadData = (0x02<<4)|startAddr;HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeReadData,1,10);writeReadData = (0x00<<4)|(number - 1);HAL_SPI_Transmit(&hspi2,(uint8_t *)&writeReadData,1,10);for(i=0;i<number;i++){HAL_SPI_Receive(&hspi2,(uint8_t *)&readDataTemp,1,10);// 读取数据regData[i] = readDataTemp;}offsetFinal = (regData[2]<<16) | (regData[1]<<8) | (regData[0]);gainFinal   = (regData[5]<<16) | (regData[4]<<8) | (regData[3]);ADC_X_CS_HIGH;  // 拉高CS引脚
}
//  初始化:
void ADS1285_Init(uint8_t const startAddr,uint8_t number)
{data[0] = (0x04<<4)|startAddr;// 地址data[1] = number - 1;           // 写入的寄存器个数data[2] = (0x00<<7)|PULSEMODE;  // (0x00<<7)|CONTINUOUSMODEdata[3] = (MIDPOWER<<6)|(SPS250<<3)|(MINI_PHS<<2)|FILTER_RES ; // 00011011 (HIGHPOWER<<6)|(SPS1000<<3)|(LINEAR_PHS<<2)|FIR  // 0100 0011data[4] = (INPUT_1<<5) | (REF_4_096V<<3) | GAIN_1;  // 00001000
//	data[5] = ;
//	data[6] = ;
//	data[7] = ;
//	data[8] = ; WriteReg(data,number,data[0]);
}
// 写入单个寄存器
void SingleByteCommand(uint8_t command)
{ADC_X_CS_LOW;   // 拉低CS引脚HAL_SPI_Transmit(&hspi2,(uint8_t *)&command,1,10);ADC_X_CS_HIGH;  // 拉高CS引脚
}

ADS1285.h文件

#ifndef ADS1285_H
#define ADS1285_H
#include "stm32L4xx_hal.h"// 寄存器地址
#define	ID_SYNC_REG				0x00
#define	CONFIG0_REG 			0x01
#define	CONFIG1_REG 			0x02
#define	HPF0_REG				0x03
#define	HPF1_REG				0x04
#define	OFFSET0_REG				0x05
#define	OFFSET1_REG				0x06
#define	OFFSET2_REG				0x07
#define	GAIN0_REG				0x08
#define	GAIN1_REG				0x09
#define	GAIN2_REG				0x0A
#define	GPIO_REG				0x0B
#define	SRC0_REG				0x0C
#define	SRC1_REG				0x0D// 命令:
#define	WAKEUP				      0x00
#define	STANDBY 				  0x02
#define	SYNC 				      0x04
#define	ADS1285_RESET			  0x06
#define	RDATA				      0x12
#define	OFSCAL				      0x60
#define	GANCAL				      0x61//  个寄存器位:
#define  PULSEMODE          0
#define  CONTINUOUSMODE     1#define  HIGHPOWER          0
#define  MIDPOWER           1
#define  LOWPOWER           2
#define  DePOWER            3#define  SPS250             0
#define  SPS500             1
#define  SPS1000            2
#define  SPS2000            3
#define  SPS4000            4#define  LINEAR_PHS         0
#define  MINI_PHS           1#define  FILTER_RES         0
#define  SINC               1
#define  FIR                2
#define  FIR_IIR            3#define  INPUT_1  			0
#define  INPUT_2  			1
#define  INTERNAL_400  		2
#define  INPUT_1andINPUT_2  3
#define  RESERVED_4  		4
#define  INTERNAL_0  		5
#define  RESERVED_6  		6
#define  RESERVED_7  		7#define  REF_5V  			0
#define  REF_4_096V  		1
#define  REF_2_5V  			2
#define  RESERVED  			3#define  GAIN_1  			0
#define  GAIN_2  			1
#define  GAIN_4  			2
#define  GAIN_8  			3
#define  GAIN_16  			4
#define  GAIN_32  			5
#define  GAIN_64  			6
#define  BUFFER  			7// ADS1285 DRDY引脚,若是该引脚为低电平,则表示数据转换完成
#define  DRDY  HAL_GPIO_ReadPin(ADS_X_DRDY_GPIO_Port, ADS_X_DRDY_Pin)
// CS引脚
#define  ADC_X_CS_LOW  HAL_GPIO_WritePin(ADC_X_CS_GPIO_Port, ADC_X_CS_Pin,0)
#define  ADC_X_CS_HIGH HAL_GPIO_WritePin(ADC_X_CS_GPIO_Port, ADC_X_CS_Pin,1)extern uint8_t readData[4];// 写入单个字节
void SingleByteCommand(uint8_t command);
// 直接读取数据,DRDY引脚拉点之后,将CS引脚拉低,然后读取数据
void Direct_Read_Data(uint8_t * Data);
// 读取数据
void ReadConversionData(uint8_t * Data,uint8_t command);
// 读取寄存器,穿入起始地址和读取寄存器的个数
void ReadReg(uint8_t startAddr, uint8_t *regData, uint8_t number);
// 写入寄存器,穿入起始地址和读取寄存器的个数
void WriteReg(uint8_t *writeRegData, uint8_t number,uint8_t first);
// 初始化
void ADS1285_Init(uint8_t const startAddr,uint8_t number);#endif

七、往期回顾

项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等
项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误
项目进展(四)-双电机均可驱动,配置模拟SPI,调平仪功能初步实现!
项目进展(五)-修复PCB电路板,学习32位ADC芯片ADS1285
项目进展(六)-继续学习32位ADC芯片ADS1285
项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分
项目进展(八)-编写代码,驱动ADS1285
项目进展(九)-完善ADS1285代码
项目进展(十)-解决ADS1285在调试时出现的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP数据报套接字编程

1.1UDP编程原理 对于UDP协议来说&#xff0c;具有无连接&#xff0c;面向数据报的特征&#xff0c;即每次都是没有建立连接&#xff0c;并且一次发送全部数据报&#xff0c;一次接收全部的数据报。Java中使用UDP协议通信&#xff0c;主要基于DatagramSocket类来发送或接收数据报…

C++:菱形继承与虚继承

看下面这个示例代码 class A{ public: int num10; A(){cout<<"A构造"<<endl;} virtual void fun(){cout<<"A虚函数"<<endl;} };class B:public A{ public: B(){cout<<"B构造"<<endl;} void fun(){cout<…

可视化图表:南丁格尔玫瑰图,来自历史上最著名的护士。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的南丁格尔玫瑰图设计&#xff0c;欢迎老铁持续关注我们。 一、南丁格尔与玫瑰图 南丁格尔&#xff08;Florence Nightingale&#xff0c;1820年-1910年&#xff09;是一位英国护士和统计学家&…

按位操作符详解

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来讨论一下按位操作符的知识点与应用&#xff0c;按位操作符有时候在解决一些问题的时候可以提供一个很好的解题思路&#xff0c;话不多说&#xff0c;我们直接来看&#xff01; 今天我们主要是从两个方面来讲述一下按位操作…

Redis:使用redis-dump导出、导入、还原数据实例

redis的备份和还原&#xff0c;借助了第三方的工具&#xff0c;redis-dump 1、安装必要环境 yum -y install zlib-devel openssl-devel2、安装redis-dump 安装ruby&#xff1a; ruby下载地址&#xff1a;https://www.ruby-lang.org/zh_cn/downloads/ 我下载的是 2.5.0 版本…

动态规划课堂6-----回文串问题

目录 引言&#xff1a; 例题1&#xff1a;回文子串 例题2&#xff1a;回文串分割IV 例题3&#xff1a;分割回文串II 例题4&#xff1a;最长回文子序列 例题5&#xff1a;让字符串成为回文串的最小插入次数 引言&#xff1a; 回文字符串 是正着读和倒过来读一样的字符串。…

【周赛】第385场周赛

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 【1】100212.统计前后缀下标对 100212. 统计前后缀下标对 Ihttps://leetcode.cn/problems/count-prefix-and-suffix-pairs-i/ 熟…

4.1_4 文件的物理结构

文章目录 4.1_4 文件的物理结构&#xff08;一&#xff09;文件块、磁盘块&#xff08;二&#xff09;文件分配方式——连续分配&#xff08;三&#xff09;文件分配方式——链接分配&#xff08;1&#xff09;链接分配——隐式链接&#xff08;2&#xff09;链接分配——显式链…

OpenStack之存储cinder

一、 存储 1、DAS 1)存储更多的依赖服务器主机操作系统进行数据的IO读写和存储维护管理&#xff0c;数据备份和恢复要求占用服务器主机资源&#xff08;包括CPU、系统IO等&#xff09; 2)直连式存储与服务器主机之间的连接通道通常采用SCSI连接&#xff0c;随着服务器CPU的处…

Type-C接口介绍

1、USB介绍 &#xff08;1&#xff09;标准USB A型连接器&#xff08;左&#xff09;及B型连接器&#xff08;右&#xff09; 引脚1 VCC&#xff08;5V&#xff09; 引脚2 Data- 引脚3 Data 引脚4 接地 &#xff08;2&#xff09;Micro USB 引脚定义及OTG (USB-HOST) …

k8s CKA upgrade - Kubeadm 版本升级实测

升级版本最好是逐步去升级&#xff0c;不要跨越多个大版本&#xff0c;可能会出错 大体流程&#xff1a; 1.先确定升级版本 2.升级kubeadm 3.驱逐节点 4.升级kubelet和kubectl 5.重启kubelet服务 6.恢复节点&#xff0c;使其上线 1.查看现版本&#xff1a;升级版本 kubectl ge…

华为配置Hotspot2.0无线网络示例

配置Hotspot2.0无线网络示例 组网图形 图1 配置Hotspot2.0无线网络组网图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 某网络服务商在原有移动网络业务的基础上&#xff0c;新增部署WLAN网络接入业务&#xff0c;为用户提供更好的网络体验。但传统的WLAN网络业…

【每日一题】2024年3月汇编(上)

3.1【2369】检查数组是否存在有效划分 2369. 检查数组是否存在有效划分https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/ 1.这样的判断可以用动态规划来解决&#xff0c;用一个长度为(n1) 的数组来记录 是否存在有效划分&#xff0c;dp[i]…

Bean的作用域、Bean的自动装配、注解自动装配 (Spring学习笔记五)

1、Bean 的作用域 官网上显示有六种 1、Bean的作用域默认的是singleton&#xff08;单例模式的实现&#xff09; 也可以显示的设置&#xff08;单例模式的实现&#xff09; <!--用scope可以设置Bean的作用域--><bean id"user2" class"com.li.pojo.Us…

NCV8705MTADJTCG稳压器芯片中文资料规格书PDF数据手册引脚图图片价格功能

产品概述&#xff1a; NCV8705 是一款低噪音、低功耗和低泄漏线性电压稳压器。该器件具有卓越的噪音和 PSRR 规格&#xff0c;适用于使用视频接收器、成像传感器、音频处理器或需要外部洁净电源的任何部件的产品。NCV8705 使用创新的自适应接地电流电路 可确保轻负载调节下的超…

http请求方法15种,附图可以下载保存备查。

一、http请求组成和流程 HTTP请求是客户端&#xff08;如浏览器&#xff09;向服务器发送的请求&#xff0c;以获取特定资源或执行特定操作。HTTP请求由以下几个部分组成&#xff1a; 请求行&#xff1a;包含请求方法、请求的URL和HTTP协议版本。常见的请求方法有GET、POST、P…

数据结构的概念大合集01(含数据结构的基本定义,算法及其描述)

概念大合集01 1、数据结构基础的定义2、数据结构2.1 数据元素之间关系的集合2.2数据结构的三要素2.2.1数据的逻辑结构2.2.2数据的存储&#xff08;物理&#xff09;结构2.2.3数据的运算 3、数据类型4、抽象数据类型类型&#xff08;ADT&#xff09;5、算法及其描述5.1算法的5个…

Qt文件以及文件夹相关类(QDir、QFile、QFileInfo)的使用

关于Qt相关文件读写操作以及文件夹的一些知识&#xff0c;之前也写过一些博客&#xff1a; Qt关于路径的处理&#xff08;绝对路径、相对路径、路径拼接、工作目录、运行目录&#xff09;_qt 相对路径-CSDN博客 C/Qt 读写文件_qt c 读取文本文件-CSDN博客 C/Qt读写ini文件_…

Docker学习之数据管理(超详解析)

Docker存储资源类型&#xff1a; 用户在使用 Docker 的过程中&#xff0c;势必需要查看容器内应用产生的数据&#xff0c;或者需要将容器内数据进行备份&#xff0c;甚至多个容器之间进行数据共享&#xff0c;这必然会涉及到容器的数据管理&#xff1a; &#xff08;1&#xff…

(含代码)利用NVIDIA Triton加速Stable Diffusion XL推理速度

在 NVIDIA AI 推理平台上使用 Stable Diffusion XL 生成令人惊叹的图像 扩散模型正在改变跨行业的创意工作流程。 这些模型通过去噪扩散技术迭代地将随机噪声塑造成人工智能生成的艺术&#xff0c;从而基于简单的文本或图像输入生成令人惊叹的图像。 这可以应用于许多企业用例&…