MS1112芯片ADC采样测试

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:IMX8MP,本专栏记录imx8mp开发板,学习开发过程中的问题及解决方法记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

MS1112芯片ADC采样测试

1.芯片介绍

在这里插入图片描述

2.原理图分析

在这里插入图片描述

从图中我们可以看出ASEL1接3.3v,高电位。ASEL0接地,低电位。

在这里插入图片描述

通过原理图可以看出,MS1112的从机地址位为0x4a,我们通过I2c-tools工具也能看出

在这里插入图片描述

配置寄存器各位含义:

在这里插入图片描述

这里我们设置配置寄存器值为0xDC,采取单次转换模式,以AIN3的单端输入通道,更新速率为15SPS,精度为16位,增益为1。

3.应用程序测试

写应用程序时,我们要看写操作和读操作的时序图

在这里插入图片描述

在这里插入图片描述

从写时序图,我们可以看出,要先发送I2c从机地址位,在发送配置寄存器命令。

从读时序图,我们可以看出,直接读取结果寄存器的高8位和低8位。

输出码换算:

在这里插入图片描述

MS1112应用程序:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>

#define I2C_DEVICE_FILE "/dev/i2c-1"  // 适当的设备文件,通常是 /dev/i2c-1
#define DEVICE_ADDRESS 0x4a           // MS1112 的 I2C 地址
#define ADC_DATA_REG   0xDC           // 发送配置字节命令

int main() {
	int file;
	char filename[20];
	char buf[10];
	int16_t value;

	// 打开 I2C 设备文件
	snprintf(filename, 19, I2C_DEVICE_FILE);
	file = open(filename, O_RDWR);
	if (file < 0) {
		perror("Failed to open the bus.");
		exit(1);
	}
				
	// 设置 I2C 设备地址
	if (ioctl(file, I2C_SLAVE, DEVICE_ADDRESS) < 0) {
		perror("Failed to acquire bus access and/or talk to slave.\n");
		exit(1);
	}

	// 发送配置字节命令
	char config[] = {ADC_DATA_REG};
	if (write(file, config, 1) != 1) {
		perror("Failed to write to the i2c bus");
		return 1;
	}

	// 读取 ADC 数据
	if (read(file, buf, 3) != 3) {
		perror("Failed to read from the i2c bus.\n");
		exit(1);
	} 
	printf("buf[0] in hexadecimal: 0x%02X\n", buf[0]);
	printf("buf[1] in hexadecimal: 0x%02X\n", buf[1]);
	printf("buf[2] in hexadecimal: 0x%02X\n", buf[2]);

	value = (buf[0] << 8) | buf[1];
	//输出采样值	
	printf("ADC Value: %d\n", value);
	float voltage = (value * 2.048) / 32767.0 ; // 计算电压值
	printf("Voltage: %.2fV\n", voltage); // 输出电压值,保留两位小数

	close(file);
	return 0;
}

4.测试结果

在这里插入图片描述

逻辑分析仪波形显示:
在这里插入图片描述

可以看出显示一致。

在这里插入图片描述

我们根据结果寄存器的存储结果,可以计算AIN0测发的电压

在这里插入图片描述

然后,用万用表AIN3接负极,AIN0接正极,测得电压为0.57v,因为有误差,几乎和我们计算值相等。

最后,我们转动滑动变阻器,调整阻值,可以发现电压和ADC采样值也在变动。

5.遇到问题及解决方案

在测试过程中我也遇到不少问题:

5.1无法有i2c-tools工具进行ADC采样

本来一开始,我是想直接用i2c-tools工具,利用i2c-tools命令进行ADC采样的,但发现一直写失败

在这里插入图片描述

于是我尝试用逻辑分析仪抓波形

在这里插入图片描述

发现i2c从机地址和配置寄存器地址都没问题,但就是给配置寄存器发命令,配置寄存器没有回应。

问题解决

于是我尝试从数据手册的写时序找原因,写时序图:

在这里插入图片描述

发现给该芯片的写时序并没有设计配置寄存器地址,只有I2C从机地址位后面紧跟着就是配置寄存器命令,因此MS1112芯片不能使用i2c-tools工具进行ADC采集。只能自己编写应用程序进行测试。

5.2 写好应用程序后,发现显示的电压与我实测的电压不符

在这里插入图片描述

编写好应用程序后发现,我测得的ADC采样值变化很大,而且程序输出的电压与我用万用表测得的电压值相差很大。

于是我尝试将结果寄存器的每个buf进行打印输出:

	printf("buf[0] in hexadecimal: 0x%02X\n", buf[0]);
	printf("buf[1] in hexadecimal: 0x%02X\n", buf[1]);
	printf("buf[2] in hexadecimal: 0x%02X\n", buf[2]);

输出后,我发现我之前算的电压值有问题:

之前代码:

在这里插入图片描述

我是将buf[1]与buf[2]进行合并,因为我看到读时序图:

在这里插入图片描述

问题解决

我以为前面i2c从机地址位也得占一位,后来我把每个buf进行输出才发现不是这样的,它是直接输出结果寄存器的值。于是我写改代码来计算电压值:

	value = (buf[0] << 8) | buf[1];

对比逻辑分析仪的解析结果和我所打印出的buf内容一样,才算对应成功。

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE3-form表单保存附件与基本信息

element-ui代码 <el-dialog :title"上传附件" v-model"dialogAdds.visible" width"500px" append-to-body> <el-form-item label"唯一标识"> <dict-tag v-if"form.groupId" :options"unique_identifica…

生成模型 | 从 VAE 到 Diffusion Model (上)

文章目录 一&#xff0c;GAN(对抗式生成网络&#xff09;二&#xff0c;Auto-Encoder(AE) 和 Denoising Auto-Encoder (DAE)三&#xff0c;VAE四&#xff0c;VQ-VAE (Vector Quantized Variational Autoencoder)VQ-VAE 2小总结&#xff1a; 五&#xff0c;DALL-E &#xff08;O…

翻译《The Old New Thing》- How do I mark a shortcut file as requiring elevation?

How do I mark a shortcut file as requiring elevation? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071219-00/?p24103 Raymond Chen 2007年12月19日 如何将快捷方式标记为需要提升权限 简要 文章介绍了如何通过设置SLDF_RUNAS_US…

Window Linux 权限提升

#基础点&#xff1a; 0、为什么我们要学习权限提升转移技术&#xff1a; 简单来说就是达到目的过程中需要用到它 心里要想着我是谁 我在哪 我要去哪里 1、具体有哪些权限需要我们了解掌握的&#xff1a; 后台权限&#xff0c;数据库权限&#xff0c;Web权限&#xff0c;用户权…

基于Netty实现WebSocket服务端

本文基于Netty实现WebSocket服务端&#xff0c;实现和客户端的交互通信&#xff0c;客户端基于JavaScript实现。 在【WebSocket简介-CSDN博客】中&#xff0c;我们知道WebSocket是基于Http协议的升级&#xff0c;而Netty提供了Http和WebSocket Frame的编解码器和Handler&#…

Access to image at ‘xxx‘ from origin ‘xxx‘ has been blocked by CORS policy解决方案

如图所示&#xff0c;控制台出现下面的报错&#xff1a; 但是正常加载了图片 这个错误表明你尝试从某个源&#xff08;origin&#xff09;加载阿里云上的图片时&#xff0c;浏览器因为CORS&#xff08;跨源资源共享&#xff09;策略阻止了这次请求。尽管图片能正常显示&#x…

Midjourney应用场景、特点、生成图片带来影响

Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人&#xff0c;旨在提供多领域的智能对话服务。本文主要介绍Midjourney的应用场景、功能特点、图片生成后可以做什么&#xff1f; 一、Midjourney应用场景 Midjourney的应用场景相当广泛&#xff0c;以下是一些主要的适用…

迈威通信TSN工业自动化系统解决方案助力智能制造实现确定性服务

工业4.0时代&#xff0c;IT与OT的融合已成为制造企业数字化转型的关键。然而&#xff0c;传统OT网络与IT网络的差异给融合带来了重重挑战。例如&#xff0c;当传送带通过PROFINET协议与HMI通讯时&#xff0c;兼容性问题凸显;硬件实时运动控制采用EtherCAT协议&#xff0c;机械臂…

基于GIS的各类地图样式作品的欣赏,真的不一般。

GIS&#xff08;地理信息系统&#xff09;提供了丰富的地图数据&#xff0c;为地图可视化开发提供了基础数据。在GIS的基础上&#xff0c;您可以根据需求和目的&#xff0c;采用不同的可视化样式来展示地图数据。 以下是一些常见的地图可视化样式&#xff1a; 点状标记&#x…

Nat Hum Behav | 人类前额叶皮层非空间注意力的因果相位依赖性控制

摘要 非空间注意力是一种基本的认知机制&#xff0c;它使个体能够将意识的焦点从无关刺激转向与行为目标相关的感觉信息上。有人提出了一种关于注意力是由前额叶皮层中缓慢兴奋性波动的持续相位所调节的假设&#xff0c;但这一假设存在争议且尚未达成共识。在这里&#xff0c;…

angr使用学习

首先我是直接在kali中安装的&#xff0c;也是边练边学的。 嗯&#xff0c;要在纯净python环境&#xff0c;所以是在 virtualenv 虚拟环境里&#xff0c;也不是特别会用这个&#xff0c;按照教程一步步做的 source venv/bin/activate 进入了对应环境 退出是 deactivate en,ipy…

精准控制,无缝集成:EC-Master与LxWin的EtherCAT主站解决方案

在今天&#xff0c;越来越多的制造业客户选择自动化智能化转型&#xff0c;自动化智能化促进了人机交互、数据互通与自动化控制的发展。随着工业4.0和智能制造的推进&#xff0c;对高速、低时延、高性能的需求在自动化控制领域日益增长。 在这一背景下&#xff0c;EtherCAT&am…

C++相关概念和易错语法(14)(初始化注意事项、vector、编译器向上查找规则)

1.当我们在代码中想要终止运行的话&#xff0c;我们可以采用Ctrl C或Ctrl Z&#xff0c;其中^C代表杀进程&#xff0c;^Z设置结束2.编码表&#xff1a;我们目前比较熟悉的是ASCII码编码方式&#xff0c;但是我们发现平时使用的汉字无法通过ASCII编码&#xff0c;除此之外&…

1个逗号,提升Python代码质量

有些时候&#xff0c;我们会在Python代码中看到列表或其他科迭代对象的结尾会存在一个逗号&#xff1a; 而且编辑器和解释器都容许这种逗号的存在&#xff0c;它就叫作拖尾逗号。 通常是为了在频繁地增减数组元素的时候同时保证语法的正确&#xff0c;且拖尾逗号不占用数组的长…

气膜建筑:寿命、优势与应用—轻空间

近年来&#xff0c;气膜建筑因其独特的结构和众多优势&#xff0c;逐渐成为建筑领域的热门选择。气膜建筑使用寿命长&#xff0c;且在建造速度、成本、安全性、节能环保和舒适性等方面具有显著优势。轻空间将详细探讨气膜建筑的使用寿命、主要优势及其在不同领域的广泛应用。 气…

【从C++到Java一周速成】章节10:封装、继承、方法的重写、多态

章节10&#xff1a;封装、继承、方法的重写、多态 【1】封装1.高内聚&#xff0c;低耦合2.代码层面的体现 【2】继承【3】方法的重写【4】多态 【1】封装 1.高内聚&#xff0c;低耦合 高内聚&#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b;…

JSX语法看这一篇就够了-02

JSX and React 是相互独立的两种开发语言&#xff0c;它们经常一起使用&#xff0c;但也可以单独使用它们中的任意一个&#xff0c;JSX 是JavaScript 语言的扩展&#xff0c;而 React 则是一个 JavaScript 的库。 概述简介 JSX简介 JSX全称 javascriptXML&#xff0c;是Faceb…

cmake编译redis6.0源码总结

1配置clion使用cygwin模拟linux环境&#xff0c;先下载cygwin后配置 2导入源码&#xff0c;配置cmake文件 由于redis是基于Linux上的Makefile&#xff0c;所以Windows上需要配置CMakeLists.txt使用cmake工具编译运行。github上已经有人尝试编写CMakeLists.txt文件&#xff0c…

软件测评的重要性

软件测评的必要性体现在多个方面&#xff0c;以下是其主要原因&#xff1a; 质量保障&#xff1a;软件测评的首要目标是确保软件的质量。通过系统的测试&#xff0c;可以发现软件中的缺陷、错误或不符合需求的地方&#xff0c;从而及时进行修复和改进。这有助于保证软件在实际…

怎么录制直播视频教程?一看就会的方法分享

随着网络直播的兴起&#xff0c;无论是教学、会议还是娱乐&#xff0c;直播视频已成为人们日常生活和工作中不可或缺的一部分。录制直播视频教程不仅可以帮助我们回顾和分享精彩瞬间&#xff0c;还能为观众提供便捷的学习资源。可是怎么录制直播视频教程呢&#xff1f;本文将介…