This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,今天写了ADC12A的程序,上午还转换得好好的,下午的时候弄着弄着突然就不行了,是基准电压设置问题,基准电压默认为3.3V就没事,但是只要设置ADC12CTL2 = ADC12RES_2 ;用内部基准电压后,只要有电压输入,不管输入多小,转换的值都是4095(12位),信号电压到0的时候是正常的。不知道大家有没有遇到过这种情况,希望大家指导下。下面是我的最简AD程序
#include <msp430.h>
unsigned int AD_data = 0;
unsigned int AD_data_buf[8];
unsigned int i;
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P6SEL |= BIT0 ;
ADC12CTL2 = ADC12RES_2 ; //我感觉问题在此
ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT0_0 + ADC12REFON ;
ADC12MCTL0 |= ADC12SREF_1;
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2+ADC12SSEL_1;
for (i=0;i<0xFFFF;i++);
ADC12IE = 0x01; // Enable ADC12IFG.0
ADC12CTL0 |= ADC12ENC;
_EINT();
ADC12CTL0 |= ADC12SC;
LPM3;
return 0;
}
#pragma vector = ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
AD_data = (ADC12MEM0_H*256)+ADC12MEM0_L;
for(i=7;i>0;i--){
AD_data_buf[i] = AD_data_buf[i-1];
}
AD_data_buf[0] = AD_data;
}
你好,zhiye Lai!
看完你的帖子之后,我认为:
1. 基准电压中的Vref未设置,需要到REF模块中设置。
2.中断服务程序尽量简单
// 声明全局变量
unsigned char ii;
// 在主函数的开始部分初始化赋值
ii = 0;
#pragma vector = ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
AD_data_buf[ii++] = (ADC12MEM0_H*256)+ADC12MEM0_L;
if(ii==8){
LPM4_EXIT; // LPM4_EXIT;可以退出所有的低功耗模式,包括LPM3
}
}