最近小伙伴们咨询我,国产很多高精度的ADC,如何选型使用呢?这里我们主要讨论几款24位差分输入。
ADC/DAC相关名词解释
- ADC输入范围
- ADC转换速度
- ADC稳定位数
在我们选的时候主要考虑上面三个参数
型号 | 输入范围 | 输出速率 | 建立时间 | PGA | 时钟 | 单价(元) |
Hx711 | 10Hz/80Hz | 32,64 和 128 | 内/外 | 2.32 | ||
cs1237 |
10Hz
、
40Hz
、
640Hz
、
1.28kHz
|
1
、
2
、
64
、
128
| 内/外 | 1.3 | ||
tm7707 | 最大1KHz | 1, 2 ,4 ,8 ,16, 32, 64, 128 | 外 | 3.46 |
名词解释
数据输出速率
这里很多人第一次看数据输出速率,很容易理解成是SPI这种接口CLK的频率,这样是错误的。
这里的ADC输出速率是指ADC的转换速率。
这里的SPI clk 要>2KHZ
建立时间
这里的重点是要知道什么情况会发生建立时间
- 电源上电/掉电
- 通道切换
- PGA/速率切换
ADC转换周期
转换周期也可以看作量化时间,可以简单看作 输出速率*位数
如24位ADC ,输出速率1khz
Tconvert ≈ 1ms *24 = 24ms
TM7707测试代码
下面这段代码是官方手册中的代码。
// MCU: AT89S52
// Target : TM7707
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK=P1^0;
sbit DIO=P1^1;
sbit RESET=P1^2;
sbit CS=P1^3;
sbit DRDY=P1^4;
uchar *intp;
uchar idata date8[180];
void write_byte1(uchar date) //写一字节数据
{
uchar i;
CS=0; //CS 拉低,
for(i=0;i<8;i++)
{
SCLK=0; //SCLK 拉低准备写数据
_nop_();
if(date&0x80)
DIO=1;
else
DIO=0;
SCLK=1; //SCLK 拉高,写入一位数据
Date<<=1;
}
CS=1; //写完一个字节后 CS 拉高。
}
uchar read_byte1 ( ) //读一字节数据
{
uchar j,b1;
CS=0;
for(j=0;j<8;j++)
{
SCLK=0;
b1=(b1<<1)|DIO;
SCLK=1;
}
return b1;
}
void save_data(void)
{
uchar i0,i1;
intp=date8;
for(i0=0;i0<60;i0++)
{
while(DRDY); //等待 DRDT 为低时,可读出数据
write_byte1(0x38); //向通信寄存器写入数据,选择通道 1 作为有效,将下一个操作设为读数据 寄存器。
for(i1=0;i1<3;i1++) //连续存储一个数据。
{
*intp=read_byte1();
intp++;
}
CS=1;
}
}
void init( ) //初始化
{
RESET=1;
SCLK=1;
CS=1;
DRDY=1;
}
void main(void) //主函数
{
init();
write_byte1(0X10); //向通信寄存器写数据,选择通道 1 作为有效通道,将下一个操作设为对设置寄存器进行写操作。
write_byte1(0X20); //对设置寄存器写操作,选择 16 倍增益,无 BUF 缓冲器,双极性。
write_byte1(0X50); //向通信寄存器写数据,选择通道 1 作为有效通道,将下一个操作设为对滤波低寄存器进行写操作。
write_byte1(0X00); //向滤波低寄存器写入 0X00。
write_byte1(0X20); //向通信寄存器写数据,选择通道 1 作为有效通道,将下一个操作设为对滤波高寄存器进行写操作。
write_byte1(0X0F); //向滤波高寄存器写入 0X0F。
save_data(); //MCU 连续存储 24 位数据 60 个。
while(1); //循环等待。
}