티스토리 뷰
이번 글에서는 stm32f103에서 제공하는 ADC에 대해서 설명하도록 하겠다.
먼저 reference manual에서 ADC 블럭도를 찾아서 stm32f103에 있는 ADC가 어떻게 생겼는지 대충 살펴본다.
AVR에 있는 ADC에 비해서 많이 복잡하다는 것을 알 수 있을 것이다.
그만큼 제공하는 채널수도 많고 해상도도 높고 기능도 다양하다. 그러나 위의 그림처럼 몇개의 세부 블럭으로 나누어 보면 이해하기가 좀 더 쉬워지게 된다.
ADC 기능의 핵심이라고 할 수 있는 빨간색 박스로 표시된 converter가 있다. Converter에는 regular channel이 있고 injected channel이 있다. stm32f103의 ADC는 설정에 따라 여러 채널에 대해서 자동으로 ADC값을 읽을수 있는데, regular channel이 데이터 변환 중에 우선 순위가 높은 채널을 정해서 그것부터 데이터 변환을 할 수 있다. 이러한 용도로 사용하기 위하여 injection mode라는 것이 제공된다.
자세한 내용은 AN3116 ADC modes를 다운받아서 읽어 보면 된다.
stm32f103의 ADC는 외부로부터 16개의 채널을 선택할 수 있고, 칩 내부에서 2개의 채널을 선택할 수 있다. 이 부분은 파란색으로 표시되어 있다.
데이터 변환을 시작하는 조건 또한 여러가지 중에서 선택할 수 있는데 하늘색으로 표시된 곳에 선택 가능한 시그널이 표시되어 있다.
데이터 변환의 결과는 data register에 저장되는데 초록색 부분이다.
변환이 완료 되었다는 것을 알려주기 위하여 flag 비트를 설정해 주는데 이 부분은 오렌지 색으로 표시되어 있는 곳에서 처리한다.
마지막으로 ADC에 공급되는 Clock에 대한 부분이 보라색으로 표시된 부분이다.
Clock 설정에서 설명한 내용을 보면 ADC로 들어오는 clock은 PCLK2인것을 알 수 있다. 그리고 ADC clock의 최대값은 14MHz이므로 14MHz보다 크지 않도록 ADC prescaler값을 이용하여 clock 속도를 낮추어 주어야 한다.
그럼, 실제로 보드에 회로를 꾸며서 ADC가 제대로 동작되는지 확인해 보도록 하겠다.
ADC(Analog to Digital Converter)에서 했던것처럼 가변저항을 이용하여 ADC 기능을 구현해 보도록 하겠다.
ADC1의 0번 채널은 PA0 핀으로 매핑되어 있으므로 가변저항기의 가운데 핀을 PA0핀에 연결하고 나머지 두개는 각각 VDD와 VSS에 연결한다.
ADC 기능을 확인하기 위한 코드는 비교적 간단하다. 이 글에서는 가장 간단한 방법으로 ADC를 동작 시켜 볼것이므로 여기에 설명되어 있는것은 stm32f103의 ADC가 가지고 있는 기능의 10%도 되지 않을것이다. 나머지 기능들은 필요할 경우 그때 그때 구현해 보도록 할 것이다.
10번 줄은 PA0 핀을 analog input으로 설정하는 부분이다.
13번 줄에서 ADC에 클럭을 공급할 수 있도록 RCC에 clock enable 시켜주고, 14번 줄에서 ADC를 초기화는 함수를 call 한다.
18번 줄에서 PA0로 입력되는 전압을 측정하여 디지털 값으로 변환하여 UART 콘솔창에 표시하도록 하는 부분이다.
stm32f103에는 두개의 ADC가 들어 있지만 여기에서는 ADC1만 사용하는 코드를 만들어 본다.
14,15는 ADC의 데이터 변환 시작 조건을 CR2 레지스터 안에 있는 SWSTART 비트를 소프트웨어로 제어할것이라는 것을 알려주는 부분이다.
17~21번 줄은 ADC의 정확도를 높이기 위하여 calibration을 수행하는 코드이다.
일단 이정도로 설정하면 ADC가 동작할 준비는 마친것이다.
6~9번 줄은 ADC의 입력 채널을 설정하는 부분이다. 외부에서 16개의 입력을 받을 수 있으므로 그 중에서 어떤 채널을 변환할 것인지 설정하는 것이다.
11번 줄이 ADC로 하여금 데이터 변환을 시작하라는 것을 알려주는 부분이다.
12번 줄은 ADC가 데이터 변환을 완료하면 SR 레지스터의 EOC 비트값을 1로 만들어 주므로 1이 될때까지 loop를 돌도록 하는 것이다.
14번 줄은 데이터 변환이 완료된 후 변환값이 들어 있는 DR레지스터 값을 읽어서 return 해준다. 참고로 stm32f103은 12비트 해상도를 제공하기 때문에 0~4095까지의 값을 가질수 있다.
프로젝트를 빌드하여 ADC 기능이 제대로 동작 되는지 확인해 본다.
가변저항기의 노브를 최소값이 되도록 돌린다음 측정한 결과가 위의 그림처럼 나왔다. 이 값은 가변저항기의 오차값에 의해 0이 될때도 있고 위와 같이 작은 값이 나올때가 있었다.
이제 가변저항기의 노브를 반대 방향으로 끝까지 돌린 다음 ADC로 측정한 값을 읽어 보면 위와 같은 결과가 나온다.
가변저항기를 돌려가며 ADC 값이 제대로 읽히는지 시험해 본다.
ADC는 analog 값을 digital 값으로 변환하는 기능을 제공하므로 그 결과를 숫자로 표현하는것보다는 그래픽으로 analog 방식으로 표시해주면 어느정도의 값을 가지는지 쉽게 알 수 있을것 같다.
'ARM Cortex-M' 카테고리의 다른 글
I2C (0) | 2017.04.22 |
---|---|
시스템 클럭 72MHz로 동작 시키는 방법 (0) | 2017.04.19 |
ST-Link/V2 SWD 연결 문제 해결 (4) | 2017.04.15 |
PWM (0) | 2017.04.08 |
Timer (0) | 2017.04.08 |