티스토리 뷰

ARM Cortex-M

DMA - ADC

Just4Fun 2017. 5. 28. 16:16

앞의 글들에서 설명한 DMA의 개념과 기본 동작, 그리고 주변장치와 데이터 송수신에  DMA를 사용할 수 있다는 내용을 통해서 DMA의 유용성에 대하여 충분히 이해했을것이다.

이번 글에서 설명하려고 하는 DMA를 이용한 ADC 기능은 특히 DMA를 이용하는것이 얼마나 프로그램을 쉽게 할 수 있는지 보여줄 것이다.

stm32f103에 있는 ADC는 최대 16개의 채널에서 데이터를 읽어 올 수 있는데, 각각의 채널에서 데이터를 읽어 오려면 상당히 귀찮은 작업을 해주어야 한다.

그러나, DMA를 이용하면 CPU는 미리 설정된 주소의 메모리만 읽으면 DMA가 전달해준 새로운 값을 가져올 수 있게 된다.


이번 글에서는 ADC input 3개로부터 데이터를 읽어 오는 프로젝트를 만들어 보는것으로 하겠다.

역시 ADC를 사용하기 위한 DMA 채널이 몇번에 할당되어 있는지 메뉴얼을 보고 확인한다.

위의 표를 보면 ADC는 DMA 채널1을 사용하면 된다는 것을 알 수 있다.

그럼, 차례 차례 기능을 구현해 보도록 하겠다.

5번줄은 ADC를 Scan모드로 동작 시키도록 해주는 것이다.

6번줄은 DMA와 연동하기 위하여 DMA 비트를 set해주고, 또한 계속 ADC값을 읽기 위하여 continuous conversion을 set 한다.

DMA를 설정하기 위한 adc_dma_init()코드는 위와 같다.

9번 줄에 peripheral address register에 ADC의 data register 주소를 넣어준다.

10번 줄에는 DMA를 계속 반복해서 수행하기 위하여 circular mode를 설정해 주었다.

12,13번줄에는 ADC 값이 12비트 값이므로 16비트 값의 크기로 데이터를 읽어 오도록 하였다.

DMA와 연동되어 ADC를 동작을 시작하기 위한 run_adc()는 위와 같다.

7번 줄에 ADC에 3개의 입력이 있다는 것을 알려준다.

ADC가 16개의 채널을 동시에 연결 시킬수 있다하더라도, data register는 하나밖에 없으므로 어느 절대적인 시간에는 하나의 ADC값을 읽을 수 밖에 없다.  그 읽는 순서는 SQR register에 그 순서를 설정해 주도록 하고 있다.

Multi-channel ADC 설정이 끝나면 conversion을 시작 시킨다.

14번 줄에서 ADC로 부터 읽은 값을 메모리에 써주기 위하여 그 위치를 지정해주고 있다.  Destination 주소는 adc_val[]로 지정하였다.  DMA가 ADC의 data register에서 값들을 읽어 순차적으로 adc_val 배열에 기록하도록 하는 것이다.

ADC input으로 3개를 이용할 것이므로 15번 줄에서처럼 length를 3으로 설정하였다.

마지막으로 DMA를 enable 시키면 DMA가 ADC로부터 값들을 읽어 adc_val에 순차적으로 써주게 된다. 3개의 입력을 모두 처리하였으면 다시 처음부터 자동으로 데이터를 읽어 와서 메모리에 써주게 된다.

21~27번줄을 보면 CPU는 단순히 adc_val[] 배열에 들어 있는 값을 UART를 통해서 내 보내고 있는것을 알 수 있다.

어디에도 ADC로 부터 값을 읽어 오는 부분이 없다.  눈에는 보이지 않지만 DMA가 끊임없이 ADC로부터 세개의 채널에서 값을 읽어 배열에 넣어주고 있기 때문에 실제로 동작시켜 보면 ADC값이 변화되는 것을 확인할 수 있다.

화면에 출력되는 값을 좀 쉽게 확인하기 위하여 delay()를 주었는데, 실제 환경에서는 delay를 주지 않아도 된다.

실제로 보드에 프로그램을 내려서 원하는 결과가 나오는 것을 확인해 보도록 한다.

각각의 ADC 채널에는 가변저항기를 연결 시켜 놓았고, 가변저항기의 노브를 돌리면 해당 채널의 ADC값이 정확하게 변화 되는것을 볼 수 있었다.


dma_adc.zip


'ARM Cortex-M' 카테고리의 다른 글

DMA - SPI  (2) 2017.05.27
DMA - UART  (0) 2017.05.22
DMA  (2) 2017.05.13
SPI  (3) 2017.05.03
I2C  (0) 2017.04.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함