A/D转换器
A/D转换器,又称模/数转换器,顾名思义,就是把模拟信号数字化。
由于系统的实际处理对象往往都是一些模拟量(如温度、压力、位移、图像等),要使计算机或数字仪表能识别和处理这些信号,必须首先将这些模拟信号转换成数字信号,这就必须用到A/D转换器。
A/D转换器的一般步骤
模拟信号进行A/D转换的时候,从启动转换到转换结束输出数字量,需要一定的转换时间,在这个转换时间内,模拟信号要基本保持不变。否则转换精度没有保证,特别当输入信号频率较高时,会赞成很大的转换误差。要防止这种误差的产生,必须在A/D转换开始时将输入信号的电平保持住,而在A/D转换结束后,又能跟踪输入信号的变化。因此,一般的A/D转换过程是通过取样、保持、量化和编码这4个步骤完成的。一般取样和保持主要由采样保持器来完成,而量化编码就由A/D转换器完成。
实例
1 //main.c 2 3 #include "2410lib.h" 4 5 externvoid adc_test(void); 6 7 int main(int argc,char **argv) 8 9 { 10 11 sys_init(); // Initial s3c2410's Clock, MMU, Interrupt,Port and UART 12 13 uart_printf(" Embest S3CEB2410 Evaluation Board "); 14 15 while(1) 16 17 { 18 19 adc_test(); 20 21 } 22 23 } 24 25 //adc.c 26 27 #include "2410lib.h" 28 29 #define REQCNT 100 30 31 #define ADC_FREQ 2500000 32 33 #define LOOP 10000 34 35 volatile UINT8T unPreScaler; 36 37 volatilechar nEndTest; 38 39 void adc_test(void) 40 41 { 42 43 int j; 44 45 UINT16T usConData; 46 47 float usEndData; 48 49 uart_printf(" Adc Conversion Test Example "); 50 51 uart_printf(" ADC_IN Test,channel 2 "); 52 53 uart_printf(" ADC conv. freq. = %dHz ",ADC_FREQ); 54 55 unPreScaler = PCLK/ADC_FREQ -1; 56 57 rADCCON=(1<<14)|(unPreScaler<<6)|(2<<3)|(0<<2)|(1<<1);//enable prescaler,ain2,normal,start by read 58 59 uart_printf(" Please adjust AIN2 value! "); 60 61 uart_printf(" The results of ADC are: "); 62 63 usConData=rADCDAT0&0x3FF; 64 65 for(j=0;j<20;j++) // sample and show data both by UART and leds 66 67 { 68 69 while(!(rADCCON & 0x8000)); 70 71 usConData=rADCDAT0&0x3FF; 72 73 usEndData=usConData*3.3000/0x3FF; 74 75 uart_printf(" %0.4f ",usEndData); 76 77 delay(10000); 78 79 } 80 81 uart_printf(" end. "); 82 83 } 84 85 //sys_init.c主要代码 86 87 void sys_init() 88 89 { 90 91 change_clock_divider(1,1); // 1:2:4 92 93 change_value_MPLL(M_MDIV,M_PDIV,M_SDIV); // Fin=12MHz FCLK=202.8MHz 94 95 delay(0); // adjust the delay count 96 97 port_init(); 98 99 beep(1); 100 101 interrupts_init(); 102 103 uart_init(PCLK, 115200, UART0); 104 105 uart_init(PCLK, 115200, UART1); 106 107 #ifdef CLK124_200M 108 109 change_value_MPLL(88,1,1); // Fin=12MHz FCLK=192MHz 110 111 uart_init(192000000/4, 115200, UART0); 112 113 uart_init(192000000/4, 115200, UART1); 114 115 #endif 116 117 uart_select(UART0); 118 119 uart_printf (" boot success... "); 120 121 delay(500); 122 123 beep(0); 124 125 }//sys_init