单片机/MCU论坛
直播中

张强

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

Aduc7061 ADC读出来的数据都是错误是为什么?怎么解决?

用的ADC1的4通道,看着例程写的,基本没什么改变,但是读出来的数据貌似是垃圾数。我也试了主ADC,也不行,是我的程序那个地方需要注意吗??信号电压是0.22V,读出来的数据总是
808117左右,用的片内基准。我就是对地短路这个数也不会变化。其它串口定时器什么的程序都没问题,就这个ADC很奇怪。大佬们有类似的问题吗?用的keil5。

#include "main.h"

unsigned int runtime = 0;
unsigned char newADCdata;

#include
int main(void)
{
/******************修改,以p0.4,ir为例*******************/
newADCdata = 0;
runtime = 0;
POWKEY1 = 0x1;
POWCON0 = 0x78; // Set core to max CPU speed of 10.24Mhz
POWKEY2 = 0xF4;
GP0DAT = BIT17+BIT25+BIT28;//DAT功能设置,比如输入输出,24~31位配置
GP0SET = BIT16; //GPxSET为端口x的数据设置寄存器
// Initilize Timer 1 in Periodic mode with timeout period of 1 Second
T1LD = 0x2800; //10240 1ms
T1CON = 0x6C0; // 110 1100 0000,Periodic mode, enable timer, 10.24M clock/1,增
IRQCONE = BIT1; // Rising edge
FIQEN = BIT4 + BIT13; // Enable Timer 1 IRQ
UARTInit();
IRQEN = BIT11; // Enable UART interrupt

// Configure ADC1 for continuous conversions, 1khz, ADC4 input
ADCMSKI = BIT1; // Enable ADC1 result ready interrupt source
ADCFLT = 0x7; // Chop off, 1Khz samping rate, SF = 7. No averaging
ADCMDE = BIT0; // Continuous Conversion mode, Normal mode
ADC1CON = BIT8 + BIT9 // ADC1 input channel 4 in Single-Ended mode.
+ BIT15; // Auxiliary-ADC Enabled
// Also, Int reference,
ADCCFG = 0;

IRQEN = BIT10+BIT11; // Enable ADC1 and UART interrupts
printf("初始化成功!rn");
while(1)
{
if (newADCdata == 1) // Is there an ADC0 result ready for UART transmission?
{
newADCdata = 0;
printf("NTCt%lu rn",lADC0_Thermocouple); //2^24=16777216
}

if(runtime%1000 < 30)
{
printf ("runtime = %drn",runtime/1000 );
GP0DAT ^= BIT17; // Toggle LED on Evaluation board (P0.4)
// printf("ADC值为%d rn",newADCdata);
}
}
}


void IRQ_Handler(void) __irq
{
unsigned long IRQSTATUS = 0;
IRQSTATUS = IRQSTA; // Read off IRQSTA register
if ((IRQSTATUS   BIT10) == BIT10) //If ADC0 interrupt source
{

// if (newADCdata==0)
// {
lADC0_Thermocouple = ADC0DAT;
lADC0_Thermocouple = ADC1DAT; //读从ADC,要先读主ADC的数据
newADCdata = 1;

// }
}

unsigned char ucCOMIID0 = 0;
if ((IRQSTATUS   BIT11) == BIT11) //UART interrupt source
{
ucCOMIID0 = COMIID0;
if ((ucCOMIID0   0x2) == 0x2) // Transmit buffer empty 发送缓冲区为空
{
ucTxBufferEmpty = 1;
}
if ((ucCOMIID0   0x4) == 0x4) // Receive byte
{
ucComRx = COMRX;
printf("%drn",ucComRx);
}
}
}

void FIQ_Handler(void) __irq
{
unsigned long FIQSTATUS = 0;
FIQSTATUS = FIQSTA; // Read off IRQSTA register
if ((FIQSTATUS   BIT4) == BIT4) //Timer 1 interrupt source
{
//
runtime++;
T1CLRI = 0x55; // Clear the currently active Timer0 Irq
}
}

void Delay_ms(u32 time)
{
u32 tick = runtime;
while(runtime < (tick+time));
}






                                                                                                                        

回帖(1)

京五环以外

2024-1-11 11:35:02
根据提供的代码,有几个可能导致ADC读取数据错误的原因:

1. ADC引脚配置错误:请确保你正确地配置了ADC引脚,以使其连接到正确的电路和信号上。

2. ADC精度设置错误:请检查你的代码是否正确设置了ADC的精度,以确保它与你的应用需求匹配。确保你选择了正确的ADC精度配置(例如12位或10位)。

3. ADC参考电压设置错误:请确认你正确地设置了ADC参考电压,以便将输入电压值转换为正确的数字。

4. ADC时钟配置错误:请确保你正确地配置了ADC的时钟,以使其工作在预期的频率范围内。

5. ADC采样时间设置错误:请检查你的代码,查看是否正确设置了ADC的采样时间,以确保能够准确地采样到输入信号。

如果你已经检查了以上可能的问题,并且你的代码还是无法正确读取ADC数据,你可以尝试以下解决方法:

1. 检查你的硬件连接:确保ADC引脚正确连接到电路和信号。

2. 检查你的代码:仔细检查你的代码,确认你正确配置了ADC的参数,包括精度、参考电压、时钟和采样时间。

3. 调试模式:在调试模式下运行代码,使用调试器逐步执行你的代码,并在每个ADC读取操作之后检查相关寄存器的值,以确保其正确设置。

如果仍然无法解决问题,你可以尝试在论坛或社区中寻求帮助,或者咨询相关厂商的技术支持。
举报

更多回帖

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