[MSP430]/MSP430i2015. 6. 30. 18:05

MSP430i - SD24 내장 온도센서 테스트 (휴대폰 블루투스를 이용한 온도 그래프표시)

MSP430i - SD24 내장 온도센서 테스트 (휴대폰 블루투스를 이용한 온도 그래프표시)





MSP430i 시리즈는 저가격의 스마트 미터링 분야에 적용하기 좋은 MCU이다. 

이러한 특징에 맞게 MSP430i2041과 블루투스를 이용하여 온도를 측정 하고 스마트폰으로 확인할 수 있는 예제를 작성해 보았다.


MSP430i 시리즈에는 자체 내부 온도 센서가 내장되어 있다. 이를 이용하면 좀더 간단하게 온도 데이터를 획득할 수 있다.



MSP430 내부 온도 센서 특성 그래프



  Vsensor = 1.32mV * DegK + Vsensor_offset (assuming 0mv for offset)

  Vsensor = (SD24MEM0)/32767 * Vref(mV)


  DegK = (SD24MEM0 * 1200)/32767/2.158 = (SD24MEM0 * 1200)/70711

  DegC =  DegK - 273

  DegF = (DegC * 9/5) + 32





MSP430 내부 온도 센서 초기화 코드

A0.6+           A0.6-




void ADC_Init(void)

{

    SD24CTL = SD24REFS;                         // Internal ref

    SD24CCTL0  |= SD24SNGL | SD24DF | SD24IE;   // Enable interrupt

    SD24INCTL0 |= SD24INCH_6;                   // Internal temp sensor

}





MSP430i 온도센서 테스트 동영상

MSP430i 내장온도센서의 온도데이터를 블루투스를 통해 스마트폰으로 전송하고 그래프로 표시하는 테스트





MSP430i SD24 내장 온도센서 테스트 코드
void main(void)
{
unsigned int cnt = 0;
    SystemInit();

Led1Init();
Led1On();

U0_Init(BAUD_57600);
DebugPrint("MSP430 ADC Test\r\n");
    
    
    ADC_Init();

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

    while(1) {
        SD24CCTL0 |= SD24SC;                    // Set bit to start conversion
        __bis_SR_register(LPM0_bits | GIE);     // Enter LPM0 w/ interrupts
        __no_operation();                       // For debugger

        // Calculate Temperatures in different scales
        results[1] = ((unsigned long)results[0] * 1200)/70711;
        results[2] = results[1] - 273 + TEMP_OFFSET;
        DebugPrint("%d\n", results[2]);
        Delay(1000); 
        __no_operation();                       // SET BREAKPOINT HERE
    }
}



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430i2015. 6. 7. 22:30

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정도 흔들린다.

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



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430i2015. 6. 7. 17:00

MSP430i2041 - 시리얼 통신 테스트

MSP430i2041 - 시리얼 통신 테스트




MSP430i 시리즈의 코어는 MSP430코어 이므로 전체 코드에서는 크게 달라질 사항이 없지만 테스를 위해 가장 먼저 시리얼 통신부터 연결해서 테스트 해 보도록 하자.


MSP430i시리즈이 UART는 MSP430AFE 시리즈와 거의 유사 하지만 새로운라인업이 추가되고 컴파일러가 업그레이드 되면서 레지스터 명이 많이 변경되어 코드 자체는 호환이 안되는것 같다. 





약간의 수정을 하면 기존 코드와 호환해서 사용가능하다.


MSP430i2041 UART 초기화 코드

void U0_Init(unsigned char baud)

{

    P1SEL0 |=   BIT2 | BIT3;            // P1.2/3 eUSCI_A Function

    P1SEL1 &= ~(BIT2 | BIT3);


    UCA0CTL1 |= UCSWRST;                // Hold eUSCI in reset

    UCA0CTL1 |= UCSSEL_2;               // SMCLK

    UCA0BR0   = 142;                    // 115200 baud

    UCA0BR1   = 0;

    UCA0MCTLW = 0x2200;                 // 16.384MHz/115200 = 142.22 (See UG)

    UCA0CTL1 &= ~UCSWRST;               // Release from reset

}





MSP430i2041 UART 송수신 코드

#define TXBUF0          UCA0TXBUF  

#define RXBUF0          UCA0RXBUF



void U0_PutByte(unsigned char Data)

{

    

    //while (!(U0TCTL & TXEPT));

    while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?

    TXBUF0 = Data;

}


unsigned char U0_GetByte(void)

{

    //while(!(IFG1 & URXIFG0));

    while (!(UCA0IFG&UCRXIFG));

    return RXBUF0;

}




MSP430i2041 UART 테스트 예제 코드

#include "system.h"

#include "serial.h"


void main(void)

{

unsigned int cnt = 0;

    SystemInit();

Led1Init();

Led1On();


U0_Init(BAUD_115200);

DebugPrint("MSP430i Serial Test\r\n");

while(1)

{

if(U0_IsGetByte())

{

  switch(U0_GetByte())

  {

  case '+':

  DebugPrint("Cnt=%d\r\n", cnt++);

  break;

 

case '-':

DebugPrint("Cnt=%d\r\n", cnt--);

break;  

  }

}

Led1Toggle();

Delay(200);

}








Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430i2015. 6. 7. 02:30

MSP430i - 개발환경설정 (IAR Embedded Workbench Kickstart)

MSP430i - 개발환경설정 (IAR Embedded Workbench Kickstart)





MSP430i 시리즈를 사용하려면 최신의 컴파일러가 필요하다. CCS, IAR 모두 가능하고 IAR의 경우 TI에서 제공하는 무료 버전을 이용하면 8kByte 까지 지원 가능하다.


IAR-KICKSTART:
IAR-KICKSTART FOR MSP430

http://supp.iar.com/Download/SW/?item=EW430-EVAL



최신의 IAR(Version 6.30.2)은 기존의 IAR설정 방법과 동일하며 디바이스 타입에서 MSP430i2041 로 설정 해 주면 된다.

(참고로 예전 버전에서는 다운로드가 되지 않는다. 특히 ez-430과 같은 USB-FET 에서 지원을 하지 하지 않고 있다.)




그리고 기존 코드에서 config.h에서 헤더파일만 수정해 주면 문제 없이 컴파일 가능하다.

#include  <MSP430i2041.h>

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430i2015. 6. 6. 13:00

[MSP430i] MSP430I2040 EVM 보드 제작

[MSP430i] MSP430I2040 EVM 보드 제작







MSP430코어에 24bit ADC를 내장하고 저렴한 MSP430i 시리즈를 표준 핀맵인 s-Type 형태로 제작 했다. 산업용이며 저전력 에너지 미터링을 타깃으로 출시 되었는데.. 소형이라 여러가지 어플리케이션에 적용하기 좋을것 같다.

24bit ADC를 내장한 MCU 시리즈로 성능이 많이 개선되었다고 한다.  





표준 핀맵을 사용하여 기존 여러가지 인터페이스 보드에 연결해서 쉽게 테스트 할 수 있도록 제작 했다.




[MSP430i EVM] 회로도






Posted by nexp

댓글을 달아 주세요