晚上好,
我正在尝试在 dspic33FJ128MC802 上实现一个简单的 1 通道 ADC 读取器,它可以手动开始采样数据,在采样完成时自动转换,并读取和存储数据。
这对我来说从来都不是问题,除了这个微控制器,它似乎没有实现正常的 ADC,
我已经通读了数次关于 ADC 的数据表部分,并且我已经将其配置为我的最佳能力,但是当我将实验室电源直接连接到输入时,ADC1BUF0 值会在 0 到 4096 之间不一致地跳跃ADC的引脚。
我看到的是 ADC1BUF0 值似乎大致对应于输入电压(0-3.3V),当我暂停调试器时,它给出了几个(2-4)个读数在 +-100 范围内(4096 是不错)。然后,如果我继续运行并暂停,电压保持不变,存储在缓冲区中的值突然开始跳跃 +- 500,有时甚至显示 4095(全 1)和 0。
然后,当我将实验室 PSU 更改为不同的电压时,它似乎重复了向我显示几个正确值的过程,然后又开始跳来跳去。
所以本质上,它会在我暂停调试器的 1/2 时显示一个正确的值。
我不知道是什么原因造成的,我知道我需要在改变电压后运行调试器,以便它可以清除缓冲区,但是关于这个微控制器的某些东西似乎肯定是错误的。
请让我知道可以做些什么来解决这个问题,
编译器是 XC16,IDE 是 Mplab 8.92
谢谢,
下面是我的配置:
[代码]
void InitADC() {
TRISAbits.TRISA0=1;
AD1CON1bits.FORM = 0; // Data Output Format: integer//Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 7; // Interan Counter (SAMC) ends sampling and starts convertion
AD1CON1bits.ASAM = 0; // ADC Sample Control: Sampling begins immediately after conversion
AD1CON1bits.AD12B = 1; // 12-bit ADC operation
AD1CON1bits.SIMSAM =1; // 10-bit ADC operation
AD1CON2bits.CHPS = 0; // Converts CH0
AD1CON2bits.CSCNA = 0; // Do not scan inputs
AD1CON2bits.VCFG = 0; // Use voltage reference Vss/Vdd
AD1CON2bits.ALTS = 0; // Always use input select for channel A
AD1CON2bits.BUFM = 0; // Always start filling at buffer 0
AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
AD1CON3bits.SAMC = 0; // Auto Sample Time = 0*Tad
AD1CON3bits.ADCS = 2; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*3 = 75ns (13.3Mhz)
// ADC Conversion Time for 10-bit Tc=12*Tab = 900ns (1.1MHz)
AD1CON1bits.ADDMABM = 1; // DMA buffers are built in conversion order mode
AD1CON2bits.SMPI = 0; // SMPI must be 0
AD1CON4bits.DMABL = 0; // Only 1 DMA buffer for each analog input
//AD1CHS0/AD1CHS123: A/D Input Select Register
AD1CHS0bits.CH0SA = 0; // MUXA +ve input selection (AIN0) for CH0
AD1CHS0bits.CH0NA = 0; // MUXA -ve input selection (Vref-) for CH0
AD1CHS123bits.CH123SA = 0; // MUXA +ve input selection (AIN0) for CH1
AD1CHS123bits.CH123NA = 0; // MUXA -ve input selection (Vref-) for CH1
IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE = 0; // Do Not Enable A/D interrupt
AD1CSSL = 1; //Scan from AN0 only
AD1PCFGL = 0b111111110; //Only AN0 in analog input mode
AD1CON1bits.ADON = 1; // Turn on the A/D converter
}
int main() {
ADPCFG = 0xFFFE; //make ADC pins all digital except AN0 (RA0)
while(1)
{
AD1CON1bits.SAMP = 1;
while(!AD1CON1bits.DONE);
myVoltage = ADC1BUF0;
}
return 0;
}
[/代码]