题目要求要对外部输入正弦波进行正负幅值采样,所以我使用了DTC两个通道,下面是我的代码:
[mw_shl_code=c,true]void ADC_Init(void)
{
/*失能ADC才能改变相关寄存器的值*/
ADC10CTL0 &= ~ENC;
/*16个ADC Clock , SHI信号自动执行 , 基准电压生成器打开(2.5V),使能中断*/
ADC10CTL0 = ADC10SHT_2 + MSC + REFON + ADC10ON + ADC10IE+REF2_5V;
ADC10CTL1 = INCH_5 + SHS_0 + ADC10SSEL_2 + CONSEQ_3 + ADC10DIV0;
ADC10AE0 |= BIT4 + BIT5 ;//使能模拟输入脚A04,A05
ADC10AE0|=0x30;
//定义了每个块中的传输量为2个。转换结果是16位的,也就是传输2个16位数据就是一个块就会把中断标志位置位,触发中断。
//因为是两个通道的,所以每个通道数据传输一次
ADC10DTC1 = 0x04;
__delay_cycles(30000);
ADC10CTL0&=~ADC10IFG;//清除中断标志位
ADC10CTL0 |= ENC; //ADC使能
}[/mw_shl_code]
[mw_shl_code=c,true]#pragma vector =ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
ADC10CTL0&=~ADC10IFG;/*清除中断*/
_disable_interrupts();
printf("1=%d ",Result[0]);
printf("2=%d ",Result[1]);
printf("3=%d ",Result[2]);
printf("4=%d \r\n",Result[3]);
Channel_A=0;
Channel_B=0;
P1OUT^=BIT0;
_enable_interrupts();
}[/mw_shl_code]
[mw_shl_code=c,true]ClockInit();
USART_Init();
ADC_Init();
P1DIR|=BIT0;
while(1)
{
ADC10CTL0 &= ~ENC;
ADC10SA = (int)Result;// 设置DTC的开始地址
while (ADC10CTL1 & BUSY); //等待忙,ADC10 忙。 该位标志着一个有效的采样和转换操作
ADC10CTL0 |= ENC + ADC10SC;//使能转换并且开始转换
_delay_cycles(1000000);
}[/mw_shl_code]
现象是我把P1.4和P1.5直接接地,对应2.5V的参考电压来说应该是输出0的但是这是现象:
然后我一个接地一个结VCC是这个现象:
我的问题是:第一我试了连续转换和单次通道转换(不是单通道),都是这个值。
我如果直接每次采样直接输出及定义DTC块大小为0x02的时候又是正确的
所以想请教下搞过DTC的大神
|