본문 바로가기
코스웨어/15년 스마트컨트롤러

20150917-19번-안향진 - ADC

by 알 수 없는 사용자 2015. 9. 18.
728x90
반응형

<ARM>



=ADC




=ADC_Init()함수에 INIT FLAG 추가


=ADC_Run()함수 추가

1. Init 완료전이면 return -1;


2. ADC_DRDY가 HIGH(CONVERSION완료)되기까지 대기








3. 변환된 값중 하위 10 BIT 만 추출




#define AT91C_ADC_LDATA       (0x3FF <<  0// (ADC) Last Data Converted





=

<ADC.H>

#ifndef __ADC_H__
#define __ADC_H__
#include <AT91SAM7S256.h>

#define PRESCAL  8

void ADC_Init(void);
int ADC_Run(void
);

#endif //__ADC_H__


<ADC.C>

#include "adc.h"

unsigned int uiInitFlag = 0;  // INIT FLAT 

void ADC_Init(void)
{
  *AT91C_PMC_PCER 
= 1<<AT91C_ID_ADC;  //Peripheral Clock Enable Register //p34 // 전원 공급
  *AT91C_ADC_CR = AT91C_ADC_SWRST;    // (ADC) Software Reset
  *AT91C_ADC_CHER = AT91C_ADC_CH4;    // (ADC) ADC Channel Enable Register
  *AT91C_ADC_MR =  (5 << PRESCAL) &(~(AT91C_ADC_LOWRES_8_BIT));// PRESCALE : 5 -> 4M clk   분해능 10BIT 
  uiInitFlag = 1;
  
return;
}

int ADC_Run(void)
{
  
if(0 == uiInitFlag)
  {
    
return -1;
  }

  *AT91C_ADC_CR 
= AT91C_ADC_START;  // (ADC) Start Conversion
  while(0==(*AT91C_ADC_SR &AT91C_ADC_DRDY));  // High 신호 대기 (convert완료 대기 )
  return (int)(*AT91C_ADC_LCDR& AT91C_ADC_LDATA); // 하위 10bit 추출 
}


<PROJECT.H>

#ifndef _PROJECT_H
#define _PROJECT_H

#include "AT91SAM7S256.h"

#define MCK  48000000

// 2008.09.10.
#ifndef __ASSEMBLY__
#include "lcd.h"
#include 
"adc.h"

void default_fiq_handler();
void default_irq_handler();
void default_spurious_handler();
#endif
// 2008.09.10.

#endif  // _PROJECT_H


<MAIN.C>

#include <project.h> 

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

int main(void)
{    
  
volatile unsigned int uiCnt;  
  
unsigned char ucVal[] = "1023";
  
int iVal;
  
  Init();
  
while (1)
  {
    iVal 
= ADC_Run();
   

    if(-1 == iVal)
    {
      LCD_Print(
"Error");
      
while(1);
    }
    ucVal[
0= '0' + (iVal/1000);
    ucVal[
1= '0' + (iVal%1000)/100;    
    ucVal[
2= '0' + (iVal%100)/10;    
    ucVal[
3= '0' + (iVal%10);  
   
    
    LCD_Inst(LCD_INST_HOME);
    LCD_Print(ucVal);
    
for(uiCnt = 0; uiCnt < 65000; ++uiCnt);
    
for(uiCnt = 0; uiCnt < 65000; ++uiCnt);
    
for(uiCnt = 0; uiCnt < 65000; ++uiCnt);
    
for(uiCnt = 0; uiCnt < 65000; ++uiCnt);
  }
  
while (1);
  
return 0;
}


=결과

1. 온도센서 연결




2. 전원 / GND 연결



-소스파일


 20150917_ARM_ADC_LCD_DISPLAY.zip


728x90