안녕하세요. 취업한 공대누나입니다.
오늘은 회사에서 ADC 관련 기능 구현 할 일이 있었습니다.
아직 버그가 있어서 디버깅 해야 할 것이 있지만 얼추 구현이 되어서 소스 소개를 해드릴까 합니다.
1. 사용한 MCU : Atmel 사의 SAM4S 시리즈입니다.
2. 간단하게 펌웨어 설명
메인 동작을 먼저 보도록 하겠습니다.
adc는 인터럽트 방식으로 동작을 하게 됩니다.
adc관련해서 인터럽트를 먼저 enable 해주었고, 해당 channel을 enable 시켜주었습니다.
소프트웨어 트리거를 이용한 것을 볼 수 있습니다.
adc_start 함수를 이용하여 변환을 시작하게 되면 아래 핸들러에 들어오게 됩니다.
핸들러에 들어오게되면 ADC 변환 상태인지를 체크한 후
변수에 가장 최근에 변환한 adc 값을 저장하도록 구현되어 있습니다.
여기서 DRDY는 Data Ready Interrupt Enable입니다.
0이면 해당 레지스터에 데이터가 없다는 것이고, 1이면 최소한 1개 이상의 데이터가 변환되어 레지스터에 저장되어 있다는 것입니다.
아래는 adc를 초기화 해주는 부분입니다.
실제로 별로 필요하지 않은 부분도 있으나 기존 소스를 그대로 이용하려고 가져왔습니다.
데이터 시트에 파형을 통해서 변환 과정을 간단히 보면 아래와 같습니다.
trigger, adc enable, channel selection, adc start를 해주어야 하는 것을 알 수 있습니다.
그리고 결과가LCDR 레지스터에 저장되는 것입니다.
변수에 저장된 값을 보니 6e9e로 변환되어있습니다.
사실 제가 원하는 값은 e9e였는데 6이라는 값이 뭘까 하고 데이터 시트를 찾아보았습니다.
알고보니 6이라는 값은 channel number였습니다.
여기서 변환된 e9e라는 값은 16진수를 10진수로 변환하게 되면 3742라는 값입니다.
12비트 분해능을 가진 adc이며, reference 전압이 3.3V이므로 해당하는 전압 값을 계산해주게 되면
3.3V * 3742/4095가 됩니다.
제가 원하는 값 정도를 잘 얻을 수 있었습니다.
저와 같은 MCU를 사용하시는 분은 많지 않을 거라 생각되지만 그래도 전자 공학은 많은 것들을 접하면 접할수록
배경 지식도 많이 쌓이고 업무에도 도움이 되는 것 같습니다.
저도 아직 데이터시트를 완벽하게 분석하고 하는 것은 아니기 때문에 모르는 부분이 많기는 합니다.
그래도 배워나가는 초보 엔지니어로서 하나씩 구현에 성공할 때마다 뿌듯함을 느낄 수 있습니다.
'전자 공학 > 기타' 카테고리의 다른 글
CCL(Critical Component List)이란? (0) | 2021.01.12 |
---|---|
펌웨어란(Firmware)? (2) | 2021.01.09 |
WDT - 와치독이란? (0) | 2021.01.05 |
PWM 이란? (0) | 2021.01.01 |
메모리 반도체와 비메모리 반도체 (0) | 2020.12.29 |