[MODULE]/AD/DA2018. 2. 25. 07:07

Analog Devices 16Bit ADC AD7606 테스트

Analog Devices 16Bit ADC AD7606 테스트



RESET 핀

Reset Input. When set to logic high, the rising edge of RESET resets the AD7606/AD7606-6/AD7606-4. The device should receive a RESET pulse directly after power-up. The RESET high pulse should typically be 50 ns wide. If a RESET pulse is applied during a conversion, the conversion is aborted. If a RESET pulse is applied during a read, the contents of the output registers reset to all zeros.






클럭 나오는것 까지 확인 

AD쪽에 +-15V가 필요하다



AD7606 핀맵 정의


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

//ADC AD7606 Driver

#define AD7606_CS_HI()       (LATD |= BIT0)

#define AD7606_CS_LO()       (LATD &= ~BIT0)


#define AD7606_RST_HI()       (LATD |= BIT1)

#define AD7606_RST_LO()       (LATD &= ~BIT1)


#define AD7606_START_HI()       (LATD |= BIT2)

#define AD7606_START_LO()       (LATD &= ~BIT2)


#define AD7606_CS_INIT()     (TRISD &= ~BIT0)

#define AD7606_RST_INIT()    (TRISD &= ~BIT1)

#define AD7606_START_INIT()    (TRISD &= ~BIT2)

#define AD7606_SPI_INIT         SPI1_Init

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





AD7606 Data Read 코드


void AD7606_ReadBuf(short *pBuff)

{

    AD7606_START_LO();

     Delay_Us(10);

     AD7606_START_HI();


     AD7606_CS_LO();

     pBuff[0] = SPI1_WriteReadByte(0);

     pBuff[0] |= SPI1_WriteReadByte(0)<<8;


     pBuff[1] = SPI1_WriteReadByte(0);

     pBuff[1] |= SPI1_WriteReadByte(0)<<8;


     pBuff[2] = SPI1_WriteReadByte(0);

     pBuff[2] |= SPI1_WriteReadByte(0)<<8;


     pBuff[3] = SPI1_WriteReadByte(0);

     pBuff[3] |= SPI1_WriteReadByte(0)<<8;

     

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

     pBuff[4] = SPI1_WriteReadByte(0);

     pBuff[4] |= SPI1_WriteReadByte(0)<<8;


     pBuff[5] = SPI1_WriteReadByte(0);

     pBuff[5] |= SPI1_WriteReadByte(0)<<8;


     pBuff[6] = SPI1_WriteReadByte(0);

     pBuff[6] |= SPI1_WriteReadByte(0)<<8;


     pBuff[7] = SPI1_WriteReadByte(0);

     pBuff[7] |= SPI1_WriteReadByte(0)<<8;      

     AD7606_CS_HI();

}


Posted by nexp
TAG AD7606, ADC

댓글을 달아 주세요

[TI]/TM4C2014. 8. 10. 14:10

TM4C123 - ADC 테스트

TM4C123 - ADC 테스트




TM4C123에는 독릭적으로 동작하는 2개의 12비트 ADC가 있고 16채널 입력이 가능하다.

아래 그림과 같이 각각 인터럽트 처리 가능하고 트리거 입력 받을수 있다.



요즘 MCU들은 대부분 하드웨어 필터를 내장하고 있는데...  TM4C123은 하드웨어 평균필터 (Hardware averaging of up to 64 samples) 가 있다. 성능은 좀더 들여야 봐야 하겠지만 약간은 아쉬운 부분이 아날로그 파트인것 같다.





TM4C123 ADC 블록도

4개의 FIFO와 Sample Sequencer이 있다.

[TM4C123 EVM] 보드에서 ADC0는 PE3 에 연결되어 있고 원하는 ADC 채널 및 Sequencer에서 AD결과값을 읽어올 수 있다.



TM4C123에는 4개의 Sample Sequencer이 있고 아래과 같이 1~8 스텝을 설정 할 수가 있다.





TM4C123 ADC 테스트 예제

 4개의 Sample Sequencer가 있기 때문에 다채널 ADC입력 받을경우 상당히 편리하게 처리할 수 있다.


//sample sequence 1 에 steps 0, 1 , 2를 설정

ADCSequenceStepConfigure(ADC_BASE, 1, 0, ADC_CTL_CH0);

ADCSequenceStepConfigure(ADC_BASE, 1, 1, ADC_CTL_CH1);

ADCSequenceStepConfigure(ADC_BASE, 1, 2, ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END)


//sample sequence 3에  step 0를 설정

ADCSequenceStepConfigure(ADC_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_END);




TM4C123 ADC 핀맵

12개의 ADC입력 채널이 아래와 같이 할당되어 있다.




TM4C123 ADC 초기화 함수

// Function Routine

//ADC Initialize

void AdcInit(void)

{

    //ADC enable 

    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);


    //ADCProcessorTrigger()에서 ADC 시작. 프로세서 트리거가 일어날때 작동한다.   

    ADCSequenceConfigure(ADC0_BASE, SEQUENCE_NUM, ADC_TRIGGER_PROCESSOR, 0);

    

    //ADC0의 sequence를 구성한다.sequence number 0인 ADC를 single ended mode로 setting   

    ADCSequenceStepConfigure(ADC0_BASE, SEQUENCE_NUM, 0, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH0);       


    //ADC를 사용 가능하게 해준다.   

   ADCSequenceEnable(ADC0_BASE, SEQUENCE_NUM);  

   ADCIntClear(ADC0_BASE, SEQUENCE_NUM);

}



TM4C123 ADC 데이터 읽기

//Read ADC Value

unsigned long AdcRead(unsigned char port)

{

unsigned long adc_result[NUM_OF_ADC];

ADCProcessorTrigger(ADC0_BASE, SEQUENCE_NUM);   


//sample sequence 가 완료될때 까지 대기한다.   

while(!ADCIntStatus(ADC0_BASE, SEQUENCE_NUM, false)){}  

    ADCIntClear(ADC0_BASE, SEQUENCE_NUM);


//ADC  Data Read

    ADCSequenceDataGet(ADC0_BASE, SEQUENCE_NUM, &adc_result);

return adc_result[port];

}




TM4C123 ADC 하드웨어 필터 설정


// Enable 8x hardware averaging

ADCHardwareOversampleConfigure(ADC_BASE, 8);





TM4C123 ADC - 온도 센서

TM4C123 칩내부에 온도 센서가 내장되어 있고 이를 이용하여 온도 측정을 할수 있다. 

온도 센서에서 온도 값을 구하는 식은 아래와 







        ADCIntClear(ADC0_BASE, 1);

        ADCProcessorTrigger(ADC0_BASE, 1);

        while(!ADCIntStatus(ADC0_BASE, 1, false))

        {

        }

        ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value);

        ui32TempAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4;

        ui32TempValueC = (1475 - ((2475 * ui32TempAvg)) / 4096)/10;

        ui32TempValueF = ((ui32TempValueC * 9) + 160) / 5;

        

        DebugPrint("AIN0 = %d, %d\r", ui32TempAvg, ui32TempValueC);

        

        Led1On();

        Delay(300);

        Led1Off();

        Delay(300);   




Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 9. 14:01

M052LBN EVM - NUVOTON 12bit ADC 테스트

M052LBN EVM - NUVOTON  12bit ADC 테스트



NUVOTON M051 시리즈 ADC는 최대 12비트해상도 이고 특이사항으로 5V까지 측정 가능하다.


- 입력레인지 : 0~5V

- 10bit 12bit, 해상도

- 8채널 싱글, 4채널 differenctial

- 760kSPS (16Mhz)




M052LBN ADC 블록도




M052LBN ADC 초기화 코드

void ADCInit( void)

{

    SYS_UnlockReg();

    /* Enable ADC module clock */

    CLK_EnableModuleClock(ADC_MODULE);

    /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */

    CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));

    

 

    //ADC 포트 설정

    GPIO_DISABLE_DIGITAL_PATH(P1, BIT0);


    SYS->P1_MFP &= ~(SYS_MFP_P10_Msk);

    SYS->P1_MFP |= SYS_MFP_P10_AIN0;

    SYS_LockReg();

}



M052LBN ADC Read 코드

nsigned int ADCRead( unsigned int channelNum )

{

    ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE_CYCLE, BIT0<<channelNum);


    /* Power on ADC module */

    ADC_POWER_ON(ADC);


    /* clear the A/D interrupt flag for safe */

    ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);


    /* start A/D conversion */

    ADC_START_CONV(ADC);


    /* Wait conversion done */

    while(!ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));


    return ADC_GET_CONVERSION_DATA(ADC, channelNum);    

}




M052LBN ADC 테스트 코드

int main(void)

{

    _SystemInit();

    

    Led1Init();

    Led1On();


    Led2Init();

    Led2On();

    

    //Serial Init

    DebugInit(BAUD_115200);

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

    

    //ADC 초기화

    ADCInit();


    while(1)

    {

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

        Led1Toggle();

        Delay(300);

    }

}




M052LBN ADC 테스트 동영상

NUVOTON M052LBM 의 ADC Ch0에 연결되어 있는 VR의 전압값을 TFT-LCD 그래프로 표시하는 테스트


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM82014. 5. 5. 21:30

STM8S - ADC 테스트

STM8S - ADC 테스트




STM8S 는 10bit SAR ADC가 내장되어 있고 fADC = 1 to 4 or 6 MHz 로 동작한다.


STM8S003F3 의 경우 VREF는 VDD이다. 저렴한 만큼 ADC의 성능은 기대할 수준은 아닌것 같다.

LPC812와 같이 ADC없는것 보다는 나은것 같다.



STM8S ADC 블록도

STM8S003F3에서 ADC관련 핀맵은 아래와 같고 UART를 제외 하면 실제 2채널을 할당 할 수 있다.

STM8-SS EVM에서는 ADC가 PD2/AIN3에 연결되어 있다. ADC테스트는 가변저항에 따라 변화되는 ADC값을 LCD에 표시하는 예제를 작성해 보았다.


PD2(HS)/AIN3

PD3 (HS)/AIN4/TIM2_CH2/ADC_ETR


PD5(HS)/AIN5/UART1_TX

PD6(HS)/AIN6/UART1_RX

PB4/[ADC_ETR] I2C_SCL




ADC결과는 10bit ADC이지만 Alignment Mode로 좀더 유연하게 제어할 수 있다.





STM8S ADC 초기화 함수

void AdcInit(unsigned int AD_Chan)

{

ADC1_DeInit();

ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2, \

ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3,\

DISABLE);

ADC1_Cmd(ENABLE);

}



STM8S ADC Read 함수

unsigned int AdcRead(unsigned char port)

ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH);

ADC1->CSR |= port;

ADC1_StartConversion();

while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC));

ADC1_ClearFlag(ADC1_FLAG_EOC);

    return ADC1_GetConversionValue();

}



Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 6. 21:00

dsPIC33E - ADC 테스트

dsPIC33E - ADC 테스트

dsPIC 은 10/12bit SAR ADC로 변환 속도는 최대 1.1Msps 이다. dsPIC33E에서는 약간의 변화가 있었는데 레지스터 맵이 조금 변경되어 기존코드의 수정이 필요 하다.

dsPIC33E ADC블록도
가장 큰 변화는 ADC1BUF가 FIFO형태로 변경된것 같다.



dsPIC33E ADC초기화 코드
//------------------------------------------------------------------------------
// Function Routine
//ADC Initialize
void AdcInit(void)
{
//ADCON1 레지스터 설정
AD1CON1bits.SAMP = 0; //ADC 샘플/홀드 홀딩
AD1CON1bits.ASAM = 1; //ADC 변환 즉시 샘플링 시작 설정
AD1CON1bits.SIMSAM=0; //순서대로 멀티플 채널 샘플 설정
AD1CON1bits.SSRC = 7; //샘플 클럭 설정: 내부 카운터 샘플링 끝나고 변환시작
AD1CON1bits.FORM = 0; //데이터 출력 형식: Integer 
//(DOUT = 0000 dddd dddd dddd)
AD1CON1bits.AD12B =1; //AD변환 비트 값 설정: 12-bit, 1-channel ADC operation
AD1CON1bits.ADDMABM=0; //DMA 버퍼를 Scatter/Gather 모드로 쓰기 설정

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

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

//AD1CON4 Register 레지스터
AD1CON4bits.DMABL=0; //아날로그 입력당 DMA 버퍼 영역 설정: 1 워드 설정
//AD1CHS 레지스터 : ADC1 입력 채널 1,2,3 선택
AD1CHS123=0; //여기에서는 CH1,CH2,CH3을 사용 안함, 디폴트 값 0

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

//AD1CSSL 레지스터 : AN0 ~ AN15 아날로그 입력 핀 설정
AD1CSSL = 0;

//AD1PCFGL 레지스터
AD1CSSL = 0x0000;
AD1CSSLbits.CSS0=1;   
AD1CSSLbits.CSS1=1;  


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

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



dsPIC33E ADC Test 동영상
가변저항에 의해 변화되는 전압값을 그래프로 표시


Posted by nexp

댓글을 달아 주세요