主题中讨论的其他器件: REF5045、 OPA333、 REF6045、 OPA197
您好!
我和我的同事都在为 ADS8887 18位 ADC 组件(ADS8887IDRCR)而苦恼。 我们需要读取具有0.1mV 误差容差的电压值。因此、我们选择了该组件、但遗憾的是、我们仅实现了7-8位分辨率的 ADC 结果、即使我们应用 了数据表中演示的相同信号(手动)(4线制操作) 我将共享我的主代码、原始数据和示波器结果。
每一条反馈和 建议都会非常有帮助。
下面是一些原始数据示例=> 0.0伏->75760
0.1伏->75776
0.5伏->79856
1.0伏->84976
2.4伏->98288
3.8伏->112624
图中显示了我们收到的原始 ADC 值
(PS:这些值甚至不会改变一个整数)
下面是示波器屏幕快照=>
主代码////////////////////////////////////////////////////////////////////////////
#define CS 47 //PL2 (DIN)
#define SCK 52 //PB1
#define MISO 50 //PB3
#define M0SI 51 //PB2
#define CONVST 45 //PL4
字节 val;
void setup(){
引脚模式(39、输出); //ADC CH1电源使能
digitalWrite (39、HIGH);
Serial.begin(115200);
DDRB = DDRB | B00000010; //SCK 为输出
DDRL = DDRL | 00010100; //DIN 和 CONVST 为输出
DDRB = DDRB 和 B11110111;
PORTL = PORTL & B11101011;//CS 和 CONVST 为低电平
PORTB = PORTB & B11111001; //SCK 低电平
}
unsigned long miso_;
unsigned long clk=0、clk2=0; //这两个参数用于延迟操作
void loop(){
延迟(10);
PORTL = PORTL | B00000100; /CS 高电平
delayMicroseconds (1);
PORTL = PORTL | B00010000; //CONVST 高电平
MISO = 0;
delayMicroseconds (1);
for (int i=0;i<50;i++) // 5周期 boyunca SCK
{
PORTB = PORTB | B00000010; //SCK 高电平
while (micros-clk <1)
{
CLK=micros (); //or 和 Operation 需要不同的时间、因此我们使它们相等
}
PORTB = PORTB 和 B11111101; // SCK 低电平
}
delayMicroseconds (10);
PORTL = PORTL & B11111011; //CS 低电平
//delayMicroseconds (100);
字节 val = 0;
MISO = 0;
for (int i=0;i<18;i++)
{
PORTB = PORTB | B00000010; //SCK 高电平
delayMicroseconds (1);
Val =(字节) PINB & B00001000; // 读取 DOUT 引脚
Val = val >> 3; //将其移动到 LSB
Val = val & B00000001;
MISO =(MISO <<1)| val; //将值1位左移以获得下一位
/*
serial.print(i);
serial.print ("=");
serial.println (val);
*
/*
while (micros-clk2 <1)
{
clk2=micros();
}
*
PORTB = PORTB 和 B11111101; //SCK 为低电平
delayMicroseconds (1);
}
PORTL = PORTL & B11101111; // CONVST 低电平
delayMicroseconds (50);
serial.println (miso_);
}