K20 EVM - Kinetis Cortex-M4 K20 16bit ADC 테스트
Kinetis 시리즈는 기존 Cortex-M 시리즈들에서 보기 힘든 16bit ADC를 기본으로 내장하고 있다. K20 시리즈의 경우 특히 ADC부분에 기능이 풍부해 아날로그에 있어 강점이 있는것 같다.
특히 HW 평균필터가 내장되어 있어 32 Sample까지 필터링 가능하다.
K20 ADC테스트 동영상
K20 EVM 보드를 이용하여 가변저항에 연결된 전압값을 ADC해서 그래프로 출력하는 테스트를 진행해 보았다.
K20 의 ADC 블록도
K20 ADC 레지스터
아주 복잡해 보이지만 자세히 보면 ADCx_SC1 레지스터만 설정하면 아주 간단히 ADC를 할 수 있도록 되어 있다.
5-DIFF
Differential mode enable
차동으로 받을지 싱글로 받을지 설정 한다.
0 Single-ended conversions and input channels are selected.
1 Differential conversions and input channels are selected.
4–0 ADCH
ADC 채널 선택
00000 When DIFF=0, DADP0 is selected as input; when DIFF=1, DAD0 is selected as input.
00001 When DIFF=0, DADP1 is selected as input; when DIFF=1, DAD1 is selected as input.
00010 When DIFF=0, DADP2 is selected as input; when DIFF=1, DAD2 is selected as input.
00011 When DIFF=0, DADP3 is selected as input; when DIFF=1, DAD3 is selected as input.
00100 When DIFF=0, AD4 is selected as input; when DIFF=1, it is reserved.
00101 When DIFF=0, AD5 is selected as input; when DIFF=1, it is reserved.
00110 When DIFF=0, AD6 is selected as input; when DIFF=1, it is reserved.
00111 When DIFF=0, AD7 is selected as input; when DIFF=1, it is reserved.
01000 When DIFF=0, AD8 is selected as input; when DIFF=1, it is reserved.
01001 When DIFF=0, AD9 is selected as input; when DIFF=1, it is reserved.
01010 When DIFF=0, AD10 is selected as input; when DIFF=1, it is reserved.
01011 When DIFF=0, AD11 is selected as input; when DIFF=1, it is reserved.
01100 When DIFF=0, AD12 is selected as input; when DIFF=1, it is reserved.
01101 When DIFF=0, AD13 is selected as input; when DIFF=1, it is reserved.
01110 When DIFF=0, AD14 is selected as input; when DIFF=1, it is reserved.
01111 When DIFF=0, AD15 is selected as input; when DIFF=1, it is reserved.
10000 When DIFF=0, AD16 is selected as input; when DIFF=1, it is reserved.
10001 When DIFF=0, AD17 is selected as input; when DIFF=1, it is reserved.
10010 When DIFF=0, AD18 is selected as input; when DIFF=1, it is reserved.
10011 When DIFF=0, AD19 is selected as input; when DIFF=1, it is reserved.
10100 When DIFF=0, AD20 is selected as input; when DIFF=1, it is reserved.
10101 When DIFF=0, AD21 is selected as input; when DIFF=1, it is reserved.
10110 When DIFF=0, AD22 is selected as input; when DIFF=1, it is reserved.
10111 When DIFF=0, AD23 is selected as input; when DIFF=1, it is reserved.
11000 Reserved.
11001 Reserved.
11010 When DIFF=0, Temp sensor (single-ended) is selected as input; when DIFF=1, Temp sensor
(differential) is selected as input.
11011 When DIFF=0,Bandgap (single-ended) is selected as input; when DIFF=1, Bandgap (differential)
is selected as input.
11100 Reserved.
11101 When DIFF=0, VREFSH is selected as input; when DIFF=1, -VREFSH (differential) is selected as
input. Voltage reference selected is determined by the REFSEL bits in the SC2 register.
11110 When DIFF=0, VREFSL is selected as input; when DIFF=1, it is reserved. Voltage reference
selected is determined by the REFSEL bits in the SC2 register.
11111 Module disabled.
ADCx_SC3
하드웨어 평균화 필터 설정이 가능하다.
K20 ADC 초기화 소스코드
#define ADC_CFG1_MODE_8_9_BIT 0x0
#define ADC_CFG1_MODE_12_13_BIT 0x1
#define ADC_CFG1_MODE_10_11_BIT 0x2
#define ADC_CFG1_MODE_16_BIT 0x3
#define ADC_SC3_AVGS_32_SAMPLES 0x3
void AdcInit(void)
{
SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;
ADC0_CFG1 = ADC_CFG1_MODE(ADC_CFG1_MODE_16_BIT);
ADC0_SC3 = ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(ADC_SC3_AVGS_32_SAMPLES);
}
K20 ADC Read 소스코드
unsigned int AdcRead(unsigned char Channel)
{
//ADC 채널 선택
ADC0_SC1A = Channel;
//ADC 변환 완료 까지 대기
while((ADC0_SC1A & ADC_SC1_COCO_MASK) == 0)
{
}
//ADC값 출력
return ADC0_RA;
}
[K20 EVM] 보드에는 ADC8(PB0), ADC9(PB1), ADC14(PC0), ADC15(PC1) 포트에서 ADC테스트 해볼 수 있다.
PTC0 - ADC0_SE14
PTC1 - ADC0_SE15
레퍼런스 입력은 LM4040 으로 설정 가능하다.