Microprocessor/DSP (TMS320F28x)

DSP TMS320F281x ADC 분석

Dexter_- 2024. 1. 9. 17:42
728x90
반응형

 

 

 

목차

     

    TMS320F281x ADC 특징

     

    • 두개의 Sample/Hold (S/H) 탑제된 파이프란인 방식(4 Stage)의 12bit ADC

     

    • Simultaneous sampling, Sequential sampling modes 두가지 샘플링 모드 지원
    • 입력 허용 전압: 0V ~ 3V
    • 샘플/홀드의 신호 획득 시간(S/H acquisition time window) 조절용 클럭 분주 회로 탑재
    • 아날로그 먹스가 탑재된 16채널 입력
    • 16개의 결과 저장용 버퍼 (ADCRESULT0 ~ 15)
    • 두가지 인터럽트 모드 제공
      • every end of sequence(EOS) : 신퀀스 동작 매 완료시 마다
      • every other EOS : 시퀀스 동작 매 두 번째 완료 시 마다

     

    • 오토 시퀀스 탑재
      • 최대 16채널 순서 임의 조정 (cascaded mode : 직렬모드)
      • Event Manager A, B와 각각 연계 가능 (dual sequencer mode)
      • 연속 동작 모드
      • 단일 동작 (Start/Stop) 모드

     

    • Sequencer override mode enhancement
      • ADCRESULT 버퍼를 16레벨 FIFO로 사용

     

    • 다양한 트리거 모드 지원 : Start of Conversion (SOC)
      • S/W : software immediate start
      • EVA : Event manager A (multiple event sources within EVA)
      • EVB : Event manager B (multiple event sources within EVB)
      • External pin

     

    파이프라인 방식 ADC의 특징

    • 각 스테이지의 일괄 (Concurrent) 동작으로 고속 변환 가능
    • 고주파 신호에 대한 광범위한 Dynamic Range 제공 가능
    • 파이프라인이 꽉 차기 전의 데이터는 의미 없음
    • 지연 발생
    • 각 스테이지의 ADC 방식은 연속근사방식 (Successive Approximation Register ADC)

     

    ADC 블록 다이어그램

     

    F2810/F2811/F2812

     

    ADC Register 분석

     

    ADCMAXCONV

     

    • Cascaded mode (SEQ1 에서 직렬모드로 사용)

    예) SEQ1에서 15채널을 변환한다면 ?

    답 = ADCMAXCONV = 0x000E (14), 1을 더한 값 15채널로 설정 된다.

     

    • Dual Sequencer moder

    예) SEQ1에 3채널 변환, SEQ2에서 6채널 변환한다면 ?

    답 = ADCMAXCONV = 0x0052, 하위 비트(CONV1_x)에 2 설정 1을 더한 값 3채널로 설정 상위 비트(CONV2_x)에 5 설정 1을 더한 값 6채널로 설정 된다.

     

     

    ADCCHSELSEQ1~4

     

    • 각각 4비트로 구분 채널 지정 : CONVnn
    • 채널 변환 순서
      • CONV00 > CONV01 > CONV02 > ... CONV15

     

    예) Cascaded 모드로 다음과 같이 순서로 채널을 변환하고자 한다.

    ADCINA7 > ADCINA6 > ADCINA0 > ADCINA1 > ADCINA0 > ADCINA2 > ADCINA0 > ADCINA1 > ADCINA0 > ADCINA2

     

    답)

    ADCMAXCONV = 0x0009 (10채널)

    ADCCHSELSEQ1 = 0x1067 (7, 6, 0, 1)

    ADCCHSELSEQ2 = 0x9820 (0, 2, 8=0, 9=1)

    ADCCHSELSEQ3 = 0x00A8 (8=0, 10=2)

     

     

    ADCTRL3

    • ADCTRL3.8 : EXTREF
      • 0 : 내부 레퍼런스 회로 사용

     

    • Power 시퀀스
      • ADCBGRFDN[1:0] : Bandgap & Reference Power Down (=0)

     

    파워 레벨에 따른 ADC 운용

    • 칩 리셋 후 상태 - ADC Power Down 모드
    • ADC를 구동하기 
      • reference와 bandgap 회로에 전원을 먼저 인가 (ADCBGRFDN[1:0] = 11)
      • 최소 7msec 이후에, ADC의 기타 회로에 전원인가 (ADCPWDN = 1)
      • 최소 20us 이후에, 첫 변환 시작
      • Pipeline 방식의 ADC이기에 초기 몇 샘플은 버릴 것

     

    • 참고: ADCTRL3의 POWER모드 비트에 따른 파워 레벨

     

     

    ADCST (ADC 상태)

    • INT SEQx : SEQx 인터럽트 플래그 비트
    • SEQx BSY : SEQx의 동작여부 표시 비트 (1 = in progress)
    • INT SEQx CLR : 인터럽트 플래그 클리어 비트
      • 1을 쓰면 플래그 클리어
      • 언제나 0으로 읽힘

     

    • EOS BUFx
      • 인터럽트 모드 0에서는 미사용 비트
      • 인터럽트 모드1에서는 매 EOS 마다 토글

     

    ADCASEQSR (시퀀스 상태)

     

    • 읽기 전용 비트로 구성
    • 오토 시퀀스의 상태 표시
    • SEQ CNTR3~0 
      • ADCMAXCONV 레지스터에 정의된 내용을 수행하기 위해 SOC 접수 후, MAX CONV 값이 로딩됨

     

    • SEQx STATEx : TI 내부 테스트용

     

    ADCTRL1

     

    • Reset : ADC 모듈 reset
      • 1을 쓰면 리셋, reset 후 이 비트를 읽으면 0 (self cleared)
      • ADC 모듈 reset 작업에는 3 사이클 소요 (ADC 관련 레지스터 조작은 reset후 3사이클 뒤에)
      • reset 후 ADCTRL1에 값을 대입하기 위해서는 총 12사이클의 NOP등이 필요

     

    • SUMMOD1-0 : 에뮬레이션을 중지했을 때
      • 0 0 Mode 0 : 계속해서 동작
      • 0 1 Mode 1 : 현재 진행중인 시퀀스 동작 완료 후 정지
      • 1 0 Mode 2 : 현재 변환중인 채널을 완료한 후 중지
      • 1 1 Mode 3 : 즉시 중지

     

    • ACQ PS3 : 샘플/홀드 시간 설정
      • 설정 값 = 비트 + 1

     

    • CPS : ADC 구동 클럭 분주기
      • 0 : ADCCLK = HSPCLK/1
      • 1 : ADCCLK = HSPCLK/2

     

    • CONT RUN : ADC 의 연속/단일 변환 설정
      • 0 : 단일변환 (시퀀스 종료 후에 시퀀스는 정지한다.)
      • 1 : 연속변환 (시퀀스 종료 후에 다시 시퀀스를 시작한다.)

     

    • SEQ OVRD
      • 0 : Sequencer override 모드 비사용
      • 1 : Sequencer override 모드 사용

     

    • SEQ CASC
      • 0: Dual sequencer 모드
        • SEQ1과 SEQ2를 병렬로 사용하여 1개의 ADC를 2개처럼 사용할 수 있다.
        • 단, 각각의 시퀀스는 8채널씩 시퀀스 할 수 있다.
      • 1 : Cascaded 모드
        • SEQ1과 SEQ2를 직렬로 사용하여 하나의 시퀀스로 사용할 수 있음
        • 두 시퀀스를 합쳐 16채널을 시퀀스 할 수 있다.

     

    ADCTRL2

     

    • SOC : 시작하기, Start of Conversion
      • Evx SOC : Event Manager로 부터 SOC
      • SOC SEQx : 이 비트에 1을 쓰면 SEQ가 동작
      • EXT SOC SEQ1 : ADCSOC 핀 입력으로

     

    • EOS : 읽기, End of Conversion
      • INT ENA SEQx : ADC 결과를 인터럽트 방식으로 읽음
      • INT MOD SEQx : 매 EOS 마다 읽을 것인지, 매 두번째 EOS마다 읽을 것인지 결정

     

    • RST SEQx : 시퀀스를 리셋, CONV00과 CONV08 상태로 초기화

     

    인터럽트 모드

    모드 - 1

    • 인터럽트 모드 1설정
    • MAX CONV = 1로 시작
      • I1과 I2 변환

     

    • 인터럽트 서비스 루틴 'a' 에서 
      • I1, I2 저장
      • MAX CONV = 2로 변경

     

    • 인터럽트 서비스 루틴 'b'에서
      • V1, V2, V3 저장
      • MAX CONV = 1로 변경

     

    • 인터럽트 서비스 루틴 'c, d' 반복
    • if, 인터럽트 서비스 루틴 'b'에서 I1, I2, V1, V2, V3 값을 모두 처리한다면, 인터럽트 모드 1은 낭비됨

     

     

    모드 - 2

    • 인터럽트 모드 2 설정
    • MAX CONV = 2로 시작
      • I1과 I2 변환

     

    • EVA가 Underflow일 때
      • I1, I2, x(dummy 채널) 변환
      • MAX CONV = 2로 변경

     

    • EVA가 Period Matching일 때
      • V1, V2, V3 변환

     

    • 인터럽트 서비스 루틴 'b'에서 
      • I1, I2, V1, V2, V3 저장

     

    • 다음번 인터럽트 처리 'd'
    • dummy 채널 추가로 인터럽트 절제
      • 인터럽트 지연 (10Cycle) 제거

     

    ADCRESULTn (12비트 결과 저장)

    • ADC 분해능이 증가하면 결과 표현 비트 수가 증가
      • 10비트 ADC에 비해 12비트 ADC는 하위 2비트가 증가

     

    • 16비트 레지스터의 최상위 비트부터 채워 나감
      • Q number의 자리값
      • Q math 이용 시, 자리 이동 필요 없음

     

     

    샘플링

    • 샘플링 주기 : SOC (Start of Conversion)의 주기적 발생
    • ADC의 변환 시간과 관계 없음
      • 단, Continuous Run Mode 에서는 ADC 자체 변환 시간이 샘플링 주기 결정

     

    예1) 10KHz로 샘플링

    답 = Event Manager의 주기 이벤트를 이용해서 10KHz 주기로 SOC 발생

     

    예2) ADCTRL1.6의 CONT_RUN 비트 설정

    답 = ADC 변환 시간(시퀀스 한 세트) : 샘플링 주기

     

     

    변환 시간(속도)

     

    • ADC 모듈이 S/H에 샘플링된 아날로그 신호를 디지털 신호(PCM 데이터)로 변환하는 시간
    • ADC 회로 구동 클럭이 변환 시간 결정

     

    변환 속도 계산

     

    • 변환 속도가 7.5MHz로 설정되었다 하더라도, SOC의 발생 주기가 10KHz이면 샘플링 주기(rate)는 10KHz 이다.

     

    ADC 구동 클럭을 높이면

    • Aliasing이 줄어든다.
    • 채널간 오차(cross-talk)가 커진다.
      • 이 오차는 샘플링 윈도우를 키운다고 줄어드는 성질의 것이 아니다.

     

    ADC 구동 클럭을 낮추면

    • Aperture Error가 커진다.


    주의 1: 구동 클럭과 샘플링 rate은 별개
    - 1KHz로 샘플링을 하더라도, ADC 구동 클럭은 25MHz가 가능하다.

    주의 2: 281x ADC의 최고 구동 클럭은 25MHz
    - 분주 부주의로 25MHz이상의 클러이 공급되면, 결과가 맞지않다.

     

     

    시퀀스

     

    • 채널 변환 순차 설정이 주된 동작
    • 개발자가 시퀀스에 기동 신호를 전달하면, 시퀀스가 ADC 회로를 기동
    • 시퀀스 설정 완료 인터럽트 발생 가능
    • 다채널 조작 용이

     

    8채널 조작 시퀀스 2개 탑재

    • SEQ1: ADCINA0~7 > S/H-A
    • SEQ2: ADCINB0~7 > S/H-B
    • 16채널 조작 단일 시퀀스로 운용 가능(Cascaded 모드)

     

    시퀀스의 장점

    • Multi-rate System 구현 용이
    • 고속 샘플링 지원 용이
      • 12.5MHz 샘플링 : 샘플링당 12개의 명령어 처리
      • 블록 샘플링 : 
        • 최고 16회 혹은 16채널 변환을 1블록으로
        • 시퀀서 완료 주기는 약 780KHz(12.5MHz/16)
        • 인터럽트 처리 가능

     

    • 주변 회로 연계 구동 능력
      • 초기 설정만으로 ADC 구동 가능
        • 타이머 주기 이벤트를 이용한 ADC 기동
      • 유연한 ADC 기동과 결과 처리 가능

     

    시퀀스 : Cascaded(직렬) 모드

     

    시퀀스 : Dual Sequencers(병렬) 모드

     

    DSP281x_Adc.c 의 전원 관련 코드

    //---------------------------------------------------------------------------
    // InitAdc: 
    //---------------------------------------------------------------------------
    // This function initializes ADC to a known state.
    //
    void InitAdc(void)
    {
    	extern void DSP28x_usDelay(Uint32 Count);
    	
        // To powerup the ADC the ADCENCLK bit should be set first to enable
        // clocks, followed by powering up the bandgap and reference circuitry.
        // After a 5ms delay the rest of the ADC can be powered up. After ADC
        // powerup, another 20us delay is required before performing the first
        // ADC conversion. Please note that for the delay function below to
        // operate correctly the CPU_CLOCK_SPEED define statement in the
        // DSP28_Examples.h file must contain the correct CPU clock period in
        // nanoseconds. For example:
    
    	AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;	// Power up bandgap/reference circuitry
    	DELAY_US(ADC_usDELAY);                  // Delay before powering up rest of ADC
    	AdcRegs.ADCTRL3.bit.ADCPWDN = 1;		// Power up rest of ADC
    	DELAY_US(ADC_usDELAY2);                 // Delay after powering up ADC
    }

     

     

     

     

     

     

    728x90
    반응형