AD8275 level translator/ADC driver - ±10 V Analog Front End Signal Conditioner




https://www.element14.com/community/docs/DOC-53765/l/analog-devices-cn0225-reference-design-for-high-impedance-high-cmr-10-v-analog-front-end-signal-conditioner-for-industrial-process-control-and-automation



저작자 표시 비영리 변경 금지

MSP432 EVM - ADC 테스트 (ADC14)




MSP432 는 MSP430과 달리 14비트 ADC를 가지고 있다. 최대 24채널 까지 입력 가능하다.


MSP432 ADC14 특징

14-bit Accuracy

INL <= +/- 2  LSB; 

DNL <= +/- 1 LSB

ENOB 13-bit

32-input channels

Single-ended & differential Inputs 


2 Window comparators 

High interrupt

Low interrupt

In [Between] interrupt


Separate internal channels for AVcc and TempSensor

Ultra Low current consumption

Single ended 210uA @ 1.8V, 1Msps 

Differential 260uA @ 1.8V, 1Msps


Generates voltage references for analog modules
1.2V, 1.45V, 2.5V



MSP432 ADC 블록도




Window Comparator

MSP432 ADC14의 기능중 Window Comparator 가 있는데 설정 값에 따라서 하드웨어 적으로 인터럽트를 발생 해 주기 때문에 소프트웨어 적인 부담이 많이 줄일 수 있다.




// ADC14 interrupt service routine

void ADC14IsrHandler(void) {

    if (ADC14IFGR1 & ADC14HIIFG)

    {

        ADC14CLRIFGR1 |= ADC14HIIFG;            // Clear interrupt flag


    }

    if (ADC14IFGR1 & ADC14LOIFG)

    {

        ADC14CLRIFGR1 |= ADC14LOIFG;            // Clear interrupt flag

    }

    if (ADC14IFGR1 & ADC14INIFG)

    {

        ADC14CLRIFGR1 |= ADC14INIFG;            // Clear interrupt flag

    }

}






MSP432 14bit ADC(ADC14) 초기화 코드
void ADC_Init(void)
{
    MAP_PCM_setPowerState(PCM_AM_LDO_VCORE1);
  
    /* Enabling the FPU for floating point operation */
    MAP_FPU_enableModule();
    MAP_FPU_enableLazyStacking();

    /* Initializing ADC (MCLK/1/4) */
    MAP_ADC14_enableModule();
    MAP_ADC14_initModule(ADC_CLOCKSOURCE_MCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_4, 0);
            
    /* Configuring GPIOs (5.0 A5) */
    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN0,
    GPIO_TERTIARY_MODULE_FUNCTION);

    /* Configuring ADC Memory */
    MAP_ADC14_configureSingleSampleMode(ADC_MEM0, true);
    MAP_ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_AVCC_VREFNEG_VSS,
    ADC_INPUT_A5, false);
    

    /* Configuring Sample Timer */
    MAP_ADC14_enableSampleTimer(ADC_MANUAL_ITERATION);

    /* Enabling/Toggling Conversion */
    MAP_ADC14_enableConversion();
    MAP_ADC14_toggleConversionTrigger();

    /* Enabling interrupts */
    MAP_ADC14_enableInterrupt(ADC_INT0);
    MAP_Interrupt_enableInterrupt(INT_ADC14);
    MAP_Interrupt_enableMaster();
}


MSP432 14bit ADC(ADC14) 결과 처리 인터럽트 코드

void ADC14_IRQHandler(void)

{

    uint64_t status = MAP_ADC14_getEnabledInterruptStatus();

    MAP_ADC14_clearInterruptFlag(status);


    if (ADC_INT0 & status)

    {

        curADCResult = MAP_ADC14_getResult(ADC_MEM0);

        normalizedADCRes = (curADCResult * 3.3) / 16384;


        gAdcValue = curADCResult;

        MAP_ADC14_toggleConversionTrigger();

    }

}




MSP432 ADC 테스트 동영상

가변저항의 전압값을 TFT-LCD 그래프로 출력 하는 예제




MSP432 ADC포트 핀맵

포트와 ADC채널이  동일하지 않기 때문에 정리 해둘 필요가 있다.



저작자 표시 비영리 변경 금지

MSP432 EVM - UART 테스트

[MSP430]/MSP432 | 2016.05.07 20:00
Posted by nexp

MSP432 EVM - UART 테스트





MSP43는 총 4개의 UART를 가지고 있다.

MSP432 EVM의 UART는 EUSCI_A0_BASE의 P1.2->RXD, P1.3->TXD 에 할당이 되어 있다.



MSP432의 보레이트 설정은 MSP430 보레이트 계산기를 이용하면 동일하게 설정 가능하다.

http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/



MSP432 UART 초기화 설정 코드


const eUSCI_UART_Config uartConfig =

{

        EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source

        13,                                      // BRDIV = 13

        0,                                       // UCxBRF = 0

        37,                                      // UCxBRS = 37

        EUSCI_A_UART_NO_PARITY,                  // No Parity

        EUSCI_A_UART_MSB_FIRST,                  // MSB First

        EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit

        EUSCI_A_UART_MODE,                       // UART mode

        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // Oversampling

};



    /* Selecting P1.2 and P1.3 in UART mode */

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);


    /* Setting DCO to 24MHz (upping Vcore) */

    FlashCtl_setWaitState(FLASH_BANK0, 2);

    FlashCtl_setWaitState(FLASH_BANK1, 2);

    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);


    /* Configuring UART Module */

    MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);


    /* Enable UART module */

    MAP_UART_enableModule(EUSCI_A0_BASE);





MSP432 UART 송수신 함수 코드 

unsigned char U0_GetByte(void)

{

    unsigned char  temp = 0;

    temp = MAP_UART_receiveData(EUSCI_A0_BASE);


    return temp;

}


void U0_PutByte(unsigned char Data)

{

    MAP_UART_transmitData(EUSCI_A0_BASE, Data);

}




저작자 표시 비영리 변경 금지

MSP432 EVM - TIMER32 테스트

[MSP430]/MSP432 | 2016.05.07 16:30
Posted by nexp

MSP432 EVM - TIMER32 테스트



기존 MSP430을 사용하면서 아쉬웠던 점은 16비트 코어 이므로 타이머나 long 타입 처리 드이 아쉬웠는데 MSP432의 새로운 기능으로 32비트 타이머가 있어 유용할 것 같다.



MSP432 타이머 초기화 함수

  TIMER32-> rCONTROL1.b.bMODE = 0; // 프리 런 

  TIMER32-> rCONTROL1.b.bIE = 1; // 인터럽트 비활성화 

  TIMER32-> rCONTROL1.b.bPRESCALE = 2; // 분주 / 256    

  TIMER32-> rCONTROL1.b.bSIZE = 0; // 16bit 

  TIMER32-> rCONTROL1.b.bONESHOT = 0; // Wrapping mode   

  TIMER32-> rCONTROL1.b.bENABLE = 1; // Timer를 사용     

  NVIC_ISER0 | = 1 << 25;     

  __enable_interrupt ();




MSP432 인터럽트 핸들러

void T32_1_Handler(void ) 

{

  gTimeTick_1++;


  TIMER32_INTCLR1=0x1;

}



저작자 표시 비영리 변경 금지

MSP432 성능 테스트 - GPIO토글

[MSP430]/MSP432 | 2016.05.06 18:06
Posted by nexp

MSP432 성능 테스트 - GPIO토글



MSP432는 Cortex-M4 코어의 최대 48Mhz로 동작하는 저전력 MCU이다. 단순 비교는 의미 없기는 하지만 간단히 GPIO토글 속도로 성능 테스트를 진행 해 보았다.



MSP432의 CPU성능 테스트를 위해 TI에서 제공하는 기본 MSP432 GPIO 토글 예제를 구동해 보았다.


MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN6);


GPIO토글 속도는 16khz로 측정 된다.

너무 느리다.

MSP432 클럭 설정을 좀 들여다 볼 필요가 있을것 같다.



MSP432는 10kHz ~ 48Mhz로 구동 가능하고 2개의 외부 클럭과, 5개의 내부 클럭 소스로 구성된다.



MSP432의 클럭 소스

LFXTCLK 외부 클럭 Low-frequency oscillator (LFXT)에서 32768Hz 등을 이용 가능 (32kHz 이하 주파수)

VLOCLK 내부 클럭 : 10KHz 정도의 VLO (Very low power low frequency oscillator) 시계

REFOCLK 내부 클럭 : 32k 또는 128KHz의 REFO (low-power low-frequency oscillator) 시계

DCOCLK 내부 클럭 : DCO (digitally controlled oscillator) 클럭 주파수 선택 가능

MODCLK 내부 클럭 : 24MHz의 low-power oscillator

HFXTCLK 외부 클럭 : 고속 클럭 HFXT (High-frequency oscillator) 1MHz ~ 48MHz 범위

SYSOSC 내부 클럭 : 5MHz






물론 클럭 별로 파워 선택이 필요하고 제약사항도 따른다. 최대한의 저전력 구동을 위해 이런 구조가 된것 같지만 개발자는 신경 써야 할 부분이 많아 져서 부담으로 다가올것 같다.







우선 클럭 속도를 좀더 올리기 위해 코드 수정이 필요한데

system_msp432p401r.c

파일에서 설정 가능하다.


48Mhz로 설정해서 구동해 보자.

//  CPU Frequency

//     <1500000> 1.5 MHz

//     <3000000> 3 MHz

//     <12000000> 12 MHz

//     <24000000> 24 MHz

//     <48000000> 48 MHz


//#define  __SYSTEM_CLOCK    1500000


#define  __SYSTEM_CLOCK    48000000



48Mhz 설정하고 GPIO 토글 속도를 측정해 보면

1Mhz

로 측정된다.


   127                  MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN6);

   \                     ??main_1: (+1)

   \   00000014   0x2140             MOVS     R1,#+64

   \   00000016   0x2007             MOVS     R0,#+7

   \   00000018   0x.... 0x....      BL       GPIO_toggleOutputOnPin

   \   0000001C   0xE7FA             B.N      ??main_1

   \   0000001E   0xBF00             Nop      

   \                     ??main_0:

   \   00000020   0x02000864         DC32     0x2000864




TI제공 함수를 이용하지 않고 레제스터 직접 제어 해 보았다.

2Mhz

로 측정된다.

다른 회사의 Cortex-M4 코어에 있는 GPIO토글 레지스터가 있으면 좋을것 같은데... 

#define OFS_LIB_PAOUT   ((uint32_t)&P1->OUT - (uint32_t)P1)

#define PORT7           ((uint32_t)P7 + OFS_LIB_PAOUT)  



       98                  HWREG16(PORT7) ^= GPIO_PIN6;


   \                     ??main_1: (+1)

   \   00000016   0x8801             LDRH     R1,[R0, #+0]

   \   00000018   0xF081 0x0140      EOR      R1,R1,#0x40

   \   0000001C   0x8001             STRH     R1,[R0, #+0]

   \   0000001E   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   00000020   0x02000864         DC32     0x2000864

   \   00000024   0x40004C62         DC32     0x40004c62



토글 하지 않고 직접 On/Off를 반복해서 측정 해 보니 

12Mhz로 측정이 된다.


와 비교해 보면 비슷한것 같은데... 저전력 기능을 감안하면 성능면에서는 나쁘지 않은것 같다.


저작자 표시 비영리 변경 금지

블로그 이미지

nexp

카테고리

분류 전체보기 (1511)
[MyProject] (42)
[TI] (75)
[NXP] (50)
[ST_MICRO] (118)
[FreeScale] (30)
[MSP430] (130)
[Microchip] (123)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (49)
[INTERFACE] (210)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (126)
[SENSOR] (41)
[DATA] (21)
[FPGA/PLD] (29)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)

티스토리 툴바