单片机/MCU论坛
直播中

李红

7年用户 1185经验值
私信 关注
[问答]

ADUC7061的ADC采集不到数据是为什么?有哪些原因呢?

ADUC7061是有些问题的,比如通过JLINK调试,STEP BY STEP模式下,读取的ADC1DAT数据是16位而不是24位,如果改用某个特定版本的ULINK,则可以显示24位。这个是仿真调试工具和芯片接口上出了问题。但无论如何,归类为BUG是没有问题的。我不想讨论这个细节,我只是说ADUC7061其实也有很多BUG。不要全部归责到用户使用是否熟悉上。
ADC1可以采集通道1~9,1~5是专用通道,6~9是和SPI、I2C复用的。
用ADC去采集1~5通道的数据,是没有问题的。这个确实也是比较简单的。
但我用同样的代码去采集ADC8通道,就问题大了。
当然,会把芯片脚的复用功能切换到模拟上,即把初始的GPIO功能改到模拟输入。然后读取ADC值。
按DATAHEET操作,不行。
我的板子是ADC4和ADC8连接在一起的,ADC5接地AGND,单端模式,读ADC4没有问题,正确且正常,但读ADC8的数据,读到的值在0x5fexx~0x607xx之间变化,换个芯片,也是这样。
我个人认为,ADI芯片的配置代码,可能存在一些BUG,导致配置可能需要特定的顺序或者特定的要求,理解为BUG的意思是:至少DATASHEET里没有说明,用户无法猜测到。
通道4~通道8的差别是这样的。就一句差别:
ADC1CON = 0x8004 | 0x0480;//ch 8
//ADC1CON = 0x800c | 0x0300;//ch 4
端口的配置是这样的:
GP0CON0 = 0x00000000; //p0.0~p0.4 gpio
GP0PAR = 0x0f; //01110
GP0DAT = 0x10100000;
GP0KEY1 = 0x7;
GP0CON1 = 0x1; // adc
GP0KEY2 = 0x13;
我还试过,GP0CON1 修改后再配置GP0复用,以测试是否有顺序要求,但效果不对。
为了检测芯片脚是否短路,我使用过ADC8复用的SPI功能,SPI用来驱动显示屏,工作正常(测ADC8的时候,显示屏当然会取下)。
这个简单的功能,验证了好几天,实在想不到有什么遗漏的地方可以测试,只能归结为芯片BUG。
看看有没有哪位师傅,有兴趣帮一下。谢谢
(注:这个芯片用五六年了,不会有低级错误,估计是芯片BUG,我以前处理过好几BUG,就这个芯片的)
附代码:
#include "ResGf.h"
int main()
{
volatile signed long s;
signed char N = -1;
char Err = 0;
float fN = 0;

PLLKEY1 = 0xaa;
PLLCON = 0x00;
PLLKEY2 = 0x55;
POWKEY1 = 0x1;
POWCON0 = 0x38; // Set core to max CPU speed of 10.24Mhz
POWKEY2 = 0xF4;
POWKEY3 = 0x76;
POWCON1 = 0x024;
POWKEY4 = 0xB1;

DACCON = 0x0013;
DACDAT = 0x04ff0000;

while(1)
{

ADCCFG = 0x84;
ADCFLT = 0x8083;
GP0CON0 = 0x00000000; //p0.0~p0.4 gpio
GP0PAR = 0x0f; //01110
GP0DAT = 0x10100000;
GP0KEY1 = 0x7;
GP0CON1 = 0x1; // adc
GP0KEY2 = 0x13;

ADC0CON = 0;
ADC1CON = 0x878c;;

s = ADCSTA;
s = ADC0DAT;
s = ADC1DAT;
//////////
ADCMDE = 0x83;
////
ADC1CON = 0x8004 | 0x0480;//ch 8
//ADC1CON = 0x800c | 0x0300;//ch 4

s = ADC1DAT;
s = ADCSTA;
ADCMDE = 0x82;
do
{
s = ADCSTA;
if (s   0x2000) //adc1cerr
{
Err |= 1; //over range
}
} while(!(s   0x2));

s = ADC1DAT;
ADCMDE = 0x83;
//3. exit adc
ADCMDE = 0x83; //idle
ADCFLT = 0x80ff;
ADC1CON = 0x78c; //internally shorted
GP0CON0 = 0x00001011; //back to spi
GP0PAR = 0x04;
GP0DAT = 0x10100000;

GP0KEY1 = 0x7;
GP0CON1 = 0x0; // exit adc
GP0KEY2 = 0x13;
}
}

回帖(1)

萧持毅

2024-1-11 11:45:57
ADUC7061的ADC采集不到数据可能有以下几个原因:

1. 芯片本身有BUG:ADUC7061可能存在一些硬件或软件方面的问题,导致ADC采集不到数据或数据不正确。例如,某个版本的仿真调试工具可能无法正确读取ADC数据。

2. 接口设置问题:ADC8通道可能与其他模块的接口复用,需要正确配置相关寄存器和引脚功能才能使用ADC8通道。确保相关引脚设置正确。

3. 电源问题:ADC需要稳定的电源供应,如果电源电压不稳定或存在噪声,可能会影响ADC的采集精度和稳定性。

4. ADC配置错误:可能是ADC的配置寄存器设置不正确,导致ADC无法工作。确保ADC的配置正确。

5. 时钟配置问题:ADC需要正确的时钟配置才能正常工作,确保时钟配置正确。

6. 信号源问题:可能是要采集的信号源没有正确连接或存在问题,导致ADC无法采集到有效数据。

需要仔细检查以上可能的原因,逐一排查并解决问题。如果仍然无法解决,可能需要参考ADUC7061的数据手册或与芯片厂商联系,以获取更具体的支持和解决方案。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分