[MSP430]/MSP430_FRAM2013. 5. 18. 21:00

MSP430FR5739 EVM - ADC테스트 (전압값에 따라 게이지 그래프 표시 하기)

MSP430FR5739 EVM - ADC테스트 (전압값에 따라 게이지 그래프 표시 하기)

 


ADC10_B features include:

- Greater than 200-ksps maximum conversion rate

- Monotonic 10-bit converter with no missing codes

- REF Module 1.5V, 2V and 2.5V

- Sample-and-hold with programmable sampling periods controlled by software or timers

- Conversion initiation by software or different timers

- Software-selectable on chip reference using the REF module or external reference

- Twelve individually configurable external input channels

- Conversion channel for temperature sensor of the REF module

- Selectable conversion clock source

- Single-channel, repeat-single-channel, sequence, and repeat-sequence conversion modes

- Window comparator for low-power monitoring of input signals

- Interrupt vector register for fast decoding of six ADC interrupts (ADC10IFG0, ADC10TOVIFG,

ADC10OVIFG, ADC10LOIFG, ADC10INIFG, ADC10HIIFG)




MSP430FR5739 ADC 블록도




MSP430FR5739 ADC 초기화 함수

ADC에 사용할 포트를 설정하고 레퍼런스 및 해상도를 설정할 수 있다.

 // Sampling and conversion start

#define ADC_Start()               (ADC10CTL0 |= ADC10ENC + ADC10SC);       


void AdcInit()

{

    // Configure ADC

    P3SEL1 |= BIT0; 

    P3SEL0 |= BIT0; 

  

    ADC10CTL0 |= ADC10SHT_2 + ADC10ON;        // ADC10ON, S&H=16 ADC clks

    ADC10CTL1 |= ADC10SHP;                    // ADCCLK = MODOSC; sampling timer

    ADC10CTL2 |= ADC10RES;                    // 10-bit conversion results

    ADC10MCTL0 |= ADC10INCH_12;                // A1 ADC input select; Vref=AVCC

    ADC10IE |= ADC10IE0;                      // Enable ADC conv complete interrupt 

}


 

ADC 제어 레지스터 - 채널 설정


 

 

MSP430FR5739 ADC 테스트 동영상

 


MSP430FR5739 ADC 테스트 예제코드

unsigned int ADC_Result;


//-----------------------------------------------------------------------------

void main(void)

{

    unsigned int cnt = 0;


    SystemInit();

    

    Led1Init();

    Led1On();

//Serial Init

DebugInit(BAUD_115200);

DebugPrint("ADC Test Program.\r\n");


AdcInit();

    while(1)

    {

        __delay_cycles(5000);

        ADC_Start();        // Sampling and conversion start

        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit

        __no_operation();


        DebugPrint("adc=%d\r\n", ADC_Result);

    }

}

//-----------------------------------------------------------------------------





// ADC10 interrupt service routine

#pragma vector=ADC10_VECTOR

__interrupt void ADC10_ISR(void)

{

  switch(__even_in_range(ADC10IV,12))

  {

    case  0: break;                          // No interrupt

    case  2: break;                          // conversion result overflow

    case  4: break;                          // conversion time overflow

    case  6: break;                          // ADC10HI

    case  8: break;                          // ADC10LO

    case 10: break;                          // ADC10IN

    case 12: ADC_Result = ADC10MEM0;         

             __bic_SR_register_on_exit(CPUOFF);                                              

             break;                          // Clear CPUOFF bit from 0(SR)                         

    default: break; 

  }  

}



Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 5. 1. 20:30

EFM32G210 EVM - ADC 테스트 (Potentiometer 값을 TFT LCD 그래프로 표시하기)

EFM32G210 EVM - ADC 테스트 (Potentiometer 값을 TFT LCD 그래프로 표시하기)



EFM32G210은 8개의 12bit ADC포트가 있고 1개의 온도센서가 내장되어 있다. 

EFM32 ADC의 특징은 아래와 같다.

Ultra low power precision analog peripherals

 - 12-bit 1M samples/s Analog to Digital Converter

 - 4 single ended channels/2 differential channels

 - On-chip temperature sensor

 - Conversion tailgating for predictable latency



EFM32 ADC 블록도

 

 

 

EFM32G210f128 ADC 핀맵



EFM32 ADC 테스트 동영상

EFM32에 연결된 가변저항(Potentiometer) 값을 TFT LCD의 그래프로 표시하는 예제





EFM32 ADC 초기화 함수

void AdcInit(unsigned int Channel)

{

  ADC_Init_TypeDef init = ADC_INIT_DEFAULT;

  ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT;

SYSTEM_ChipRevision_TypeDef chipRev;

/* ADC errata for rev B when using VDD as reference, need to multiply */

/* result by 2 */

SYSTEM_ChipRevisionGet(&chipRev);

if ((chipRev.major == 1) && (chipRev.minor == 1))

{

errataShift = 1;

}

  

CMU_ClockEnable(cmuClock_ADC0, true);

/* Init common issues for both single conversion and scan mode */

init.timebase = ADC_TimebaseCalc(0);

/* Might as well finish conversion as quickly as possibly since polling */

/* for completion. */

init.prescale = ADC_PrescaleCalc(7000000, 0);

/* WARMUPMODE must be set to Normal according to ref manual before */

/* entering EM2. In this example, the warmup time is not a big problem */

/* due to relatively infrequent polling. Leave at default NORMAL, */

ADC_Init(ADC0, &init);


/* Init for single conversion use. */

singleInit.reference = adcRefVDD;

singleInit.input = Channel; /* According to DVK HW design */

singleInit.resolution = adcRes8Bit; /* Use at least 8 bit since unlinear voltage */

ADC_InitSingle(ADC0, &singleInit);

}




EFM32 ADC Read 함수

//Read ADC Value

unsigned int AdcRead(unsigned char port)

{

    ADC_IntClear(ADC0, ADC_IF_SINGLE);

    ADC_Start(ADC0, adcStartSingle);


    /* Wait for completion */

    while (!(ADC_IntGet(ADC0) & ADC_IF_SINGLE));

    return ADC_DataSingleGet(ADC0) << errataShift;

}



Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC24F2013. 1. 12. 23:30

[PIC24F16KA EVM] ADC 테스트 - TSL251 Light to Voltage Converter

[PIC24F16KA EVM] ADC 테스트 - TSL251 Light to Voltage Converter

 

 

PIC24F16KA는 500ksps 10bit ADC를 내장하고 있다.

하드웨어적으로 약간의 차이는 있지만 코드는 dsPIC33 ADC 테스트와 거의 호환이 된다.

 

 

 

 

PIC24F ADC 테스트 동영상

PIC24의 ADC는 10bit이고 광센서 TSL251 Light to Voltage Converter를 이용해서 ADC값을 출력해 보았다.

LX1971 센서와 비교해서 광센서의 성능차이도 확이해 볼 수 있다.

 

 

 

 

PIC24F ADC 초기화코드

void AdcInit(void)
{
 //ADCON1 레지스터 설정
 AD1CON1bits.SAMP = 0;  //ADC 샘플/홀드 홀딩
 AD1CON1bits.ASAM = 1;  //ADC 변환 즉시 샘플링 시작 설정
// AD1CON1bits.SIMSAM=0;  //순서대로 멀티플 채널 샘플 설정
 AD1CON1bits.SSRC = 7;  //샘플 클럭 설정: 내부 카운터 샘플링 끝나고 변환시작
 AD1CON1bits.FORM = 0;  //데이터 출력 형식: Integer

 //AD1CON2 레지스터
 AD1CON2bits.CSCNA=0;  //CH0+ 입력에 대한 스캔 입력 설정: Scan inputs
 AD1CON2bits.VCFG = 0;  //AD변환 기준 전압 설정: Vreg+ = Vdd, Vreg- = Vss

 //AD1CON3 레지스터
 AD1CON3bits.ADCS = 0x3F; //ADC 변환 클럭 설정 : 최대치 설정
        //Tad=Tcy*(ADCS+1)=(1/40M)*64 = 1.6us (625KHz)
        //10비트 ADC 변환 시간 Tc = 12*Tad = 19.2us (52KHz)
 AD1CON3bits.SAMC=31;   //Auto Sample Time = 31*Tad
 AD1CON3bits.ADRC=0;   //ADC Clock을 시스템 클럭 사용 설정

 //AD1CHS0 레지스터 :
// AD1CHS0=0;     //디폴트 값

 //AD1CSSL 레지스터 : AN0 ~ AN15 아날로그 입력 핀 설정
 AD1CSSL = 0;
  Sbi(AD1CSSL, BIT0);  //AN0 ~ AN1 AD 입력 핀 설정


 //ADC1 인터럽트 설정  
 IFS0bits.AD1IF = 0;   //ADC1 인터럽트 플래그 클리어
 IEC0bits.AD1IE = 0;   //ADC1 인터럽트 시작 설정

 //ADC1 컨버터 동작 개시 설정
 AD1CON1bits.ADON = 1;  //ADC1 컨버터 동작
}

 

 

#define adc_WaitForCoversion()    while(!AD1CON1bits.DONE)
#define adc_GetData()       (ADC1BUF0)
#define adc_SetChannel(Ch)     //AD1CSSL = ~(Ch);AD1PCFGL = (Ch); 
#define adc_Run()       AD1CON1bits.SAMP = 0;

 

 

//Read ADC Value
unsigned int AdcRead(unsigned char Channel)
{
 adc_SetChannel(Channel);
 adc_Run();

 adc_WaitForCoversion();

 return adc_GetData();
}

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_AFE2012. 6. 19. 11:26

[MSP430AFE] 24bit ADC MSP430

[MSP430AFE] 24bit ADC MSP430

MSP430 코어에 24bit ADC가 포함된 MSP430AFE시리즈가 출시되었다. 저전력 저비용 계측 솔루션으로 사용하면 좋을것같다.

 

- 2400:1 동작 범위에서 우수한 0.1% 오차의 정밀성을 지원하는 싱글-페이즈 계측 아날로그 프론트 엔드 
- 싱글-페이즈 계측 및 무단조작 방지를 위해 동시 샘플링 기능을 가진 세 개의 24bit 시그마-델타 ADC(analog-to-digital converters)

- 최적의 공간 절약형 소형 24 핀 TSSOP 패키지

 

 

msp430afe253.pdf

 

 

 

 

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2012.10.21 16:30 [ ADDR : EDIT/ DEL : REPLY ]

[AVR]/AT90USB2012. 1. 23. 23:40

[AT90USB1287-EX] 기본 테스트 - ADC (광센서 테스트)

[AT90USB1287-EX] 기본 테스트 - ADC (광센서 테스트)


[AT90USB1287-EX] 보드에는 ADC를 테스트 할 수 있는 CdS센서가 ADC2에 연결되어 있다.





AT90USB1287의 ADC는 확장포트 CN36에 모두 연결되어 있으므로 기타 ADC나 GPIO로 사용가능하다.






AT90USB1287 ADC 드라이버 코드
ATMega128과 다르게 ADCSR레지스터 명이 다르므로 수정이 필요하다.
//Read ADC Value
unsigned int AdcRead(unsigned char port)
{
 unsigned int value = 0;

 ADMUX = port&7;
 ADC_SR |= ADC_START_CONVERSION;

 while(!(ADC_SR & ADC_COMPLETE));

 value = ADCL;
 value = (ADCH<<8) | value;

 return value;
}



AT90USB1287 ADC 테스트 예제 소스 코드
#include "system.h"
#include "serial.h"
#include "adc.h"

int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1On();

 Led2Init();
 Led2On();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("[AT90USB1287-EX] Test Program - ADC\r\n");

 //ADC 초기화
 AdcInit();

 while(1)
 {
  DebugPrint("ADC=%d\r\n", AdcRead(2));
  Delay(100);
 }
}


Posted by nexp

댓글을 달아 주세요