【ADS867x】14 位 500kSPS 4/8 通道 ADC 简介及驱动应用示例

news2024/12/23 13:17:34

器件特性

  • 具有集成模拟前端的 14 位模数转换器 (ADC)
  • 具有自动和手动扫描功能的 4 通道、8 通道多路复用器
  • 通道独立可编程输入:
    • ±10.24V、±5.12V、±2.56V、±1.28V、±0.64V
    • 10.24V、5.12V、2.56V、1.28V
  • 5V 模拟电源:1.65V 到 5V I/O 电源
  • 恒定的阻性输入阻抗:1MΩ
  • 输入过压保护:高达 ±20V
  • 低漂移的片上 4.096V 基准电压
  • 出色的性能:
    • 500kSPS 的总吞吐量
    • 差分非线性 (DNL):±0.2 最低有效位 (LSB);最大积分非线性 (INL):±0.25 LSB
    • 增益误差和偏移误差的漂移均较低
    • 信噪比 (SNR):85dB;总谐波失真 (THD):–100dB
    • 低功耗:65mW
  • AUX 输入 → 直接连接到 ADC 输入
  • ALARM → 每通道的高低阈值
  • SPI- 兼容接口,支持菊花链连接
  • 工业温度范围:-40°C 至 125°C
  • TSSOP-38 封装 (9.7mm × 4.4mm)

在这里插入图片描述

器件应用

  • 电力自动化
  • 保护中继器
  • PLC 模拟输入模块

器件说明

ADS8674 和 ADS8678 是基于 14 位逐次逼近寄存器 (SAR) 模数转换器 (ADC) 的 4 通道、8 通道集成数据采集系统,工作吞吐量达 500kSPS。 这些器件提供了用于各输入通道的集成模拟前端电路(过压保护高达 ±20V)、支持自动和手动两种扫描模式的 4 通道或 8 通道多路复用器、以及低温度漂移的片上 4.096V 基准电压。 这些器件由单个 5V 模拟电源供电,每个输入通道均可支持真正的双极输入范围((±10.24V、 ±5.12V、±2.56V、±1.28V 和 ±0.64V)和单极输入范围(0V 至 10.24V、0V 至 5.12V、0V 至 2.56V 以及 0V 至 1.28V)。 模拟前端在所有输入范围内的增益均经过了精确调整,以确保高直流精度。 输入范围的选择可通过软件进行编程,各通道输入范围的选择相互独立。 该器件提供了一个 1MΩ 的恒定阻性输入阻抗(无论所选输入范围为何)。

ADS8674 和 ADS8678 为数字主机提供了一个兼容串行外设接口 (SPI) 的简单串行接口,同时支持以菊花链方式连接多个器件。 数字电源可提供 1.65V 到 5.25V 范围内的电压,因此可直接连接各种主机控制器。

引脚配置和功能

在这里插入图片描述

数字接口配置

在这里插入图片描述

驱动示例

以 ADS8674 为例,手动采集模式

  • ads8674.h
/**
 * Copyright (c) 2022-2023,HelloAlpha
 * 
 * Change Logs:
 * Date           Author       Notes
 */
#ifndef __ADS8674_H__
#define __ADS8674_H__

#include "spi_ctrl.h"

/* Command Register */
#define NO_OP           0X0000
#define STDBY           0X8200
#define PWR_DN          0X8300
#define RST             0X8500
#define AUTO_RST        0XA000
     
#define MAN_CH_0        0XC000
#define MAN_CH_1        0XC400
#define MAN_CH_2        0XC800
#define MAN_CH_3        0XCC00
#define MAN_AUX         0XE000

/* Program Register */ 
#define AUTO_SEQ_EN                 0X01
#define Channel_Power_Down          0X02
#define Feature_Select              0X03
#define Channel_0_Input_Range       0X05
#define Channel_1_Input_Range       0X06
#define Channel_2_Input_Range       0X07
#define Channel_3_Input_Range       0X08

#define WRITE       1
#define READ        0

/****Stype of SPI rxData****/	
#define	WR_REG_DATA_NOT_USE     0
#define WR_CMD_DATA_NOT_USE     0
#define WR_REG_DATA             1
#define WR_CMD_DATA             2

/******ADS8674 Control******/
#define CH3_EN              0X08
#define CH2_EN              0X04
#define CH1_EN              0X02
#define CH0_EN              0X01

#define CH3_PD              0X08
#define CH2_PD              0X04
#define CH1_PD              0X02
#define CH0_PD              0X01
 
#define VREF_25_25          0X00
#define VREF_125_125        0X01
#define VREF_0625_0625      0X02
#define VREF_0_25           0X05
#define VREF_0_125          0X06

/*** For SPI Bus Control ***/
#define ADS8674_START_COMMUNICATION     SPI_START_COMMUNICATION
#define ADS8674_END_COMMUNICATION       SPI_STOP_COMMUNICATION

void ADS8674_SPI_ReadWrite_xBytes(uint8_t *txData, uint8_t *rxData, uint32_t dataLength);
void ADS8674_SPI_Write_CommandRegister(uint32_t command);
void ADS8674_SPI_Write_ProgramRegister(uint32_t address, uint32_t data);
void ADS8674_SPI_Read_ProgramRegister(uint32_t address);
void ADS8674_Set_Auto_RST_Mode(void);
void ADS8674_Set_Auto_Scan_Sequence(uint32_t sequence);
void ADS8674_Set_CH_Range_Select(uint32_t channel, uint32_t range);
void ADS8674_Get_AUTO_RST_Mode_Data(void);
void ADS8674_Get_Manual_Mode_Data(uint32_t channel);
void ADS8674_Init(void);
uint32_t ADS8674_Read_CH(uint32_t channel);

extern uint8_t  ADS8674_rxBuf_4Byte[4];
extern uint8_t ADS8674_rxBuf_16Byte[16];
extern uint8_t  Return_Data_Format;

#endif
  • ads8674.c
/**
 * Copyright (c) 2022-2023,HelloAlpha
 * 
 * Change Logs:
 * Date           Author       Notes
 */
#include "ads8674.h"
#include "sleep.h"

#define DELAY_TIME      500
#define ADS_DELAY(...)	usleep(__VA_ARGS__)

uint8_t ADS8674_rxBuf_4Byte[4];
uint8_t ADS8674_rxBuf_16Byte[16];
uint8_t Return_Data_Format = 0;

void ADS8674_SPI_ReadWrite_xBytes(uint8_t *txData, uint8_t *rxData, uint32_t dataLength)
{
    ADS8674_START_COMMUNICATION;
    for(uint8_t i = 0; i < dataLength; i++)
    {
        rxData[i] = SOFT_SPI_RW_MODE1(txData[i]);
    }
    ADS8674_END_COMMUNICATION;
}

void ADS8674_SPI_Write_CommandRegister(uint32_t command)
{
    uint8_t sendData_Temp[4];
    sendData_Temp[0] = (command & 0XFF00) >> 8;
    sendData_Temp[1] = command & 0X00FF;
    ADS8674_SPI_ReadWrite_xBytes(sendData_Temp, ADS8674_rxBuf_4Byte, 4);
}

void ADS8674_SPI_Write_ProgramRegister(uint32_t address, uint32_t data)
{
    uint8_t sendData_Temp[4];
    sendData_Temp[0] = (address << 1) | WRITE;
    sendData_Temp[1] = data;
    ADS8674_SPI_ReadWrite_xBytes(sendData_Temp, ADS8674_rxBuf_4Byte, 4);
}

void ADS8674_SPI_Read_ProgramRegister(uint32_t address)
{
    static uint8_t sendData_Temp[4];
    sendData_Temp[0] = (address) << 1 | READ;
    sendData_Temp[1] = 0xFF;
    ADS8674_SPI_ReadWrite_xBytes(sendData_Temp, ADS8674_rxBuf_4Byte, 4);
}

void ADS8674_Set_Auto_RST_Mode(void)
{
    Return_Data_Format = WR_CMD_DATA_NOT_USE;
    ADS8674_SPI_Write_CommandRegister(AUTO_RST);
}

void ADS8674_Set_Auto_Scan_Sequence(uint32_t sequence)
{
    Return_Data_Format = WR_REG_DATA_NOT_USE;
    ADS8674_SPI_Write_ProgramRegister(AUTO_SEQ_EN, sequence);
}

void ADS8674_Set_CH_Range_Select(uint32_t channel, uint32_t range)
{
    Return_Data_Format = WR_REG_DATA_NOT_USE;
    ADS8674_SPI_Write_ProgramRegister(channel, range);
}

void ADS8674_Get_AUTO_RST_Mode_Data(void)
{
    Return_Data_Format = WR_CMD_DATA;
    ADS8674_SPI_Write_CommandRegister(0x00);	
}

void ADS8674_Get_Manual_Mode_Data(uint32_t channel)
{
    Return_Data_Format = WR_CMD_DATA;
    ADS8674_SPI_Write_CommandRegister(channel);
}

uint32_t ADS8674_Read_CH(uint32_t channel)
{
	// 1. send MAN_Ch_n command
	ADS8674_Get_Manual_Mode_Data(channel);
    ADS_DELAY(DELAY_TIME);

	// 2. send NO_OP command (0x0000), read data
    ADS8674_SPI_Write_CommandRegister(NO_OP);
    ADS_DELAY(DELAY_TIME);
	
    uint32_t ADC_Value = ((uint32_t)(ADS8674_rxBuf_4Byte[0] & 0x01) << 24) + 
        ((ADS8674_rxBuf_4Byte[1]) << 16) + ((ADS8674_rxBuf_4Byte[2]) << 8) + 
        ADS8674_rxBuf_4Byte[3];
	return ADC_Value;
}

void ADS8674_Init(void)
{
	ADS8674_SPI_Write_CommandRegister(STDBY);
	ADS_DELAY(DELAY_TIME);
    ADS8674_Set_Auto_Scan_Sequence(0x00);
    ADS_DELAY(DELAY_TIME);
    ADS8674_SPI_Write_ProgramRegister(Channel_Power_Down, 0);
    ADS_DELAY(DELAY_TIME);
    ADS8674_SPI_Write_ProgramRegister(Feature_Select, 0);
    ADS_DELAY(DELAY_TIME);
    ADS8674_Set_CH_Range_Select(Channel_0_Input_Range, VREF_0_25);
    ADS_DELAY(DELAY_TIME);
    ADS8674_Set_CH_Range_Select(Channel_1_Input_Range, VREF_0_25);
    ADS_DELAY(DELAY_TIME);
    ADS8674_Set_CH_Range_Select(Channel_2_Input_Range, VREF_0_25);
    ADS_DELAY(DELAY_TIME);
    ADS8674_Set_CH_Range_Select(Channel_3_Input_Range, VREF_0_25);
    ADS_DELAY(DELAY_TIME);
}

获取数据手册

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

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

相关文章

Android 14 快速适配要点

随着 Google I/O 2023 发布的 Android beta2 &#xff0c;预计 Android 14 将在2023年第三季度发布&#xff0c;目前看整体需要适配的内容已经趋向稳定&#xff0c;那就根据官方文档简单做个适配要点总结吧。 如何做到最优雅的版本适配&#xff1f;那就是尽可能提高 minitSdkVe…

详细版易学版TypeScript - 类型声明:字符串数字null布尔undefined数组any对象void类型推断联合类型

根据官方 TypeScript 的注意事项&#xff0c;建议不要使用 Number、String、Boolean、Symbol 或 Object。 ts各类型声明的代码如下&#xff1a; 一、字符串类型 let str: string hello; str ts; 二、数字类型 let num: number 123; num 456; 三、布尔类型 let flag: boolea…

C语言实现队列--数据结构

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

No.065<软考>《(高项)备考大全》【专项3】《论文》

《论文》 1 论文部分相关1.1 考试相关1.2 考试核心相关1.3 历年考试分析1.4 复习建议1.5 评分标准1.5.1 评分的几个方面1.5.2 不及格的几种类型1.5.3 扣分项1.5.4 加分项 1.6 时间进度安排1.7 如何准备 2 必背核心知识 - 10大领域47个过程3 论文写作技巧3.1 论文架构3.2 论文题…

SpringBoot——引导类的简单介绍

简单介绍&#xff1a; 之前我们就说到过引导类&#xff0c;之不过当时就是简单的说了一下这个名字&#xff0c;让大家记住我们运行的程序的学名叫做引导类&#xff0c;但是我们并没有进入看过&#xff0c;介绍过它的作用&#xff0c;这次我们就来简单的介绍一下这个类的作用。…

[NLP] SentenceTransformers使用介绍

SentenceTransformers 是一个可以用于句子、文本和图像嵌入的Python库。 可以为 100 多种语言计算文本的嵌入并且可以轻松地将它们用于语义文本相似性、语义搜索和同义词挖掘等常见任务。 该框架基于 PyTorch 和 Transformers&#xff0c;并提供了大量针对各种任务的预训练模型…

STEP7-MicroWin SMART中修改变量注释的具体方法(绝对寻址+符号寻址)

STEP7-MicroWin SMART中修改变量注释的具体方法(绝对寻址+符号寻址) 如下图所示,我们可以在符号表中定义变量的符号名称以及注释信息, 使用时需注意以下事项: 1.在 STEP 7-Micro/WIN SMART 软件中,可以建立多个符号表,但不允许将相同的符号名多次用作全局符号赋值,在单…

1707_Python中的多成员处理

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 欢迎路过的YUAN类朋友们&#xff0c;希望我们能够相互交流共同成长。如有错误或者不足希望及时指点指出&#xff0c;不胜感激&#xff01;以下是我的联系方式&#xff1a; E…

Kali-linux识别活跃的主机

尝试渗透测试之前&#xff0c;必须先识别在这个目标网络内活跃的主机。在一个目标网络内&#xff0c;最简单的方法将是执行ping命令。当然&#xff0c;它可能被一个主机拒绝&#xff0c;也可能被接收。本节将介绍使用Nmap工具识别活跃的主机。 网络映射器工具Nmap Nmap是一个…

JavaScript经典教程(七)-- JavaScript中级

197&#xff1a;in、预解析、变量提升、对象引用、Date对象 1、预解析 即&#xff0c;把var的变量在&#xff0c;作用域下&#xff0c;提前&#xff1b; &#xff08;1&#xff09;JS代码运行原理 预先解析&#xff0c;JS第一次解析代码叫预解析。 JS本身会解析两次代码&a…

vue非单文件组件

非单文件组件指的是&#xff1a;一个文件中包含了多个组件。 Vue 中使用组件的三大步骤&#xff1a;1. 创建组件、2. 注册组件、3. 使用组件。 组件使用流程【第一步&#xff1a;创建组件】 利用 Vue.extend() 方法创建组件: // 第一步&#xff1a;创建 frameHead 组件 cons…

前端015_标签模块_删除功能

标签模块_删除功能 1、需求分析2、EasyMock 添加模拟接口3、Api 调用接口4、测试1、需求分析 当点击删除按钮后, 弹出提示框。点击确定后,执行删除并刷新列表数据 确认消息弹框参考:https://element.eleme.cn/#/zh-CN/component/message-box#que-ren-xiao-xi 2、EasyMock …

【AUTOSAR】【以太网】TCPIP

目录 一、概述 二、约束和假设 三、依赖模块 3.1 EthIf 3.2 EthSM 3.3 SoAd 3.4 KeyM 3.5 CSM 四、功能说明 4.1 系统扩展性 4.2 IPv4 4.2.1 IPv4 4.2.2 ARP 4.2.3 Auto-IP 4.2.4 ICMP 4.3 IPv6 4.4 IPSec 4.5 基于IP的协议 4.5.1 本地地址表 4.5.2 UDP 4…

音视频八股文(12)-- ffmpeg 音频重采样

1重采样 1.1 什么是重采样 所谓的重采样&#xff0c;就是改变⾳频的采样率、sample format、声道数等参数&#xff0c;使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样&#xff1f;当然是原有的⾳频参数不满⾜我们的需求&#xff0c;⽐如在FFmpeg解码⾳频…

【C++初阶】类和对象(四)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C初阶】…

(二)zookeeper实战——zookeeper集群搭建

前言 本节内容我们主要介绍一下如何在centos系统下搭建一套高可用的zookeeper集群&#xff0c;zookeeper是我们常用的中间键之一&#xff0c;例如使用zookeeper实现分布式锁、Hadoop集群高可用、kafka集群高可用等等。我们以以下三台服务器为例&#xff1a; zookeeper服务器 I…

R语言tidyverse教程:ggplot2绘图初步

文章目录 基本流程渲染美化坐标轴设置 R语言系列&#xff1a; 编程基础&#x1f48e;循环语句&#x1f48e;向量、矩阵和数组&#x1f48e;列表、数据帧排序函数&#x1f48e;apply系列函数tidyverse&#xff1a;readr&#x1f48e;tibble 基本流程 ggplot2有其独特的绘图语…

【算法题】LCP 74. 最强祝福力场

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 小扣在探索丛林的过程中&#xff0…

MPLS格式和802.1q帧格式

一.MPLS IETF开发的多协议标记交换&#xff08;MPLS)把第2层的链路状态信息&#xff08;带宽、延迟、利用率等&#xff09;集成到第3层的协议数据单元中&#xff0c;从而简化和改进了第3层分组的交换过程 。理论上&#xff0c;MPLS支持任何第2层和第3层协议。MPLS包头的位置界…

web集群第一次作业

目录 一. 简述静态网页和动态网页的区别 二. 简述 Web1.0 和 Web2.0 的区别 三. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 一. 简述静态网页和动态网页的区别 1. 首先&#xff0c;两者的页面资源特征不同&#xff1a; 静态网页处理文件类型有…