TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR5739 开发板 ADC采集问题

你好,代码如下,我用ADC序列采集A4-A0口数据,发下,第一次采集时A4口采集到的数据很小只有20-30;之后的ADC采集,A4口采集到的数据都为300左右。我感觉第一次采集到的数据有问题,但不知道问题出在哪里? 希望您能帮助解决。是不是ADC第一次采集到的数据都不准确,需要舍去。其中A4采集的是热敏电阻的电压值。

unsigned short ADC_Result[5]; /*10-bit ADC 转换结果存储*/
;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; //系统时钟设置
CSCTL0_H = CSKEY_H; /*输入时钟保护密码*/
CSCTL1 |= DCOFSEL_3; /*DOC时钟为8MHz */
CSCTL2 = SELA_1 + SELS_3 + SELM_3; /*ACLK时钟源选择内部的VLOCLK(10KHz),SMCLK和MCLK的时钟源都选择DOC时钟*/
CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; /*ACLK,SMCLK,MCLK都未进行分频,因此ACLK为10KHz,SMCLK和MCLK为8MHz*/
CSCTL0_H = 0x01; /*时间寄存器设置完成,进行锁存保护*/
//P2.7被用作热敏电阻的电压驱动
P2OUT |= BIT7;
P2DIR |= BIT7; //内部参考电压设置
while(REFCTL0 & REFGENBUSY); /* 判断Ref是否处于busy状态*/
REFCTL0 |= REFVSEL_0+REFON; /* 设置参考电压为1.5v,开启Ref*/
// ADC引脚配置 P1SEL0 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;
P1SEL1 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;

// ADC10参考设置
ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;/* 16ADCclk采样时间, MSC, ADC打开*/
ADC10CTL1 = ADC10SHP + ADC10CONSEQ_1; /*sampling timer, 单通道序列采集*/
ADC10CTL2 = ADC10RES; /*10-bit分辨率*/
ADC10MCTL0 = ADC10SREF_1+ADC10INCH_4; /*A0,A1,A2,A3,A4(EoS), 1.5V参考电压*/
// DMA0参数设置
DMACTL0 = DMA0TSEL__ADC10IFG; /* DMA0通道采用ADC10IFG标志位触发*/
__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0); /*DMA0 的源地址*/ __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[0]); /*DMA0 的目的地址*/ DMA0SZ = 0x0005; /*进行5次转换*/
/*重复单次转换,每次转换目的地址增加,源地址默认不变,目的和源都采用字转换模式,DMA使能,DMA中断使能*/
DMA0CTL = DMADT_4 + DMADSTINCR_3 + DMAEN + DMAIE ; 
while(1)
{
while (ADC10CTL1 & BUSY); /*如果ADC忙,就等待*/
ADC10CTL0 |= ADC10ENC + ADC10SC; /*开始采集及样本转换*/
__bis_SR_register(CPUOFF + GIE); __delay_cycles(25000); __no_operation(); }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=DMA_VECTOR
__interrupt void DMA0_ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(DMA_VECTOR))) DMA0_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(DMAIV,16))
{
case 0: break; // No interrupt
case 2: // 序列转换完成进入中断,激活CPU
__bic_SR_register_on_exit(CPUOFF); // exit LPM
break; // DMA0IFG
case 4: break; // DMA1IFG
case 6: break; // DMA2IFG
case 8: break; // Reserved
case 10: break; // Reserved
case 12: break; // Reserved
case 14: break; // Reserved
case 16: break; // Reserved
default: break; }}

灰小子:

软件看不出有什么问题。建议提供下电路图

Ling Zhu2:

Jent Lee

你好,代码如下,我用ADC序列采集A4-A0口数据,发下,第一次采集时A4口采集到的数据很小只有20-30;之后的ADC采集,A4口采集到的数据都为300左右。我感觉第一次采集到的数据有问题,但不知道问题出在哪里? 希望您能帮助解决。是不是ADC第一次采集到的数据都不准确,需要舍去。其中A4采集的是热敏电阻的电压值。

unsigned short ADC_Result[5]; /*10-bit ADC 转换结果存储*/;int main(void){ WDTCTL = WDTPW + WDTHOLD; //系统时钟设置 CSCTL0_H = CSKEY_H; /*输入时钟保护密码*/ CSCTL1 |= DCOFSEL_3; /*DOC时钟为8MHz */ CSCTL2 = SELA_1 + SELS_3 + SELM_3; /*ACLK时钟源选择内部的VLOCLK(10KHz),SMCLK和MCLK的时钟源都选择DOC时钟*/ CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; /*ACLK,SMCLK,MCLK都未进行分频,因此ACLK为10KHz,SMCLK和MCLK为8MHz*/ CSCTL0_H = 0x01; /*时间寄存器设置完成,进行锁存保护*/ //P2.7被用作热敏电阻的电压驱动 P2OUT |= BIT7; P2DIR |= BIT7; //内部参考电压设置 while(REFCTL0 & REFGENBUSY); /* 判断Ref是否处于busy状态*/ REFCTL0 |= REFVSEL_0+REFON; /* 设置参考电压为1.5v,开启Ref*/ // ADC引脚配置 P1SEL0 |= BIT0 + BIT1 + BIT2+BIT3+BIT4; P1SEL1 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;

// ADC10参考设置 ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;/* 16ADCclk采样时间, MSC, ADC打开*/ ADC10CTL1 = ADC10SHP + ADC10CONSEQ_1; /*sampling timer, 单通道序列采集*/ ADC10CTL2 = ADC10RES; /*10-bit分辨率*/ ADC10MCTL0 = ADC10SREF_1+ADC10INCH_4; /*A0,A1,A2,A3,A4(EoS), 1.5V参考电压*/ // DMA0参数设置 DMACTL0 = DMA0TSEL__ADC10IFG; /* DMA0通道采用ADC10IFG标志位触发*/ __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0); /*DMA0 的源地址*/ __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[0]); /*DMA0 的目的地址*/ DMA0SZ = 0x0005; /*进行5次转换*/ /*重复单次转换,每次转换目的地址增加,源地址默认不变,目的和源都采用字转换模式,DMA使能,DMA中断使能*/ DMA0CTL = DMADT_4 + DMADSTINCR_3 + DMAEN + DMAIE ;  while(1) { while (ADC10CTL1 & BUSY); /*如果ADC忙,就等待*/ ADC10CTL0 |= ADC10ENC + ADC10SC; /*开始采集及样本转换*/ __bis_SR_register(CPUOFF + GIE); __delay_cycles(25000); __no_operation(); }}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector=DMA_VECTOR__interrupt void DMA0_ISR (void)#elif defined(__GNUC__)void __attribute__ ((interrupt(DMA_VECTOR))) DMA0_ISR (void)#else#error Compiler not supported!#endif{ switch(__even_in_range(DMAIV,16)) { case 0: break; // No interrupt case 2: // 序列转换完成进入中断,激活CPU __bic_SR_register_on_exit(CPUOFF); // exit LPM break; // DMA0IFG case 4: break; // DMA1IFG case 6: break; // DMA2IFG case 8: break; // Reserved case 10: break; // Reserved case 12: break; // Reserved case 14: break; // Reserved case 16: break; // Reserved default: break; } }

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR5739 开发板 ADC采集问题
分享到: 更多 (0)