OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4643|回复: 15

AD7792转换结果波动大

[复制链接]

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
发表于 2016-9-26 17:32:01 | 显示全部楼层 |阅读模式
5金钱
使用AD7792进行模数转换,AD7792以SPI模式与STM32连接,使用通道一进行转换,但输出结果上下波动超过10mV。已进行的错误排除:
    1、使用万用表测量AD7792通道一电压稳定,排除输入电压波动错误。


    2、已用串口打印正常字符串,排除串口传输错误。
    3、失调寄存器与满量程寄存器输出结果正确,排除SPI传输错误。
部分代码如下所示:
[mw_shl_code=c,true]void ad7792_configuration(void)
{
        spi_configuration();                //设置SPI
        mux_gpio_configuration();        //设置4052芯片通道,由于已排除输入电压波动的可能,故忽略此处
        CS_L;                                //使能AD7792
        ms_delay(10);
        spi_send_byte(0xff);
        spi_send_byte(0xff);
        spi_send_byte(0xff);
        spi_send_byte(0xff);
        ms_delay(500);                        //复位AD7792
        gain_select(AGC_GAIN_1);        //修改配置寄存器,0x1000
        mode_select(MODE_CONTINUE,SPEED_16_7); //修改模式寄存器,0x0001
        CS_H;                                //失能AD7792
        ms_delay(500);
        calibration();                        //读取失调寄存器,满量程寄存器
}

void calibration(void)                //读取失调寄存器,满量程寄存器
{
        uint8_t t1,t2;
        CS_L;
        /*zero internal calibration*/
        mode_select(MODE_ZERO_IN,SPEED_16_7);
        ms_delay(1000);
        /*full internal calibration*/
        while(RDY);
        mode_select(MODE_FULL_IN,SPEED_16_7);
        ms_delay(1000);
        /*internal GND*/
        GPIO_ResetBits(GPIOE,GPIO_Pin_2);
        bypass_select(AGC_CHAN_1,PAIRB);
        ms_delay(10);
        while(RDY);
        mode_select(MODE_CONTINUE,SPEED_16_7);
        ms_delay(1000);
        while(RDY);
        spi_send_byte(0x70);
        t1=spi_send_byte(0xff);
        t2=spi_send_byte(0xff);
        zero=t1;
        zero<<=8;
        zero+=t2;
        uart1_printf("Zero:%X\r\n",zero);
        spi_send_byte(0x78);
        t1=spi_send_byte(0xff);
        t2=spi_send_byte(0xff);
        full=t1;
        full<<=8;
        full+=t2;
        uart1_printf("Full:%X\r\n",full);
        CS_H;
}

float convert(void)                //AD转换部分
{

        uint16_t res = 0;
        float res1 = 0;
        CS_L;
        while(RDY);                //等待可以开始转换
        us_delay(1000);       
        GPIO_choice();                //配置4052
        mode_select(MODE_CONTINUE,SPEED_16_7);        //模式选择0x0001
        ms_delay(100);
        while(RDY);                //等待转换结束

        spi_send_byte(0x58);
        res=(((uint16_t)spi_send_byte(0xff)) & 0x00ff)<<8;
        res+=(((uint16_t)spi_send_byte(0xff)) & 0x00ff);


        CS_H;
        res1 = 3.0 * ((float)(res)) / 65536.0 * 1000;
        ms_delay(1000);
        return res1;                //输出电压
}
[/mw_shl_code]
输出结果如下所示(50mV为例):
Zero:8000
Full:54A7
adc_value:41.38
adc_value:48.29
adc_value:55.94
adc_value:60.10
adc_value:58.00
adc_value:51.36
adc_value:44.45
adc_value:39.28
adc_value:40.01
adc_value:46.78
adc_value:55.25
adc_value:59.74
adc_value:58.82


卡在这里好久了,求大神解答~~~

最佳答案

查看完整内容[请看2#楼]

直接用仿真器观察!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-26 17:32:02 | 显示全部楼层
FlamePoint 发表于 2016-9-27 11:19
放到数组里面然后用串口输出么?想不到其他方式能让我读到数组中的数据。。


直接用仿真器观察!

回复

使用道具 举报

7

主题

171

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2337
金钱
2337
注册时间
2015-9-6
在线时间
536 小时
发表于 2016-9-26 17:49:28 | 显示全部楼层
万用表不够精确的,而且它自身输出的就是一段时间的均值。建议用示波器测。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
发表于 2016-9-26 20:12:08 | 显示全部楼层
我觉得是电源的问题的可能性大,用示波器看电源的波形。还有就是不知道你采集的是什么信号。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-26 21:28:35 | 显示全部楼层

先把串口助手丢一边去,
搅和在一起没法确定。

用数组把转换后的原始数据存下来,然后观察。


回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 09:04:45 | 显示全部楼层
键盘侠 发表于 2016-9-26 17:49
万用表不够精确的,而且它自身输出的就是一段时间的均值。建议用示波器测。

没有示波器,只有万用表。。。最新测试结果,在配置模式寄存器时,把更新速率由原来的470改为现在的16.7时,用新速率每十组测得的平均值为稳定状态,但单个数值差距特别大,从0一直到90+都有。原速率十组平均值依然不稳定,查表以后怀疑为器件噪声的原因。
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 09:07:57 | 显示全部楼层
moxigua 发表于 2016-9-26 20:12
我觉得是电源的问题的可能性大,用示波器看电源的波形。还有就是不知道你采集的是什么信号。

电源的波形应该是没问题的。我用的是安捷伦函数信号发生器Agilent 33120A产生一个50mV的电压信号当作采集到的模拟值,经过两个4052通道选择的芯片把电压值传给7792.测7792采信号的管脚电压稳定。与最新速率采出的10次平均电压值也相同。但单次波动很大。
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 09:09:27 | 显示全部楼层
xuande 发表于 2016-9-26 21:28
先把串口助手丢一边去,
搅和在一起没法确定。

没懂。。。是把数据存到sd卡中么,然后再读出来?那样不也是要经过串口显示么 ?
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 09:48:45 | 显示全部楼层
已解决,调整模式寄存器后4位的更新速率,由原来的470改为16.7,并将原来配置模式寄存器完成后的ms_delay时间由100ms改为10ms,即可得到正确并且稳定的数值,求大神解答原理~~~
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-27 10:34:31 | 显示全部楼层
FlamePoint 发表于 2016-9-27 09:09
没懂。。。是把数据存到sd卡中么,然后再读出来?那样不也是要经过串口显示么 ?


就是建个变量数组,AD[1000]这样的。



回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-27 10:35:20 | 显示全部楼层
FlamePoint 发表于 2016-9-27 09:48
已解决,调整模式寄存器后4位的更新速率,由原来的470改为16.7,并将原来配置模式寄存器完成后的ms_delay时 ...


要解释,需要研究手册。
估计是配置参数有问题,或者时序方面有问题。


回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 11:19:12 | 显示全部楼层
xuande 发表于 2016-9-27 10:34
就是建个变量数组,AD[1000]这样的。

放到数组里面然后用串口输出么?想不到其他方式能让我读到数组中的数据。。
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 11:19:38 | 显示全部楼层
xuande 发表于 2016-9-27 10:35
要解释,需要研究手册。
估计是配置参数有问题,或者时序方面有问题。

哦哦。有空我去研究一下吧 。谢谢啦~~
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 11:38:08 | 显示全部楼层
xuande 发表于 2016-9-27 11:23
直接用仿真器观察!

懂了,谢谢~
回复

使用道具 举报

10

主题

254

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2015-10-17
在线时间
145 小时
发表于 2016-9-27 11:39:16 | 显示全部楼层
0V是不是稳定呢?
开着单片机翱翔在天空
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
 楼主| 发表于 2016-9-27 13:44:43 | 显示全部楼层

您说的是参考地么?是稳定的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 19:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表