본문 바로가기
Programming/Embedded

[Arduino Due]-basic ADC code

by No Brainer 2022. 2. 19.

//ana1 &2로부터 전송된 아날로그 신호를 디지털 신호로 변환하여 시리얼통신으로 pc로 전송한 후 시리얼 플로터를 통해

//그림으로 확인한다.

 

 

 

char str[64];//message를 담기 위한 배열

unsigned int data[2];//ade변환data 저장을 위한 배열

 

void configure_adc();//함수 프로토타입

 

void setup() 

{

  Serial.begin(115200);

  configure_adc();

}

 

void configure_adc()

{

  pmc_enable_periph_clk(ID_ADC);//ADC에 클럭 공급

  

  adc_disable_all_channel(ADC);//모든 ADC채널을 DISABLE함

  /*

   * ade.h에 다음과 같이 정의되어 있음

   * the max ade sample freq definition=20000000

   * the min ade ..     ..       .. :  =1000000

   * the normal ade startup time=40

   * the fast ade startup time 12

   */

  adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); //Systemcoreclock : 84MHz   인자순서: MCK(SystemCoreClock), ACD클럭(ADC_FREQ_MAX), START UP TIME(ADC_STARTUP_FAST)

  adc_configure_timing(ADC, 1, ADC_SETTLING_TIME_3, 1);//track, settling, transfer에 관련한 time설정

  adc_configure_timing(ADC,0,ADC_SETTLING_TIME_3,1);

  adc_set_resolution(ADC, ADC_12_BITS);   //분해능 : 12bit으로 설정

  adc_enable_channel(ADC,ADC_CHANNEL_0);//channel 0 activate

  adc_enable_channel(ADC,ADC_CHANNEL_1);//channel 1 activate

}

 

 

void loop() 

{

  adc_start(ADC);//soft ware 로 SOC를 줄 경우 매번 이 함수를 호줄해 주어야 함.

 

  //변환이 끝났는지 알아보는 방법

  while((ADC->ADC_ISR & ADC_ISR_EOC0) != ADC_ISR_EOC0); // ADC_ISR_EOCn = 0x1u << n.  0번 채널의 변환이 끝날때까지 기다린다.

  data[0]= adc_get_channel_value(ADC,ADC_CHANNEL_0);//채널0의 변환된 결과를 배열0번에 담음

  while((ADC->ADC_ISR & ADC_ISR_EOC1) != ADC_ISR_EOC1);//1번 채널의 변환이 끝날때까지 기다린다.

  data[1]= adc_get_channel_value(ADC,ADC_CHANNEL_1);//채널1의 변환된 결과를 배열1번에 담음

 

  

//ADC변환결과를 시리얼 플로터로 확인하자

  Serial.print(data[0]);

  Serial.print(" ");

  Serial.println(data[1]);

  delay(20);

}