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]);

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

之前代码:

我是将buf1与buf2进行合并,因为我看到读时序图:

问题解决

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

复制代码
	value = (buf[0] << 8) | buf[1];

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

相关推荐
toradexsh1 天前
基于 NXP i.MX8M Plus 测试 Zephyr RTOS
arm·rtos·nxp·imx8mp·zephyr
toradexsh5 个月前
在NXP iMX8QM上使用 Jailhouse
arm·nxp·toradex·imx8mp·jailhouse
一个平凡而乐于分享的小比特1 年前
MS1112驱动开发(iio框架)
驱动开发·ms1112·iio
toradexsh1 年前
NXP iMX8MP ARM 平台多屏幕克隆显示测试
linux·arm·nxp·toradex·imx8mp
toradexsh3 年前
NXP iMX8M Plus Qt5 双屏显示
qt·arm·nxp·toradex·imx8mp