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

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);                   // 发送固定值15send(0x04, 4);                    // 发送固定值4ltc1684_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;          // 内部震荡器设置为8MHzINTCON = 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);     // 测试数码管的完整性,发送测试数据1send(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;//delay2ussclk=1;				//从第一个时钟的上升沿开始输出数据adre_1684|=dout;	//delay2usadre_1684<<=1;		//高位前移}sclk=0;nop;nop;nop;nop;nop;nop;nop;nop;//delay2ussclk=1;					//第16个时钟不再移位了adre_1684|=dout;		//完成16位采样数据的寄存conv=1;					//关闭1684
}
//***************************************************************************/
//* 名称:   LTC1684_init_io()
//* 说明:  	IO模拟驱动1684的初始化
//* 功能:   单片1684的初始化
//* 调用:   无
//* 输入:   无
//* 返回值: 无
//***************************************************************************/
void LTC1684_init_io(void)
{	conv=1;			//关闭1684sclk=1;			//空闲时时钟为1
}
void Model_Test(void)
{uchar k;                      // 定义变量 kcounter = 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.mzph.cn/bicheng/59715.shtml

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

相关文章

信息安全工程师(80)网络安全测评技术与工具

前言 网络安全测评是评估信息系统、网络和应用程序的安全性&#xff0c;以发现潜在的漏洞和威胁&#xff0c;并确保系统符合安全标准和政策的过程。 一、网络安全测评技术 渗透测试&#xff08;Penetration Testing&#xff09; 描述&#xff1a;通过模拟真实的攻击&#xff0c…

基于STM32的太阳跟踪系统设计

引言 本项目基于STM32微控制器设计了一个智能太阳跟踪系统&#xff0c;通过集成光敏传感器模块和电机控制系统&#xff0c;实现太阳能电池板的自动调节&#xff0c;以保持太阳能电池板始终垂直对准太阳&#xff0c;从而最大化光能的吸收效率。该系统通过实时监测太阳光的方向&…

新能源汽车与公共充电桩布局

近年来,全球范围内对新能源汽车产业的推动力度不断增强,中国新能源汽车市场也呈现蓬勃发展的势头,在政策与市场的共同推动下,新能源汽车销量持续增长。然而,据中国充电联盟数据显示,充电基础设施建设滞后于新能源汽车数量增长的现状导致充电桩供需不平衡,公共充电桩服务空白区域…

Qt中的Model与View 4:QStandardItemModel与QTableView

目录 QStandardItemModel API QTableView 导航 视觉外观 坐标系统 API 样例&#xff1a;解析一个表格txt文件 QStandardItemModel QStandardItemModel 可用作标准 Qt 数据类型的存储库。它是模型/视图类之一&#xff0c;是 Qt 模型/视图框架的一部分。它提供了一种基于…

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

本篇文章分享关于如何使用STM32单片机对彩色摄像头&#xff08;OV7725/OV2604&#xff09;采集的图像数据进行分析处理&#xff0c;最后实现颜色的识别和检测。 目录 一、什么是颜色识别 1、图像采集识别的一些基本概念 1. 像素&#xff08;Pixel&#xff09; 2. 分辨率&am…

Request 和 Response 万字详解

文章目录 1.Request和Response的概述2.Request对象2.1 Request 继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式 2.3 解决post请求乱码问题 掌握内容讲解内容小结 2.4 Request请求转发 3.HTTP响应详…

经典网络模型

文章目录 网络演变过程1、阻塞IO&#xff08;BIO&#xff09;实现缺点 2、非阻塞IO&#xff08;NIO&#xff09;实现改进后设置非阻塞IO缺点 3、IO多路复用第一版&#xff08;select/poll&#xff09;问题点改进缺点 4、IO多路复用第二版&#xff08;epoll&#xff09;5、信号驱…

从神经元到神经网络:深度学习的进化之旅

神经元、神经网络 神经元 Neuron )&#xff0c;又名感知机( Perceptron )&#xff0c;在模型结构上与 逻辑回归 一致&#xff0c;这里以一个二维输入量的例子对其进行进一步 的解释&#xff1a; 假设模型的输 入向 量是一 维特征向 (x1,x2). 则单神 经元的模型结构 如下…

面试题:Spring(一)

1. Spring框架中bean是单例么&#xff1f; Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。 2. Spring框架中的…

qt QFileSystemModel详解

1、概述 QFileSystemModel是Qt框架中的一个关键类&#xff0c;它继承自QAbstractItemModel&#xff0c;专门用于在Qt应用程序中展示文件系统的数据。这个模型提供了一个方便的接口&#xff0c;使得开发者可以轻松地在应用程序中集成文件和目录的树形结构&#xff0c;并通过视图…

从0开始深度学习(26)——汇聚层/池化层

池化层通过减少特征图的尺寸来降低计算量和参数数量&#xff0c;同时增加模型的平移不变性和鲁棒性。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。 1 最大汇聚层、平均汇聚层 汇聚层和卷积核一样&#xff0c;是在输入图片上进行滑动计算&#xff0c;但是不同于卷积层的…

右旋圆极化散射后的stocks矢量 与T3矩阵的关系

T3矩阵如下 斯托克斯与T3的关系如下。 斯托克斯与T3均没有平均处理&#xff0c;即斯托克斯是完全极化波的&#xff08;一种琼斯矢量得到&#xff09;&#xff0c;T3是由一个散射矩阵得到&#xff0c;只有一个特征值。

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍 在制作Block类游戏时&#xff0c;其核心的逻辑就是拖拽方块放入到地图中&#xff0c;这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手&#xff0c;具体的实现逻辑就是下面 public void On…

解线性方程组(二)

实验类型&#xff1a;●验证性实验 ○综合性实验 ○设计性实验 实验目的&#xff1a;进一步熟练掌握用Jacobi迭代法和Gauss-Seidel法解线性方程组的算法&#xff0c;提高编程能力和解算线性方程组问题的实践技能。 实验内容&#xff1a; 1)取初值性x(0)(0,0,0,0)T, 精度要求ε…

易语言模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档&#xff0c;Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置&#xff08;路径Proxy->Proxy Settings&#xff09; 3.1.1.不抓包Windows&#xff0c;即不勾选此项&#xff0c;免得打输出不…

进程崩溃难以定位,日志分析五步搞定|OceanBase故障排查实践

作者&#xff1a;胡呈清&#xff0c;爱可生 DBA 团队成员&#xff0c;擅长故障分析、性能优化。 背景 Server 进程崩溃的常见原因包括程序bug、文件损坏、磁盘坏块以及内存坏块&#xff0c;这类故障通常较难分析和定位。 在OceanBase 集群部署时&#xff0c;系统会自动配置co…

[spring源码]spring配置类解析

解析配置类 在启动Spring时&#xff0c;需要传入一个AppConfig.class给ApplicationContext&#xff0c;ApplicationContext会根据AppConfig类封装为一个BeanDefinition&#xff0c;这种BeanDefinition我们把它称为配置类BeanDefinition AnnotationConfigApplicationContext a…

低压电容器衰减的计算方法

低压电容器的衰减&#xff08;通常指电容器容量的衰减&#xff09;是指电容器在长时间运行或经历一些不良工作环境下&#xff0c;电容值随时间逐渐减少的现象。这个衰减会影响电容器的工作性能&#xff0c;尤其是在无功补偿和功率因数校正等应用中。计算电容器衰减的具体方法可…

Maven的安装配置

文章目录 一、MVN 的下载二、配置maven2.1、更改maven/conf/settings.xml配置2.2、配置环境变量一、MVN 的下载 还是那句话,要去就去官网或者github,别的地方不要去下载。我们下载binaries/ 目录下的 cd /opt/server wget https://downloads.apache.org/maven/maven-3/3.9.6/…