主要是关于ADC10的一些疑问,单片机型号为MSP430F2274,使用IAR5.3环境编译
1.VREF+和VeREF+以及VREF-和VeREF的关系,他们都有对应的GPIO口,而且同级同引脚,是不是VREF是输入的,VeREF是输出的,我有点搞不清楚
2.这个问题主要感觉还是1引起的,就是ADC10采集的值经过换算后无法和实际值匹配,而且波动偶尔比较大,但是万用表示波器测出来稳定的,硬件参数如下:
单片机28脚(VREF+/VeREF+)接2.5V,单片机27脚(VREF-/VeREF-)接地,AVCC接3.3V,AVSS接GND,25脚(AD的A6)用于接到纽扣电池的输入端的1/2电压出,用于测量纽扣电池的电压,现纽扣电池用恒压源3.3V代替,结果测出来AD值是500多。
按照公司AD值应该=1024 * 1.65 / 2.5 = 675.84,怎么会相差这么多,程序如下
#include <msp430x22x4.h>
#define P_LED2 (1<<4)
#define P_LED2_DIR P1DIR
#define P_LED2_OUT P1OUT
#define LED2_ON() P_LED2_OUT |= P_LED2
#define LED2_OFF() P_LED2_OUT &= ~P_LED2
#define ADS_NUM 16
unsigned int ads_val[ADS_NUM] = {0};
unsigned int ads_cnt = 0;
unsigned int ads = 0, tmp = 0;
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//主频为内部时钟,频率为1MHZ
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
//LED配置
LED2_OFF();
P_LED2_DIR |= P_LED2;//LED2设为输出
//定时器配置
TBCCR0 = 32768 / 100 - 1;
TBCTL = TBSSEL_1 + MC_1;
//AD初始化
ADC10AE0 |= (1 << 6);
ADC10CTL0 = SREF2 | SREF1 | ADC10SHT_2 | REFBURST | ADC10ON;
ADC10CTL1 = INCH_6;
while(1)
{
while(!(TBCCTL1 & CCIFG));
TBCCTL1 &= ~CCIFG;
P_LED2_OUT ^= P_LED2;
//ADC10CTL0 = SREF2 | SREF1 | ADC10SHT_2 | REFBURST | ADC10ON;
//ADC10CTL1 = INCH_6;
for(unsigned int i = 0; i < 60000; i++); //延时
ADC10CTL0 |= ENC + ADC10SC;//启动AD采样
while(ADC10CTL1 & ADC10BUSY);
ads_val[ads_cnt++] = ADC10MEM;
tmp += ADC10MEM;
if(ads_cnt == ADS_NUM)
{
ads = tmp / ADS_NUM;
ads_cnt = 0;
tmp = 0;
}
//ADC10CTL0 = SREF2 | SREF1 | ADC10SHT_2 | REFBURST;
}
}