ADC with DMA

Park.Dyel·2020년 5월 6일
0

FW

목록 보기
2/4

오늘의 FW 개발에서 고통받는 주제는 ADC이다.

하지만 글에 앞서 결론을 말하자면 STM32의 ADC를 사용하기에 앞서 꼼꼼히 이 문서(TNK0023/AN2629:STM32 ADC 펌웨어 가이드 (모드와 특성))를 읽도록 하자.

STM32F030을 사용하는 보드를 검증하는 업무가 주어졌다. 보드에는 UART, ADC 기능이 있었고, 센싱을 하는 보드라 크게 어려울 건 없다고 생각했다. 비록 STM32 프로젝트 구성 경험은 없었으나, ATMega 계열의 칩을 사용할 때 ADC를 사용해봤고, STM32 프로젝트에서 UART를 써보지 않았는가?

STM32의 ADC를 살펴보니 polling 방식, interrupt 방식, DMA 방식, DMA-interrupt 방식이 있었다. 줏어듣기로는 DMA 방식은 MCU에 관여 없이 메모리에 직접 접근하여 읽은 값을 가져다 놓는 아주 센스 있는 방식이라고 알고 있어서, DMA 방식을 택했다. 지속적으로 값을 갱신하기 위해서 Cicular Mode를 사용했고, 한 번의 트리거를 통해 여러 채널의 ADC를 읽기 위해 Continous Mode를 활성화 했다.

하지만 분야를 막론하고, 언제나 그렇듯 코드는 내 생각대로 쉽게 작성되지 않는다. 언제나 문서를 읽지 않고 삽질을 한 이후에야 문서를 본다. 그 이전에는 문서를 읽어도 보이지 않는다. 결국 뜻밖의 고통을 받게 되었다. 비교적 순조로웠던 처음과 달리 4개의 ADC 중 마지막 하나의 ADC 값이 읽히지 않는 것이 아닌가?

결론적으로는 Sampling과 관련이 있었다. 사수 없는 FW 개발자를 위한 오픈톡방에 질문을 빙자한 하소연을 하면서 줏어들은 것들을 테스트 해보고, 괴로움에 속을 끓이며 인터넷을 배회하면서 알게되었다.

ADC Sampling 1회는 Sampling과 Conversion이 세트로 수행된다. conversion time은 ADC block의 resoulution bit와 동일하다. 12 Bit의 resulution은 12 cycles 이다. 이때 설정된 ADC peripheral clock에 따라 tADC를 구할 수 있다. 이때 설정된 ADC Sampling time Cyles에 따라 1회 소요되는 시간을 구할 수 있다.

ADC Sampling time은 정해진 값들 중에 하나를 선택할 수 있는데 SAR 방식의 ADC는 MCU 내부의 캐패시터를 ADC 입력핀 소스로부터 샘플링 cycle 시간동안 충전하고 conversion 시간 동안 충전된 전압을 측정한다. [^1]
샘플링 cycle을 높일수록 ADC 측정된 전압 값이 높아진다면 소스의 출력 임피던스 높아서 설정한 샘플링 cycle 시간동안 capacitor 를 완전 충전하지 못했다는 것을 의미한다. 즉, 샘플링 cycle 을 높일수록 평균낸 안정된 값을 받는다는 값을 의미하지 않으므로 capacitor를 완전 충전할수 이상의 최대한 낮은 샘플링 cycle로 설정해도 충분하다(이 문단은 아직도 이해가 되지 않는다).

켠김에 왕까지라고 위에 간단하게 언급했지만 STM32에서 ADC를 사용하기 위해선 여러 방식을 지원하는데 Polling 방식, Interrupt 방식, DMA 방식, DMA-Interrupt 방식이 있다. Polling 방식은 가장 단순한 방식이고, Interrupt 방식은 하나의 채널에 대해서 지속적으로 처리할 때 효율이 좋으며, DMA 방식은 지속적인 처리를 요구하며 여러 채널에서 작업해야 할때, DMA-Interrupt 방식은 지속적인 처리를 요구하며 여러 채널에서 작업해야 하며 변환시 마다 특정한 작업이 필요할 때 사용하면 좋다. 이에 관한 글은 좋은 포스팅들이 많으니 살펴보도록 하자.

[^1]:축차 대조, Successive Approximation Register, 기존 Singled Slope ADC에서 10bit라면 1024번 Count 하는데에 비해 SAR의 경우 10번의 Cycle만 돌면 10bit Resolution의 ADC 결과값이 나온다.

profile
ㄱH발자

0개의 댓글