Busan IT/ARM Controller2015. 9. 18. 09:53

==================================Outline====================================

ADC 전압측정

----------------------------------------------------------------------------

 

ADC 전압측정

 

 

ADC를 동작시키기 위한 코드를 계속 작성해보자.






 

- 전역변수로 ADC 초기화 플래그를 설정해 주어 ADC초기화 함수의 끝에서 해당 플래그를 1로 변환 시킨다.

 

- ADC를 동작 시키는 함수에서 ADC 초기화 함수가 1일 때만 작동하도록 처리해준다.

 

- ADC를 동작시키는 함수에서 ADC기능을 동작시킨다(ADC_CR, ADC_START)

 

- ADC가 데이터를 변환시키는 동안 프로그램을 잡아준다.(ADC_SR, ADC_DRDY)

 

- 변환 값을 ADC동작함수의 반환 값으로 해준다, 이 때 유효한 데이터만 추출하기 위해

 

마스크를 사용한다.(ADC_LCDR, ADC_LDATA)

 

- 메인함수에서 ADC동작 함수로부터 받은 값을 버프에 넣어 출력한다.


그리하여 코드는 아래와 같으니...


/*** ADC.c ***/


#include <project.h>

unsigned int uiInitFlag;

void ADC_Init()
{
  *AT91C_PMC_PCER = 1 << AT91C_ID_ADC;  //CLK supply to ADC
  *AT91C_ADC_CR = AT91C_ADC_SWRST;    //resets the ADC simulating a hardware reset
  *AT91C_ADC_CHER = AT91C_ADC_CH4;    //enables ADC channel 4
  //*AT91C_ADC_MR = AT91C_ADC_PRESCAL & (AT91C_ADC_LOWRES_10_BIT);  
  //*AT91C_ADC_MR = 0x05 << 8 &  (~(0 << 4));
  ///////////////// as far 9/16 //////////////////
  //*AT91C_ADC_CR = AT91C_ADC_START;    //ADC start

  *AT91C_ADC_MR = AT91C_ADC_LOWRES_10_BIT | (0x05 << 8);
  
  uiInitFlag = 1;  
  
}
int ADC_Run()
{
  if(uiInitFlag == 0)
  {
    return -1;
  }
  *AT91C_ADC_CR = AT91C_ADC_START;    //ADC start
  while(0 ==  (*AT91C_ADC_SR &  AT91C_ADC_DRDY) );  //hold while converting
  return (int)(*AT91C_ADC_LCDR & AT91C_ADC_LDATA);    //returning ADC value
}
 

/*** main.c ***/


#include <project.h> 
#include <stdlib.h>
#include <string.h>

volatile unsigned int uiCnt;

#define Delay(x) for(uiCnt = 0; uiCnt < x; ++uiCnt)

void Init(void)
{
  LCD_Init();
  ADC_Init();
    
  return;
}

int main(void)
{  
  unsigned char ucVal[] = "000"//ADC value containing variable
  int iVal;
  int iCnt;
  
  Init();
  
  while(1)
  {
    iVal = ADC_Run();
    if(-1 == iVal)
    {
      LCD_Print("Error");
      while(1);
    }
    /*
    ucVal[0] = iVal / 1000 + '0';
    ucVal[1] = (iVal % 1000) / 100 + '0';
    ucVal[2] = (iVal % 100) / 10 + '0';
    ucVal[3] = iVal %10 + '0';*/

    iVal = (iVal * 33)/1024;   
    
    ucVal[0= iVal/10 + '0';
    ucVal[1= '.';
    ucVal[2= iVal%10 + '0';
    

    LCD_Inst(LCD_INST_HOME);
    LCD_Print(ucVal);
    for(iCnt = 0; iCnt <10; ++iCnt)
      Delay(100000);

  }
  
  

  return 0;



반응형
Posted by newind2000