您好,我在使用贵司的ads1222芯片时,通过stm32f103rct6给ads1222的clk脚发2mhz的pwm,通过拉高拉低管脚的方式给sclk管脚发脉冲,我参照数据手册上的说明来编写程序,DRDY/DOUT 出来的数据是否是补码的形式,我是通过手册图25来计算高低电平持续时间的,高低电平都是172us,但是出来的数据我不知道正不正确,我把我的代码贴在下面,还有,我接的是传感器的正负信号,范围是0-10mv,电桥输出,s型压力传感器,麻烦帮忙看一下有什么错误之处。
void ADS_Res24Bit(void)
{
extern u32 resdata;
extern unsigned char resch[3];
extern int cont_i;
while(DR_DOUT);//等待drdy/dout管脚拉低
for(cont_i=0;cont_i<24;cont_i++)//
{
SCLK=1; delay_us(172);//delay_us(723);
SCLK=0;
delay_us(172);//elay_us(723);//发一个脉冲
if(DR_DOUT==1)//判断drdy/dout管脚电平
{
resdata|=(0x00800000>>cont_i);//电平的值给resdata
}
else if(DR_DOUT==0)
{
resdata&=(0xFF7FFFFF>>cont_i);
}
}
printf("%u\r\n",resdata);//发完24个脉冲后串口输出数据
resdata&=0x00000000; while(DR_DOUT);//等待管脚拉低,第二次数据转换
}
输出的数据如下
256
32
8388607
32
0
285868031
8
50303
256
17
8
12415
480
32
391
16
16
0
272
0
102399
32
0
32
32
3
480
7
24
36863
136
24
193
40959
64
66559
0
15487
64
0
225
25151
64
267263
256
7
384
136
224
65535
136
7
120
16
384
3
32
0
195
4159
96
58367
120
7
256
7
448
32
392
3
448
16
16777215
128
17
224
32
99
0
17891327
8
6271
128
7
32
275455
96
0
411697151
64
0
16
0
0
280
7711
128
8
1991
8
4718591
8
1151
264
7
384
7
64
50175
64
0
264
32319
264
24
48
0
8
67
0
15
504
81919
504
3
224
33
56
0
63
384
Amy Luo:
您好,
是的,ads1222输出的24bit数据是补码形式。ads1222输出代码与输入信号的关系如Table2所示。
单片机输出信号波形是否为期望波形,可以用示波器捕获进行查看。
user5352588:
回复 Amy Luo:
您好,我示波器测量过,输出有波形,但是我得出的数据并不稳定,变化很大,从几百到几万都有,不知这个是什么原因,是程序不对还是其它别的原因,我是在每个sclk脉冲发完后才检测DRDY/DOUT管脚,这样有问题吗?
Amy Luo:
回复 user5352588:
您好,
DRDY/DOUT管脚有两个用途。首先,它通过变低来指示新数据准备就绪。然后,在SCLK的第一个上升沿上,DRDY/DOUT管脚改变功能并开始输出转换数据,最有效位(msb)优先。在随后的每个SCLK上升沿上,数据被移出。在所有24位都被输出之后,可以通过sclk将此管脚强制拉高。然后它将一直保持高位,直到新转换数据准备就绪。输出数据不稳定,可能存在以下一个或多个问题。
首先,在模拟输入端混入了其他干扰信号,导致ADC采集到了干扰信号。
其次,是参考电压。如果参考电压(电源)有噪声,结果也会有噪声。建议电源和参考电压做好滤波处理。
再就是PCB布局。将模拟信号和数字信号分开布局布线,避免相互干扰。