Embeded/ARM Cortex-M4

ADC(Analog-Digital Converter)

gharlic 2015. 7. 10. 19:52

ADC(Analog-Digital Converter)란

 아날로그 신호를 디지털 신호로 변환시켜주는 것이다.

아날로그 신호란 자연계에서의 수치로 음성, 온도, 압력의 세기 따위를 전압의 세기로 나타내는 것이다.

디지털 신호 다른 말로 디스크리트(discrete) 신호는 High와 Low로 구분되는 이산적인 값이다.

 

어디에 쓰나?

 마이크로프로세서에서 ADC는 외부 센서(온도 센서, 적외선 센서, 초음파 센서, 가속도 등)으로 부터

읽어들인 아날로그 값을 처리하기 위해 디지털 신호로 변환시키는데 사용된다.

측정값이 전압의 세기로 나타내지는 센서들은 모두 ADC를 거쳐야한다고 생각하면 된다.

 

ADC 초기화 소스

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
void Init_ADC(){
 
        GPIO_InitTypeDef GPIO_InitStructure;
 
        ADC_InitTypeDef ADC_InitStructure;
 
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
 
 
 
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
 
 
 
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
 
        ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
 
        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
 
        ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
 
        ADC_CommonInit(&ADC_CommonInitStructure);
 
 
 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
        GPIO_Init(GPIOC, &GPIO_InitStructure);
 
 
 
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
 
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
 
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
 
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
 
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
 
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 
        ADC_InitStructure.ADC_NbrOfConversion = 1;
 
 
 
 
 
        ADC_Init(ADC1, &ADC_InitStructure);
 
        ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
 
        ADC_Cmd(ADC1, ENABLE);
 
}
 
cs

 이전 게시물에서 밝혔듯이 대부분의 기능은 GPIO가 겸하고 있기 때문에 ADC뿐만 아니라 GPIO도 설정해야한다.

http://gharlic.tistory.com/2 게시물을 참고하자. ADC는 PC0,2,3에 배치되어있다.

위 초기화코드는 PC0로 아날로그입력을 받겠다고 설정하는 부분이다.

분해능을 12bit로 잡았으므로 0 ~ (2^12)-1의 범위의 값이 읽어들여질 것이다.

초기화함수를 작성했으면 main함수에서 초기화함수를 실행시키는 것은 기본이다.

 

읽어온 값은 어디로?

1
2
3
4
5
6
7
ADC_SoftwareStartConv(ADC1);
 
 
 
if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET)
 
         x = ADC_GetConversionValue(ADC1);
cs

 타이머 핸들러에 위의 코드를 작성하면 x변수로 정수형값을 확인할 수 있다.

반응형

'Embeded > ARM Cortex-M4' 카테고리의 다른 글

Sink방식과 Source방식  (0) 2015.07.10
DAC(Digital-Analog Converter)  (0) 2015.07.10
GPIO(General Purpose Input Output) IN, OUT 소스  (0) 2015.07.08
GPIO/Timer를 활용한 FND제어 소스  (0) 2015.07.08
Timer / Timer_Handler 소스  (0) 2015.07.08