您好,
我刚刚为新的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]);
}
}