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内容一样,才算对应成功。

相关推荐
toradexsh1 年前
NXP iMX8M Plus Qt5 双屏显示
qt·arm·nxp·toradex·imx8mp