SLAA475A October 2010 – March 2019 MSP430L092
The comparator itself can have an internal offset. This offset can cause a significant error in the results. To compensate for this error, the ADC can be used in an offset-compensation mode. In this mode, it is necessary to make two measurements with changed inputs. The following code shows how to implement this.
#include "msp430l092.h"
unsigned char result[2]; // result array
unsigned char i = 0; // counting variable
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
APCNF = CMPON+DBON+CONVON+APREFON; // Enable comparator on +
// Enable DAC buffer +
// Enable conversion +
// Enable reference
APVDIV = A0DIV; // Set 500mV input range
APINT = 0x00; // Clear ADC-DAC-REG
APIE |= EOCIE; // Enable end of conversion interrupt
_BIS_SR(GIE); // Switch on global interrupts
APCTL = APPSEL0+APPSEL2+OSEL+CBSTP+SBSTP;
// Set DAC buffer output to PSEL +
// Select output buffer +
// Enable Comparator based stop +
// Enable Saturation based stop +
APCTL |= RUNSTOP; // Start conversion
_BIS_SR(LPM0); // Go to LPM0
APINT = 0x00; // clear ADC-DAC-REG
APCTL = APNSEL0+APNSEL2+OSEL+CBSTP+SBSTP+OSWP;
// Set DAC buffer output to NSEL +
// Select output buffer +
// Enable Comparator based stop +
// Enable Saturation based stop +
// Inverted comparator output is used +
APCTL |= RUNSTOP; // Start conversion
_BIS_SR(LPM0); // Go to LPM0
asm("nop");
while(1);
}
#pragma vector=APOOL_VECTOR // A-Pool interrupt service routine
__interrupt void APOOL_ISR(void)
{
switch(__even_in_range(APIV,8)) // Add offset to PC and delete flag
{
case 0: break;
case 2: result[i++] = APINT; // Save value in result array
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
break;
case 4: break;
case 6: break;
case 8: break;
default: break;
}
}