2440裸機程序——AD轉換實驗

工程當中需要添加 S3C2440A.s ;2440lib.c;main.c;adc.c 這四個程序。


主程序:

/*********************************************************************************************
* File name: main.c
* Author: ZXL 
* Description: 3.3V輸入變壓器分壓後,輸入AD轉換器轉換,最後用串口打印該分壓值
* History: 2013.5.9
*********************************************************************************************/


#include "def.h"
#include "option.h"
#include "2440addr.h"     
#include "2440lib.h"
   
void dely(U32 tt)
{
   U32 i;
   for(;tt>0;tt--)
        for(i=0;i<10000;i++);
}


void init()
{
U32 i;
U8 key;
U32 mpll_val=0;
    i = 2 ;
switch ( i ) //設置2440的時鐘頻率
{
case 0: //200
key = 12;
mpll_val = (92<<12)|(4<<4)|(1);
break;
case 1: //300
key = 13;
mpll_val = (67<<12)|(1<<4)|(1);
break;
case 2: //400
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
case 3: //440!!!
key = 14;
mpll_val = (102<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}
//MDIV=92,PDIV=1,SDIV=1 通過配置MPLLCON,MPLL確定,即FCLK=400MHZ確定
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);  //FCLK:HCLK:PCLK = 1:1/4:1/8 =400M:100M:50M
    
Port_Init();
  
Uart_Init(0,115200);
    Uart_Select(0);   
Uart_Printf("\n ADC Test begin!!!\n"); 
}  
   
int main(int argc, char **argv)
{
U32 adc_value;
float m;


init();
adc_init(); /*adc初始化*/
while(1)
    {    
        adc_value=read_adc();  /*讀取轉換值*/
delay(100);  
m=adc_value*3.3/1024;
Uart_Printf("\n 3.3V輸入變壓器並經AD轉換後電壓爲:\n"); 
Uart_Printf("\n ADC change result:%f\n",m);
    }
}




AD轉換程序:


/*********************************************************************************************
* File name: adc.c
* Author: ZXL 
* Description: 3.3V輸入變壓器分壓後,輸入AD轉換器轉換,最後用串口打印該分壓值
* History: 2013.5.9
*********************************************************************************************/


#include "def.h"
#include "option.h"
#include "2440addr.h"     
#include "2440lib.h"


#define ADC_FREQ 2500000 //AD轉換頻率 
U32 preScaler; //設置AD爲幾分頻  


void adc_init()
{
int channel=0; //選擇輸入通道,AIN0,對應開發板上W1可調電阻

preScaler = ADC_FREQ;  /*設置分頻時鐘*/
Uart_Printf("\n AD轉換頻率爲:%dHZ\n",preScaler);
preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M  設置AD分頻係數
Uart_Printf("\n AD分頻係數PRSCVL爲:%d\n",preScaler);
rADCCON = (1<<14)|(preScaler<<6)|(channel<<3);//設置通道0的
dely(100);
}
  
int read_adc()
{    
   rADCCON |= 0x01; /*設置開始AD轉換*/
   while(rADCCON & 0x1); //確認AD轉換已經開始  
   while(!(rADCCON & 0x8000)); /*檢查轉換是否結束*/    
   return ( (int)rADCDAT0 & 0x3ff );  //返回AD轉換後的結果
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章