Other Parts Discussed in Thread: MSP-FET, MSP-EXP430FR5994
Tool/software: Code Composer Studio
Hi
I am trying to use the ADC12_B module to measure battery voltage on an MSP430FR5949 (running on a 3.3v supply). I have used a TI adc sample program with the appropriate amendments to set the common reference to 2.0v, and to select channel 31 is input, with battery mapping enabled. The sample program loops continuously so I inserted a printf statement to display successive values.
With an input voltage of 3.3/2, ie 1.65v I expected to get a consistent reading of around (1.65 / 2.0) * 4096, that is around 3380 each time round.
Instead, I am getting wildly different values each time round, none of which are close to what I expected. I attach below the sample program, and a portion of the output. I am clearly doing something wrong so any help would be much appreciated.
Regards
Dick Laine
// MSP430FR59xx Demo - ADC12, Sample A1
//******************************************************************************
#include <msp430.h>
#include <stdio.h>
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
P1OUT &= ~BIT0; // Clear LED to start
P1DIR |= BIT0; // Set P1.0/LED to output
P1SEL1 |= BIT1; // Configure P1.1 for ADC
P1SEL0 |= BIT1;
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
while(REFCTL0 & REFGENBUSY); // If ref generator busy, WAIT
REFCTL0 |= REFVSEL_1 | REFON; // Select internal ref = 2.0V
while(!(REFCTL0 & REFGENRDY));
ADC12CTL0 = ADC12SHT0_2 | ADC12ON; // Sampling time, S&H=16, ADC12 on
ADC12CTL1 = ADC12SHP; // Use sampling timer
ADC12CTL2 |= ADC12RES_2; // 12-bit conversion results
ADC12CTL3 = ADC12BATMAP;
ADC12MCTL0 = ADC12INCH_31 | ADC12VRSEL_1; // A1 ADC input select; Vref=VREF=2.0
ADC12IER0 |= ADC12IE0; // Enable ADC conv complete interrupt
{
__delay_cycles(5000);
ADC12CTL0 |= ADC12ENC | ADC12SC; // Start sampling/conversion
__no_operation(); // For debugger
printf("ADC12MEM0 = %d \n",ADC12MEM0);
}
}
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
{
case ADC12IV_NONE: break; // Vector 0: No interrupt
case ADC12IV_ADC12OVIFG: break; // Vector 2: ADC12MEMx Overflow
case ADC12IV_ADC12TOVIFG: break; // Vector 4: Conversion time overflow
case ADC12IV_ADC12HIIFG: break; // Vector 6: ADC12BHI
case ADC12IV_ADC12LOIFG: break; // Vector 8: ADC12BLO
case ADC12IV_ADC12INIFG: break; // Vector 10: ADC12BIN
case ADC12IV_ADC12IFG0: // Vector 12: ADC12MEM0 Interrupt
if (ADC12MEM0 >= 0x7ff) // ADC12MEM0 = A1 > 0.5AVcc?
P1OUT |= BIT0; // P1.0 = 1
else
P1OUT &= ~BIT0; // P1.0 = 0
__bic_SR_register_on_exit(LPM0_bits); // Exit active CPU
break; // Clear CPUOFF bit from 0(SR)
case ADC12IV_ADC12IFG1: break; // Vector 14: ADC12MEM1
case ADC12IV_ADC12IFG2: break; // Vector 16: ADC12MEM2
case ADC12IV_ADC12IFG3: break; // Vector 18: ADC12MEM3
case ADC12IV_ADC12IFG4: break; // Vector 20: ADC12MEM4
case ADC12IV_ADC12IFG5: break; // Vector 22: ADC12MEM5
case ADC12IV_ADC12IFG6: break; // Vector 24: ADC12MEM6
case ADC12IV_ADC12IFG7: break; // Vector 26: ADC12MEM7
case ADC12IV_ADC12IFG8: break; // Vector 28: ADC12MEM8
case ADC12IV_ADC12IFG9: break; // Vector 30: ADC12MEM9
case ADC12IV_ADC12IFG10: break; // Vector 32: ADC12MEM10
case ADC12IV_ADC12IFG11: break; // Vector 34: ADC12MEM11
case ADC12IV_ADC12IFG12: break; // Vector 36: ADC12MEM12
case ADC12IV_ADC12IFG13: break; // Vector 38: ADC12MEM13
case ADC12IV_ADC12IFG14: break; // Vector 40: ADC12MEM14
case ADC12IV_ADC12IFG15: break; // Vector 42: ADC12MEM15
case ADC12IV_ADC12IFG16: break; // Vector 44: ADC12MEM16
case ADC12IV_ADC12IFG17: break; // Vector 46: ADC12MEM17
case ADC12IV_ADC12IFG18: break; // Vector 48: ADC12MEM18
case ADC12IV_ADC12IFG19: break; // Vector 50: ADC12MEM19
case ADC12IV_ADC12IFG20: break; // Vector 52: ADC12MEM20
case ADC12IV_ADC12IFG21: break; // Vector 54: ADC12MEM21
case ADC12IV_ADC12IFG22: break; // Vector 56: ADC12MEM22
case ADC12IV_ADC12IFG23: break; // Vector 58: ADC12MEM23
case ADC12IV_ADC12IFG24: break; // Vector 60: ADC12MEM24
case ADC12IV_ADC12IFG25: break; // Vector 62: ADC12MEM25
case ADC12IV_ADC12IFG26: break; // Vector 64: ADC12MEM26
case ADC12IV_ADC12IFG27: break; // Vector 66: ADC12MEM27
case ADC12IV_ADC12IFG28: break; // Vector 68: ADC12MEM28
case ADC12IV_ADC12IFG29: break; // Vector 70: ADC12MEM29
case ADC12IV_ADC12IFG30: break; // Vector 72: ADC12MEM30
case ADC12IV_ADC12IFG31: break; // Vector 74: ADC12MEM31
case ADC12IV_ADC12RDYIFG: break; // Vector 76: ADC12RDY
default: break;
}
}
ADC12MEM0 = 2013
ADC12MEM0 = 2721
ADC12MEM0 = 2564
ADC12MEM0 = 3528
ADC12MEM0 = 2045
ADC12MEM0 = 2568
ADC12MEM0 = 2009
ADC12MEM0 = 2750
ADC12MEM0 = 2470
ADC12MEM0 = 3216
ADC12MEM0 = 3899
ADC12MEM0 = 2000
ADC12MEM0 = 2571
ADC12MEM0 = 2056
ADC12MEM0 = 2450
ADC12MEM0 = 3334
ADC12MEM0 = 2458
ADC12MEM0 = 2000