📄 adc.c
字号:
//====================================================================
// File Name : Adc.c
// Function : 44b0 ADC function
// Program : liu
// Date : 2009-3-16
// Version : 0.0
//====================================================================
#include <string.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\Adc.h"
#include "..\inc\def.h"
#define CHANNEL_NUM 8
#define REQCNT 10
#define ADC_FREQ 2500000
//#define ADC_FREQ 1250000
//#define LOOP 1
#define LOOP 10000
#define PCLK 40000000
int ReadAdc(int ch); //Return type is int, Declare Prototype function
volatile U32 preScaler;
//==================================================================================
void Test_Adc(void)
{
int i,key;
//int a=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0; //Initialize variables
int channel[CHANNEL_NUM];
int selectedChannel = 0;
Uart_Printf("[ ADC_IN Test ]\n");
Uart_Printf("0. AIN0 1. AIN1 2.AIN2 3.AIN3 4.AIN4 5.AIN5 6.AIN6 7.AIN7 8.AIN0-AIN7\n\n");
Uart_Printf("Select : ");
key = Uart_GetIntNum();
Uart_Printf("\n\n");
preScaler = ADC_FREQ;
//Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);
preScaler = PCLK/ADC_FREQ -1; //PCLK:50.7MHz
//ADC conversion time = 5CYCLES*(1/(ADC Freq.)), ADC Freq. = PCLK/(ADCPSR+1)
// Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);
Uart_Printf("[ AIN %d ]\n", key);
switch (key) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7: Uart_Printf("[ AIN %d ]\n", key);
for (i = 0; i < REQCNT; i++) {
selectedChannel = ReadAdc(key);
Uart_Printf("%04d\n", selectedChannel);
}
break;
case 8:
for (i = 0; i < CHANNEL_NUM; i++) {
channel[i] = ReadAdc(i);
Uart_Printf("AIN%d:\t %04d\n", i, channel[i]);
}
break;
}
rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2); //stand by mode to reduce power consumption
// Uart_Printf("\nrADCCON = 0x%x\n", rADCCON);
}
//==================================================================================
int ReadAdc(int ch)
{
int i;
static int prevCh=-1;
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
if(prevCh!=ch)
{
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
for(i=0;i<LOOP;i++); //delay to set up the next channel
prevCh=ch;
}
rADCCON|=0x1; //start ADC
while(rADCCON & 0x1); //check if Enable_start is low
// while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high
return ( (int)rADCDAT & 0x3ff );
}
//==================================================================================
volatile char end_test;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -