복잡한 제어를 하고 싶다면 아날로그 회로로는 한계가 있다. 이를 위해 ADC(아날로그 디지털 컨버터)는 반드시 필요한 기술이다.  아날로그 신호(센서의 전압신호, 전류신호)를 프로세서가 받아드려 프로세서에서 원하는 제어를 하는 프로젝트일 경우 반드시 사용할 것이다. 다만 아날로그 신호를 디지털 신호로 변환하게 되면 반드시 생기는 왜곡은 감수해야한다. 그래서 좋은 ADC변환 칩을 사용하는것이 좋다. ADC의 변환 방식은 여러가지가 있다. 병렬비교형, 파이프라인형, 축자비교형, 델타시그마형, 이중적분형 등이 있는데, TC237에는 델타시그마형과 축자비교형을 사용하고있다. 각 변환방식마다 장점과 단점 성능 차이가 있다.

이번 TC237 ADC에서는 축자비교형(SAR)방식을 사용한다.




축자비교형의 경우 이진탐색 방식으로 양자화하는 방식이다.

내부에 DAC와 비교기를 사용해서 각 클럭마다 상위 MSB 부터 LSB쪽으로 결정한다.


하지만 우리는 이러한 것을 몰라도 사용이 가능하다. TC237의 내부 하드웨어가 처리를 해주며 우리는 제어 할 수 있는 레지스터를 건드려 주면 된다.

 


아래는 유저 메뉴얼에 명시되어있는 ADC 변환 예제이다.

1. Load the global VADC module registers

2. Enable the analog/digital converter 0 (G0)

3. Select channel 0 of G0 as analog input

4. Initialize the conversion result service request

5. Start first conversion


Basic Initialization of the VADC:

//=========================> Load global module registers

(1) SCU_vResetENDINIT (0); // Access to ENDINIT-prot. reg.

(2) VADC_CLC = 0x0000; // Enable module clock and ctrl.

(3) dummy = VADC_CLC; // Read back ensures write oper.

(4) SCU_vSetENDINIT (0); // Lock ENDINIT-protected reg.

//=========================> Enable converter for group 0

(5) VADC_G0ARBCFG = 0x3; // ANONC = 11, analog converter ON

(6) VADC_GLOBCFG = (1<<31) /* SUCAL = 1, start-up calib. */ \

|(1<<15) /* DIVWC = 1, enable write */ \

| 0x9; // DIVA = 9 (clock prescaler)

(7) VADC_G0ARBPR = (1<<26); // AREN2 = 1, enable arb. slot 2

// (= background source)

(8) VADC_G0CHCTR0 = (1<<20); // RESTBS = 1, global result reg.

(9) VADC_BRSSEL0 = 0x1; // Select CH0 of group 0 for scan

(10) VADC_BRSMR = 0x1; // ENGT = 10B, enable conv. req.

//=========================> Init and install service request

(11) SRC_VADCCG0SR0 = (1<<10) /* Enable SR node 0, group 0 */ \

|VADC0INT; // Set prio to <VADC0INT>(1..255)

(12) interruptHandlerInstall (VADC0INT, & VADC_SCAN_irq);

(13) VADC_GLOBRCR = (1<<31); // SRGEN = 1, result service requ.

//=========================> Wait for completion of startup cal.

(14) while((VADC_G0ARBCFG.U & 0x30000000) != 0x20000000);

// CALS = 1, CAL = 0: calibr. done

//=========================> Start a conversion

(15) VADC_BRSMR |= (1<<9); // LDEV = 1, generate a load event










tftlcd에 간이 오실로스코프

lcd 하단에 전압 구형파를 출력했다.

 






SAR 방식의 adc



빠른 주행과 CPU에 부담을 주지 않기 위해 DMA채널을 이용해서 ADC를 할 계획이다.

delta-sigma adc도 해볼예정


Cpu0_Main.c

Cpu0_Main.h

Cpu1_Main.c

Cpu2_Main.c

VadcAutoScanDemo.c

VadcAutoScanDemo.h



+ Recent posts