Dear People,
I have a very simple setup. I need to multiply a reference by 15. to be measured by A1 (P2.1)
A reference voltage is generated at P2.2(confirmed with a voltmeter) with respect to P2.0 which is grounded. ( will be used later to measure differential voltage).
The opamp module is to be operating as a differential gain array, for debugging I am using the RF2500 board serial port.
The output I am getting is as follows, which means that the voltage sampling at P2.2 is all good, but the op amp is not, and I am not sure why? any help or reference would be appreciated.
GND Ref ('-'P2.0): 0001 POT Reference x 15(P2.1): 0355 POT Reference('+' P2.2): 0624 (confirmed good)
GND Ref ('-'P2.0): 0001 POT Reference x 15(P2.1): 0239 POT Reference('+' P2.2): 0099 (confirmed good)
//****CODE is compiling, and UART and ADC10 is working
#include "msp430x22x4.h"void TXString( char* string, int length );void MCU_Init(void);// work loop semaphoreschar sSelfMeasureSem = 1;char value[4];void main (void){ WDTCTL = WDTPW + WDTHOLD; // Stop WDT { volatile int i; for(i = 0; i < 0xFFFF; i++){} } if( CALBC1_8MHZ == 0xFF ) // Do not run if cal values are erased { volatile int i; while(1) { for(i = 0; i < 0x5FFF; i++){} } } MCU_Init(); TXString( "Done\r\n", 6);
while (1) { // if it is time to measure our own temperature... if(sSelfMeasureSem) { int degC; volatile long temp; int results[2]; OA0CTL0 = OAN_1 + OAP_0 + OAPM_1 + OAADC0; //'+'->p2.0 '-'->p2.2 output/A1->p2.1 OA0CTL1 = OAFBR_7 + OAFC_7; //('+'-'-')*R2/R1 G15; diff amp configuration ADC10AE0 = 0x11; // A0-A2 analog function ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR; ADC10CTL1 = INCH_0 + ADC10DIV_4; for( degC = 240; degC > 0; degC-- ); ADC10CTL0 |= ENC + ADC10SC; __bis_SR_register(CPUOFF + GIE); results[0] = ADC10MEM; ADC10CTL0 &= ~ENC; TXString( " GND Ref ('-'): ", 16 ); temp = ADC10MEM; value[0] = '0'+((results[0]/1000)%10); value[1] = '0'+((results[0]/100)%10); value[2] = '0'+((results[0]/10)%10); value[3] = '0'+(results[0]%10); TXString(value, sizeof value); ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR; ADC10CTL1 = INCH_1 + ADC10DIV_4; for( degC = 240; degC > 0; degC-- ); ADC10CTL0 |= ENC + ADC10SC; __bis_SR_register(CPUOFF + GIE); results[0] = ADC10MEM; ADC10CTL0 &= ~ENC; TXString( " POT Reference x 15: ", 21 ); temp = ADC10MEM; value[0] = '0'+((results[0]/1000)%10); value[1] = '0'+((results[0]/100)%10); value[2] = '0'+((results[0]/10)%10); value[3] = '0'+(results[0]%10); TXString(value, sizeof value); ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR; ADC10CTL1 = INCH_2 + ADC10DIV_4; for( degC = 240; degC > 0; degC-- ); ADC10CTL0 |= ENC + ADC10SC; __bis_SR_register(CPUOFF + GIE); results[0] = ADC10MEM; ADC10CTL0 &= ~ENC; TXString( " POT Reference('+'): ", 21 ); temp = ADC10MEM; value[0] = '0'+((results[0]/1000)%10); value[1] = '0'+((results[0]/100)%10); value[2] = '0'+((results[0]/10)%10); value[3] = '0'+(results[0]%10); TXString(value, sizeof value); ADC10CTL0 &= ~(REFON + ADC10ON); // turn off A/D to save power TXString( "\r\n", 2); //new line sSelfMeasureSem = 0; } }}void TXString( char* string, int length ){ int pointer; for( pointer = 0; pointer < length; pointer++) { volatile int i; UCA0TXBUF = string[pointer]; while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? }}/*------------------------------------------------------------------------------*------------------------------------------------------------------------------*/void MCU_Init(){ BCSCTL1 = CALBC1_8MHZ; // Set DCO DCOCTL = CALDCO_8MHZ; BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO TACCTL0 = CCIE; // TACCR0 interrupt enabled TACCR0 = 12000; // ~1 second TACTL = TASSEL_1 + MC_1; // ACLK, upmode P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD UCA0CTL1 = UCSSEL_2; // SMCLK UCA0BR0 = 0x41; // 9600 from 8Mhz UCA0BR1 = 0x3; UCA0MCTL = UCBRS_2; UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt __enable_interrupt(); }#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR(void){ __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)}#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){ sSelfMeasureSem = 1;}