作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,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内容一样,才算对应成功。