论坛

dsPic30F3012 ADC令人沮丧的问题...

开始于 恶魔 2009年5月17日
您好,

我刚刚为新的dsPic项目构建了电路板,但遇到了非常困难的情况。 ADC令人困惑的问题。如果你们都足够好看 为了我。我希望这不是我错过的简单愚蠢的事情...

首先,我的环境:

dsPic30F3012 @ 3.3V
MPLAB 8.30
MPLAB C30学生版3.12编译器
PICKIT 2调试器(DE版本= 1.40.3)
USART电平转换器= MAX3232
终端软件=标准Windows HyperTerm

我有六个模拟输入(AN0-AN3,AN6,AN7),三个来自三轴加速度计 (AN1-AN3),其余的来自3轴磁阻传感器阵列。我取样 全部六个16次,然后将结果下移4位以获得平均值。我有 在下面包含了我的源代码。

问题:
起初,一切运行良好,没有问题。但是经过一个随机的时间间隔 MCU似乎已锁定。我从调试器中暂停执行,可以看到 循环到“ while(!ADCON1bits.DONE);”声明。 ADCON1bits.DONE确实是 明确。设置了ADCON1bits.SAMP。

进一步检查ADCON1寄存器位,发现SSRC位2 (ADCON1<7>)已清除。所以现在将其设置为保留值,而不是 所需的内部计数器触发模式。

我看了看,但找不到任何可能导致这种情况的地方 更改。有人可以帮我吗?

谢谢!!!

_--------
-------
-----------
#包括

int main(void);
void ADC_Init(void);
void UART_Init(void);
void putch(unsigned char dat);
无效打印(const char * dat);
void print_int(unsigned int val,unsigned char place);

无符号整数Az,Ax,Ay,Hz,Hx,Hy,t,i;

int main(无效)
{

ADC_Init();
UART_Init();

TRISC0101111111111111;

do
{
Az=0;
Ax=0;
Ay=0;
Hz=0;
Hx=0;
Hy=0;

ADCHS = 0x0001;

for(i=0;i<16;i++)
{

ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
while(!ADCON1bits.DONE);
ADCHS = 0x0002;
Az+CBUF0;

ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
while(!ADCON1bits.DONE);
ADCHS = 0x0003;
Ay+CBUF0;

ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
while(!ADCON1bits.DONE);
ADCHS = 0x0000;
Ax+CBUF0;

ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
while(!ADCON1bits.DONE);
ADCHS = 0x0006;
Hz+CBUF0;

ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
while(!ADCON1bits.DONE);
ADCHS = 0x0007;
Hx+CBUF0;

ADCON1bits.DONE=0;
ADCON1bits.SAMP=1;
while(!ADCON1bits.DONE);
ADCHS = 0x0001;
Hy+CBUF0;
}
Az>>=4;
Ay>>=4;
Ax>>=4;
Hz>>=4;
Hy>>=4;
Hx>>=4;

prints("Ax:");
print_int (Ax,5);
prints(" Ay:");
print_int (Ay,5);
prints(" Az:");
print_int (Az,5);

prints(" Hx:");
print_int (Hx,5);
prints(" Hy:");
print_int (Hy,5);
prints(" Hz:");
print_int (Hz,5);

prints(" \r");

} while(1);
return(0);
}

无效ADC_Init(void)
{

ADCON1bits.FORM = 0;
ADCON1bits.SSRC = 7; //完成采样后自动转换
ADCON1bits.ASAM = 0; //仅在手动设置SAMP位时采样

ADCON2bits.SMPI = 0;

ADCON3bits.SAMC = 1;
ADCON3bits.ADRC = 1;

ADCSSL = 0x0000;

ADPCFG = 0b1111111100110000;

TRISB=0xFFFF;

IFS0bits.ADIF = 0;
IEC0bits.ADIE = 0;
ADCON1bits.ADON = 1;

}

无效UART_Init(void)
{
U1BRG; //19200bps
U1MODEbits.ALTIO = 1; //使用备用引脚
U1MODEbits.UARTEN=1;
U1STAbits.UTXEN=1;
}

无效打印(const char * dat)
{
while(*dat)
{
putch(*dat);
dat++;
}
}

void putch(unsigned char dat)
{
while(!U1STAbits.TRMT);
U1TXREG;
}

void print_int(unsigned int val,unsigned char place)
{
unsigned int fp_temp;
int fp_i;
char buffer[5];

for (fp_i=0;fp_i {
fp_temp=val/10;
buffer [fp_i] =('0'+(val-(fp_temp * 10)));
val=fp_temp;
}

for(fp_i = places-1;!(fp_i ==-1); fp_i--)
{
putch(buffer[fp_i]);
}

}