02- 模块化编程-007 Ltc1684( ADC16-Bit)采样显示

news2024/11/8 0:44:30

1、Ltc1684芯片介绍

        该芯片是一款高精度的16位模数转换器(ADC),适合于高精度仪器的开发,它能提供精准的模拟信号到数字信号的转换。

特性

        采用 MSOP 封装的 16 位、250ksps ADC

        单 5V 电源

        低电源电流:850μA (典型值) 自动停机功能可把电源电流减小至 2μA (在 1ksps)

        真正的差分输入

        单通道 (LTC1864) 或双通道 (LTC1865) 版本

        SPI/MICROWIRE™ 兼容型串行 I/O

特点

  1. 16位分辨率:这是AD转换器的关键参数之一,意味着它可以将模拟信号分成2^16,即65536个不同的数字级别,从而提供非常细腻的信号分辨率。

  2. 精度:高精度意味着转换器输出的数字值与实际输入信号非常接近,误差很小。这对于那些对精确度要求非常高的应用场景(例如医疗设备、实验室仪器和精密测量设备)来说至关重要。
  3. 适用性:LTC1684适合高精度仪器的开发,表明它的设计兼顾了性能和使用的便捷性,使其能够在广泛的工业和科研领域中应用。
  4. 性能指标:除了分辨率和精度,LTC1684还可能具有高速采样、低功耗、低噪声等特性,这些都能进一步提高转换性能,对于高精度仪器来说尤其重要。
引脚图

引脚名称中文释义
VREF (Pin 1)参考输入。参考输入定义了A/D转换器的范围,必须相对于GND保持无噪声。
IN+, IN- (Pins 2, 3)模拟输入。这些输入必须相对于GND保持无噪声。
GND (Pin 4)模拟地。GND应直接连接到模拟地平面。
CONV (Pin 5)转换输入。在此输入上逻辑高电平启动A/D转换过程。如果CONV输入在A/D转换完成后保持高电平,部件将保持高电平。
SDO (Pin 6)数字数据输出。A/D转换结果从此引脚移出。
SCK (Pin 7)移位时钟输入。此时钟同步串行数据传输。
Vcc (Pin 8)正电源。此电源必须保持无噪声和纹波,通过直接绕过到模拟地平面来实现。

 关键参数

 

 

         重点关注INL(增益误差,Integral Non-Linearity)的数据。因为是仿真不是实测,所以很难评价。

 时序图

 2、仿真电路

按照图示接线,电压在数码管上显示为x.xxxx

3、软件代码

main.c

//***************************************************************************/
//*  文件名:min_sys_887.c
//*  文件描述:用于单个模块的驱动测试仿真
//*  创建人:bianjingyuan  2024年11月4日
//*  编译环境: Windows XP + MPLAB IDE 8.83 + Picc 9.60
//*  硬件信息:PIC16f887(20MHZ),max7219(8位数码管)
//*  修改记录:无
//***************************************************************************/
//   原始硬件资源分配表:
//	  pic16f887工作频率 20MHZ  外部晶体振荡
//***************************************************************************/
//	  max7219的引脚定义如下:
// 		din  		RE0		//RE0-RE2为887引脚输出
// 		clk_1  		RE2=1
// 		clk_0  		RE2=0
// 		load_1  	RE1=1
//	 	load_0  	RE1=0
//***************************************************************************/
#include 	"pic.h"					//包含单片机内部资源预定义
//#include 	"max1241-Io.h"	
//#include 	"Adc0808.h"
#include 	"PIC16F887_Delay.h"
// 数据类型定义
#define 	uchar 	unsigned char
#define 	uint  	unsigned int
#define 	ulong 	unsigned long
#define 	nop		asm("NOP")
#define 	sleep  	asm("sleep")

/*------max7219主要引脚-------*/
//RE0-RE2为887引脚输出
#define din  		RE0
#define load_1  	RE1=1
#define load_0  	RE1=0  
#define clk_1  		RE2=1
#define clk_0  		RE2=0
// ****************************887芯片配置位*************************************/
__CONFIG (0x20F2);			// 20MHZ外部晶振
//#define 	XTAL_FREQ 		20 // 定义主频,单位为赫兹 (MHz), 请根据实际晶振频率设置
// *************************以下声明本模块中所调用的函数类型 *****************/
//void delayus(uchar a);// 延时10us最准
//void delayms(uchar a);// 延时100ms最准
void delay1s(void);// 延时约1秒钟
void Initial_System(void);// 初始化系统参数和配置
void Set_Port_IO(void);// 设置I/O端口状态
void ad_init(void);	
void send(uchar addres, uchar data);
void max7219_int(void);
void cal_hex(uint add4) ;	//计算显示数值X.XXX
void cal_ltc1684_hex(uint add4); 	//计算显示数值X.XXXx
// *****************************定义全局变量***********************************/
uchar k,i,m;				//定义循环控制变量

uchar add3,add2,add1,add0;	//显示数据寄存器4位

//**************************新增模块的相关定义**********************************/
extern uchar temp_h; // 存储温度整数部分(范围从 0 到 255)
extern uchar temp_l; // 存储温度小数部分(范围从 0 到 99)
extern uint  	adre_1684;
extern uchar 	ltc1684_hex[5];				//显示数据x.xxxx
extern ulong counter;    			//n次A/D采样结果累加寄存器,n小于16
//**************************新增模块的函数定义**********************************/
extern void  LTC1684_init_io(void);
extern void  LTC1684_read_io()	;
//********************************************************************
//*  文件名:main.c
//*  文件描述:单片机主程序,负责系统初始化和电压监测
//*  编译环境: Windows XP + MPLAB IDE 8.83 + Picc 9.60
//*  编程者: bianjingyuan
//*  编程日期: 2024-11-05
//*  版本号:1.0
//*  修改记录:无
//********************************************************************
void main()
{
    Initial_System();                 // 初始化系统设置
    ad_init();                        // 初始化AD转换功能
    Set_Port_IO();                    // 设置端口IO方向
    max7219_int();                    // 初始化MAX7219显示驱动
    di();                             // 禁用全局中断

    TRISC0 = 1;                       // 设置RC0为输入
    LTC1684_init_io();                // 初始化LTC1684的IO口
    
    send(0x01, XTAL_FREQ / 10);      // 发送ADC结果的高位
    send(0x02, XTAL_FREQ % 10);      // 发送ADC结果的低位
    send(0x03, 15);                   // 发送固定值15
    send(0x04, 4);                    // 发送固定值4
    ltc1684_hex[0] = 0; 
    ltc1684_hex[1] = 0; 
    ltc1684_hex[2] = 0; 
    ltc1684_hex[3] = 0; 
    ltc1684_hex[4] = 0; 
    add3 = 0; 
    add2 = 0;                         // 清除显示数据
    add1 = 0; 
    add0 = 0;
    


redo:                                // 循环标签
    counter = 0;                     // 初始化计数器
    for (k = 50; k > 0; k--)         // 基准电压5.12V的采样
    {
        LTC1684_read_io();           // 读取LTC1684转换结果
        counter = counter + adre_1684; // 累加AD转换结果
    }
    cal_ltc1684_hex(counter >> 6);   // 将ADC结果计算为十六进制格式并加小数点
    send(0x04, ltc1684_hex[4] + 128); // 发送格式化后的数据
    send(0x05, ltc1684_hex[3]);      // 发送LTC1684的高位
    send(0x06, ltc1684_hex[2]);      // 发送LTC1684的次高位
    send(0x07, ltc1684_hex[1]);      // 发送LTC1684的次低位
    send(0x08, ltc1684_hex[0]);      // 发送LTC1684的低位

    delayms(100);                     // 延时100毫秒
    goto redo;                       // 循环返回到redo标签

}

/**************************以下为函数和子程序********************************/ 
void Initial_System(void)
{
    OPTION = 0b01010000;       // 设置定时器的时间为1us
    // OSCCON = 0x71;          // 内部震荡器设置为8MHz
    INTCON = 0b01000000;       // 使能外围模块中断
}

void Set_Port_IO(void)
{
    TRISA = 0b00000000;        // 设置PORTA为输出
    PORTA = 0b00000000;        // 初始化PORTA为低
    TRISB = 0b00000000;        // 设置PORTB为输出
    PORTB = 0b00000000;        // 初始化PORTB为低
    TRISC = 0b00000000;        // 设置PORTC为输出
    PORTC = 0b00000000;        // 初始化PORTC为低
    TRISD = 0b00000000;        // 设置PORTD为输出
    PORTD = 0b00000000;        // 初始化PORTD为低
    TRISE = 0b00000000;        // 设置PORTE为输出,显示驱动
    PORTE = 0b00000000;        // 初始化PORTE为低
}

void ad_init(void)
{
    ANSEL   = 0;                		// 清除模拟数字选择,允许数字操作
    ANSELH  = 0b00000000;       	// 清除高位选择,使用数字操作
    ADCON0  = 0b10000001;       	// 从0通道开始,FOSC/32
    // ADCON1 = 0b10110000;     // 右对齐,选择正负电压基准
    ADCON1  = 0b10000000;       	// 设置右对齐,选择单电压基准
}

void delay1s(void)              // 延迟1秒
{
    ulong d = 185300;           // 对应20MHz的工作频率
    while (--d);                // 计数减少实现延迟
}

void send(uchar address, uchar data)
{
    uchar i = 8;

    load_0;                      // 准备移位

    // 发送位地址
    for (i = 8; i > 0; i--)
    {
        clk_0;                   // 产生时钟信号
        din = (address & 0x80) ? 1 : 0; // 取高位
        address <<= 1;                  // 地址左移
        nop; nop; nop; nop; nop;         // 延迟
        clk_1;                   // 结束时钟信号
    }
    
    // 发送数据
    for (i = 8; i > 0; i--)
    {
        clk_0;                   // 产生时钟信号
        din = (data & 0x80) ? 1 : 0;    // 取高位
        data <<= 1;                     // 数据左移
        nop; nop; nop; nop; nop;         // 延迟
        clk_1;                   // 结束时钟信号
    }
    
    nop; nop; nop; nop; nop;  // 额外延迟
    load_1;                 // 锁存数据
}

void max7219_int()
{
    send(0x0F, 0x00); // 发送命令以设置正常操作
    send(0x0C, 0x01); // 发送命令以不进入省电模式
    send(0x0B, 0x07); // 发送命令以显示8个数码管
    send(0x0A, 0x04); // 发送命令以设置显示强度
    send(0x09, 0xFF); // 发送命令以全解码8个数码管
    send(0x01, 1);     // 测试数码管的完整性,发送测试数据1
    send(0x02, 2);
    send(0x03, 3);
    send(0x04, 4);
    send(0x05, 5);
    send(0x06, 6);
    send(0x07, 7);
    send(0x08, 8);
}

void cal_hex(uint add4)           // 计算并显示数值X.XXX
{
    add3 = add4 / 1000;            // 计算千位
    add2 = (add4 % 1000) / 100;    // 计算百位
    add1 = (add4 % 100) / 10;       // 计算十位
    add0 = add4 % 10;               // 计算个位
}

void cal_ltc1684_hex(uint add4)   // 计算并显示数值X.XXXx
{
    ltc1684_hex[4] = add4 / 10000;      // 计算万位
    ltc1684_hex[3] = (add4 % 10000) / 1000; // 计算千位
    ltc1684_hex[2] = (add4 % 1000) / 100;   // 计算百位
    ltc1684_hex[1] = (add4 % 100) / 10;     // 计算十位
    ltc1684_hex[0] = add4 % 10;             // 计算个位
}

/*****************************以下为函数和子程序****************************/
//* 名称:   LTC1684_read_io
//* 说明:   IO模拟SPI数据AD转换单次采样
//* 功能:   16位AD转换单次采样
//* 调用:   无
//* 输入:   
//* 返回值: 无
//***************************************************************************/
void  LTC1684_read_io()		//LTC1684 IO模拟驱动程序
{	
	uchar k;
	adre_1684=0;			//
	sclk=1;	conv=0;			//空闲时时钟为1,开始转换过程
	nop;conv=1;delayus(2);	//需要至少3.2us的延时
	conv=0;					//使能1684数据传输
	for (k=15;k>0;k--)
	{	
		sclk=0;
		nop;nop;nop;nop;nop;nop;nop;nop;//delay2us
		sclk=1;				//从第一个时钟的上升沿开始输出数据
		adre_1684|=dout;	//delay2us
		adre_1684<<=1;		//高位前移
	}
	sclk=0;
	nop;nop;nop;nop;nop;nop;nop;nop;//delay2us
	sclk=1;					//第16个时钟不再移位了
	adre_1684|=dout;		//完成16位采样数据的寄存
	conv=1;					//关闭1684
}
//***************************************************************************/
//* 名称:   LTC1684_init_io()
//* 说明:  	IO模拟驱动1684的初始化
//* 功能:   单片1684的初始化
//* 调用:   无
//* 输入:   无
//* 返回值: 无
//***************************************************************************/
void LTC1684_init_io(void)
{	
	conv=1;			//关闭1684
	sclk=1;			//空闲时时钟为1
}
void Model_Test(void)
{
    uchar k;                      // 定义变量 k
    counter = 0;                  // 初始化计数器
/* 
    for (k = 50; k > 0; k--)      // 基准电压5.12V的采样
    {
        LTC1684_read_io();        // 读取LTC1684转换结果
        counter = counter + adre_1684; // 累加AD转换结果
    }

    cal_ltc1684_hex(counter >> 6);   // 将ADC结果计算为十六进制格式并加小数点
    TRISC0 = 1;                      // 设置RC0为输入
    LTC1684_init_io();               // 初始化LTC1684的IO口
    ltc1684_hex[0] = 0; 
    ltc1684_hex[1] = 0; 
    ltc1684_hex[2] = 0; 
    ltc1684_hex[3] = 0; 
    ltc1684_hex[4] = 0; 
    send(0x04, ltc1684_hex[4] + 128); // 发送格式化后的数据
    send(0x05, ltc1684_hex[3]);      // 发送LTC1684的高位
    send(0x06, ltc1684_hex[2]);      // 发送LTC1684的次高位
    send(0x07, ltc1684_hex[1]);      // 发送LTC1684的次低位
    send(0x08, ltc1684_hex[0]);      // 发送LTC1684的低位
    */
}

4、代码解析

        该代码实现了一个基于PIC16F887微控制器和LTC1684模数转换器的系统,通过MAX7219显示驱动将电压转换结果显示在八位数码管上。程序的主要功能包括:

  1. 初始化系统配置、I/O端口和AD转换功能。
  2. 通过LTC1684进行16位AD转换,采集电压信号。
  3. 对AD转换结果进行处理,格式化为BCD格式。
  4. 使用MAX7219显示驱动将处理后的数据在数码管上显示。
  5. 主循环不断采集数据并更新显示。

5、硬件资源分配表

序号引脚名称类别方向功能定义内容相关的寄存器及配置
1RE0数字IO输出DINMAX7219数据输入TRISE=0; PORTE=0;
2RE1数字IO输出LOADMAX7219的片选信号TRISE=0; PORTE=0;
3RE2数字IO输出CLKMAX7219时钟信号TRISE=0; PORTE=0;
4RC0数字IO输入doutLTC1684的数据输出TRISC=1;
5RC1数字IO输出sclkLTC1684的时钟信号TRISC=0; PORTC=0;
6RC2数字IO输出convLTC1684转换控制信号TRISC=0; PORTC=0;

        基于上述硬件资源分配,程序实现了以下主要功能:

  1. 实现对LTC1684模数转换器的16位AD数据采集。
  2. 通过MAX7219驱动实现数据在数码管上的显示。
  3. 持续监测输入信号并更新显示结果,适用于需要高精度电压测量和显示的场合。

6、仿真运行结果

 

 

 

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

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

相关文章

Chrome与火狐哪个浏览器的移动版本更流畅

在当今的数字化时代&#xff0c;移动设备已经成为我们生活中不可或缺的一部分。而浏览器作为我们访问互联网的重要工具&#xff0c;其性能和用户体验直接影响到我们的使用感受。本文将对比Chrome和火狐&#xff08;Firefox&#xff09;两款主流浏览器的移动版本&#xff0c;探讨…

人工智能学习--归一化(Normalization)

概念 归一化是数据预处理中将不同量纲的特征数据缩放至同一尺度的过程&#xff0c;使特征值落在同一范围&#xff08;如[0, 1]或[-1, 1]&#xff09;。归一化有助于消除量纲影响&#xff0c;提升算法的收敛速度和模型稳定性&#xff0c;尤其在梯度下降和距离计算等算法中尤为重…

xrc的比赛

先看考试题&#xff0c;附加题最后再写 T1 首先看到是求逆序对为奇数的子串&#xff0c;发现只需要贪心 贪心发现求长度为2的逆序对最优&#xff0c;所以时间复杂度为 O ( n ) O(n) O(n)的贪心就能过了 #include<bits/stdc.h> using namespace std; int read() {int x…

基于SSM的社区物业管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…

Json 类型与多值索引 — OceanBase 4.3.2 AP 功能体验

本文来自 2024年OceanBase技术征文大赛——“让技术被看见 | OceanBase 布道师计划”的用户征文。也欢迎更多的技术爱好者参与征文&#xff0c;赢取万元大奖。和我们一起&#xff0c;用文字让代码跳动起来&#xff01; 参与2024年OceanBase技术征文大赛>> MySQL在5.7.8…

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色&#xff0c;分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…

YOLOv11融合IncepitonNeXt[CVPR2024]及相关改进思路

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2303.16900 代码链接&#xff1a;https://github.com/sail-sg/inceptionnext 论文速览&#xff1a;受 ViT 长距离建模能力的启发&#xff0c;大核卷积…

汽车免拆诊断案例 | 2017款凯迪拉克XT5车组合仪表上的指针均失灵

故障现象 一辆2017款凯迪拉克XT5车&#xff0c;搭载LTG 发动机&#xff0c;累计行驶里程约为17.2万km。车主反映&#xff0c;组合仪表上的发动机转速表、车速表、燃油表及发动机冷却液温度表的指针均不指示&#xff0c;但发动机起动及运转正常&#xff0c;且车辆行驶正常。 故…

MySQL数据库单表查询习题

目录 数据内容介绍习题题目答案 数据内容介绍 数据库中有两个表 ​​​​ 内容如下&#xff1a; 习题 题目 查询出部门编号为D2019060011的所有员工所有财务总监的姓名、编号和部门编号。找出奖金高于工资的员工。找出奖金高于工资40%的员工。找出部门编号为D2019090011中所有…

「Mac畅玩鸿蒙与硬件25」UI互动应用篇2 - 计时器应用实现

本篇将带领你实现一个实用的计时器应用&#xff0c;用户可以启动、暂停或重置计时器。该项目将涉及时间控制、状态管理以及按钮交互&#xff0c;是掌握鸿蒙应用开发的重要步骤。 关键词 UI互动应用时间控制状态管理用户交互 一、功能说明 在这个计时器应用中&#xff0c;用户…

Java高效学习家教平台系统小程序源码

&#x1f4da; 家教平台系统&#xff1a;让孩子学习更高效的秘密武器 &#x1f680; &#x1f469;‍&#x1f3eb; 引言&#xff1a;家教新风尚&#xff0c;线上平台引领教育潮流 在这个信息爆炸的时代&#xff0c;家教平台系统如同雨后春笋般涌现&#xff0c;为孩子们的学习…

# Python基础到实战一飞冲天(一)--linux基础(二)

Python基础到实战一飞冲天&#xff08;一&#xff09;–linux基础&#xff08;二&#xff09; 一、Ubuntu系统目录结构演示和简介 1、linux 用户目录 位于 /home/user&#xff0c;称之为用户工作目录或家目录&#xff0c;表示方式&#xff1a; /home/user ~2、 Linux 主要目…

canfestival主站多电机对象字典配置

不要使用数组进行命名&#xff1a;无法运行PDO 使用各自命名的方式&#xff1a;

基于python多准则决策分析的汽车推荐算法设计与实现

摘要 随着汽车市场的快速发展和消费者需求的多样化&#xff0c;汽车选择变得愈加复杂。为了帮助消费者在众多汽车选项中做出明智的决策&#xff0c;基于多准则决策分析&#xff08;MCDA&#xff09;的汽车推荐算法应运而生。本研究旨在设计和实现一种基于 Python 的汽车推荐系…

【测试】【Debug】vscode中同一个测试用例出现重复

这种是正常的情况 当下面又出现一个 类似python_test->文件夹名->test_good ->test_pad 同一个测试用例出现两次&#xff0c;名称都相同&#xff0c;显然是重复了。那么如何解决&#xff1f; 这种情况是因为在终端利用“pip install pytest”安装 之后&#xff0c;又…

C++__XCode工程中Debug版本库向Release版本库的切换

Debug和Release版本分别设置编译后&#xff0c;就分别得到了对应的lib库&#xff0c;如下图&#xff1a; 再生成Release后如下图&#xff1a;

VisionPro —— CogIPOneImgeTool工具详解

CogIPOneImageTool工具主要用来对单张图像进行算法处理操作 CogIPOneImgeTool简介 CogIPOneImageTool 工具可完成高斯平滑、高通滤波和图像量化等基本图像处理操作。Image Processing One Image 工具编辑控件为此工具提供图形用户界面。 Image Processing Operations (图像处…

【Ai测评】GPT Search偷偷上线,向Google和微软发起挑战!

最近&#xff0c;OpenAI 又推出了一个令人兴奋的新功能——GPT Search&#xff0c;已经正式上线了&#xff01; 功能介绍 GPT Search&#xff1a;为你带来全新搜索体验 目前&#xff0c;桌面端和移动端应用程序已经全面上线&#xff0c;所有 GPT Plus 和 Team 用户都可以立即…

基于SSM框架的乡村农户对口扶贫系统

基于SSM框架的乡村农户对口扶贫系统。 设计步骤&#xff1a; 项目架构创建&#xff1a;首先创建项目的基本架构&#xff0c;包括com.zc.xxx路径下的文件和resources资源文件夹。 SSM架构&#xff1a;使用Spring、SpringMVC、MyBatis作为后端架构&#xff0c;采用POJO—Dao—…

HANDLINK ISS-7000v2 网关 login_handler.cgi 未授权RCE漏洞复现

0x01 产品简介 瀚霖科技股份有限公司ISS-7000 v2网络网关服务器是台高性能的网关,提供各类酒店网络认证计费的完整解决方案。由于智慧手机与平板电脑日渐普及,人们工作之时开始使用随身携带的设备,因此无线网络也成为网络使用者基本服务的项目。ISS-7000 v2可登录300至1000…