본문 바로가기

[MSP430]/MSP430i

MSP430i SD24 - ADC24 테스트

MSP430i SD24 - ADC24 테스트




MSP430i 시리즈는 산업용 스펙을 만족하면서 저렴하게 구현할 수 있는 24bit ADC를 내장하고 있다.   MSP430AFE 시리즈의 ADC24 제어와 거의 유사하게 제어 가능하다.


- 24비트 ADC Second-order sigma-delta architecture

- 최대 7채널 연속 샘플링 ADC

- Fixed 1.024-MHz modulator input frequency

- 내부/외부 레퍼런스 선택 ?oftware selectable internal or external voltage reference

- 내부 온도센서



MSP430i ADC24 블록도

내부 레퍼런스 1.2V가 내장되어 있고 PGA16까지 가능하며 diff 로 입력 가능하다.




24bit ADC 결과값 저장 레지스터

ADC24 결과 레지스터는 16비트 레지스터로 SD24MEMx 레지스터에 저장된다. MSP430코어 자체가 16비트 이므로 16트로 된것 같다.

결국 16비트 레지스터를 두번 읽어서 24비트로 만들 수 있다. SD24CCTLx 레지스터의 SD24LSBACC (bit 6)에 의해 상위 16 bits 또는 하위 16 bits의 데이터를 읽을 수 있다.

아날로그 디바이스사의 24bit ADC 내장 MCU Adum360 과 비교 (ADucM360 24bit ADC 테스트) 하면 ADC 버퍼라던지 32bit 레지스터와 같이 부족한것이 많이 있지만 가격대 성능비로 봐야 할것 같다.


아래 그림과 같이 OSR 설정에 따라 30bit 범위에서 두번 읽어 24bit ADC값을 취할수 있다.

그리고 LSBTOG = 1, LSBACC = 0으로 설정하면 SD24MEMx을 읽을 때마다 MSB 측 데이터와 LSB 측 데이터가 교대로 읽어 낼 수 있다.






 


MSP430i ADC24 테스트 동영상

가변저항(VR)의 전압 변화 값을 블루투스 모듈을 이용하여 핸드폰으로 전송하고 그래프로 출력 하는 테스트





한가지 아쉬운점은 유니폴러 지원을 하지 않는다. 에너지 미터링 쪽으로 특화 되서 그런지 기존 AFE 시리즈에서 제공하던 유니폴러 모드가 더이상 지원되지 않는다. 단전원 측정시에는 절반 밖에 측정이 안되기 때문에 해상도 면에서 불리하다고 할 수 있다.







MSP430i 24bit ADC(ADC24) 초기화 코드

void ADC_Init(void)

{

unsigned char i;

/*

    SD24CTL = SD24REFS;                            // Internal ref

    SD24CCTL0  |= SD24GRP | SD24DF;                // Group with CH1

    SD24CCTL1  |= SD24GRP | SD24DF;                // Group with CH2

    SD24CCTL2  |= SD24IE | SD24DF;                 // Enable interrupt

    */

    SD24CTL = SD24REFS;                         // Internal ref

    SD24CCTL0  |= SD24DF | SD24IE;              // Enable interrupt


    __delay_cycles(3200);                       // Delay ~200us for 1.2V ref to settle


    SD24CCTL0 |= SD24SC;                        // Set bit to start conversion

    __bis_SR_register(LPM0_bits | GIE);         // Enter LPM0 w/ interrupts

}




MSP430i 24bit ADC(ADC24) 결과 처리 인터럽트 코드

SD24MEMx 레지스터에서 16비트 결과값을 가져와 처리할 수 있다.

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)

#pragma vector=SD24_VECTOR

__interrupt void SD24_ISR(void) {

#elif defined(__GNUC__)

void __attribute__ ((interrupt(SD24_VECTOR))) SD24_ISR (void)

#else

#error Compiler not supported!

#endif


    unsigned int val;

    unsigned int val2;

    

    switch (__even_in_range(SD24IV,SD24IV_SD24MEM3)) {

        case SD24IV_NONE: break;

        case SD24IV_SD24OVIFG: break;

        case SD24IV_SD24MEM0: break;

        case SD24IV_SD24MEM1: break;

        case SD24IV_SD24MEM2:

                   Cbi(SD24CCTL0, SD24LSBACC);

                   gAdch_Ch0 += SD24MEM0;

                   gAdch_Ch1 += SD24MEM1;

                   gAdch_Ch2 += SD24MEM2;


                   //하위 16비트 데이터

                   Sbi(SD24CCTL0, SD24LSBACC);

                   gAdcl_Ch0 += SD24MEM0 & 0xFF;

                   gAdcl_Ch1 += SD24MEM1&0xFF;

                   gAdcl_Ch2 += SD24MEM2&0xff;

                   index++;

                   




MSP430i 24bit ADC 성능 테스트

레퍼런스 전압을 고정하고 데이터 수집한 결과를 보면 2비트 정도 흔들리는것 같다. 저렴한 가격에 이정도 성능이라면 상당히 훌륭한것 같다.

64로 평균필터 돌리니 거의 안정적이다. 16비트모드에서 1~2정도 흔들린다.

다만 리니어리티가 좀 떨어지는것 같다.



반응형