msp430f1611을 사용하고 있는데 ADC에서 읽어들인 값하고 직접 테스터기로 찍은 값이 달라요.
왜 그런가요?
그리고 책에 Nadc = 4095 * Vin - Vr-/Vr+ - Vr- 이게 무엇을 의미하는 지 궁금합니다..
P6SEL = 0x01;
void adc_init()
{
ADC12CTL0 = ADC12CTL1 = 0;
/** must be ENC = 0 **/
ADC12CTL0 |= ADC12ON; //ADC core enable. (consumes power)
//ADC12CTL0 |= REFON; // internal reference voltage on
//ADC12CTL0 |= REF2_5V; // reference generator voltage 2.5V (or 1.5V). REFON must be set.
//ADC12CTL1 |= CSTARTADD0; // conversion memory register start adress[0~3] (ADC12MEM0~ADC12MEM15)
ADC12CTL1 |= ADC12SSEL0; // ADC12CLK = ACLK. ADC12 clock source - 00:ADC12OSC (consumes power), 01:ACLK, 10:MCLK, 11:SMCLK
//ADC12CTL1 |= ADC12DIV0; // ADC12 clock divider[0~2] - divide by 1~8
ADC12CTL1 |= SHP; //ADC12 Pulse Sample Mode (or Extended Sample mode)
ADC12CTL0 |= SHT01 | SHT00; // 32 ADC12CLK cycles sampling. SHT1x, SHT0x - sample and hold time. only for when SHP =1.
//ADC12CTL0 |= MSC; // Multiple sample and conversion. only for sequence or repeated modes.(ref. CONSEQx)
//ADC12CTL1 |= SHS0 | SHS1; // Sample-and-hold source - 00:ADC12SC bit, 01:TA1, 10:TB0
/*******************/
//ADC12CTL1 |= CONSEQ0 | CONSEQ1; // ADC12 conversion sequence select (00:single channel and conversion, 01:sequence channel, 10:repeat single channel, 11:repeat sequence of channels)
//ADC12CTL0 |= ENC; // ADC12 Enable Conversion
//ADC12CTL0 |= ADC12SC; // ADC12 start conversion
}
u16 adc_convert(u08 adc_channel)
{
u16 adc_result;
/** must be ENC = 0 **/
ADC12CTL0 &= ~ENC;
switch (adc_channel)
{
case 0 :
ADC12MCTL0 = INCH_0; break;
case 1 :
ADC12MCTL0 = INCH_1; break;
case 2 :
ADC12MCTL0 = INCH_2; break;
case 3 :
ADC12MCTL0 = INCH_3; break;
case 4 :
ADC12MCTL0 = INCH_4; break;
case 5 :
ADC12MCTL0 = INCH_5; break;
case 6 :
ADC12MCTL0 = INCH_6; break;
case 7 :
ADC12MCTL0 = INCH_7; break;
case 10 :
ADC12MCTL0 = INCH_10; break; // temperature diode
}
/*******************/
ADC12CTL0 |= ADC12SC + ENC; // SHI = 1
ADC12CTL0 &= ~ADC12SC; // SHI = 0
// wait until the conversion completes; ADC12BUSY?
while (ADC12CTL1 & ADC12BUSY);
ADC12CTL0 &= ~ENC;
// 12 bit data mode
adc_result = ADC12MEM0;
return(adc_result);
}
이렇게 해서 값을 읽어 들인값하고 테스터기로 찍어보면 나온값하고 어떻게 비교를 해야 하나요..위에 공식으로 적용을 해야하는지..
전압은 0.6V가 나오는데 위에 대로 읽어 들인값은 744 값이 나옵니다..
전압인가는 5V를 넣어주었고..
Nadc = 4095 * (Vin - Vr- ) / (Vr+ - Vr- ) 공식을 적용하여 값을 환산해야 입력된 전압 값을 알 수 있습니다.
4095 는 ADC가 12BIT로 2^12 의 Resolution을 갖기 때문에 변환 가능한 값의 범위가 0 ~ 4095 이고 , 그 최대 값을 나타내는 것 입니다.
Vr- 는 마이너스 기준 전압 (보통 0v) , Vr+는 플러스 기준 전압 ( 보통 CPU 전원 3.3V ) 입니다.
따라서 공식을 다시 쓰면 Nadc = 4095 * Vin / 3.3V 이 됩니다.
Nadc = 4095 * 0.6V / 3.3V = 744
더 예를 들어 보면
입력 전압이 0V 이면 AD 값은 0 ,
입력 전압이 1.65V 이면 AD 값은 2047
입력 전압이 3.3V 면 AD값은 4095 가 됩니다.