//利用查询方式,BURST转换获取AD转换值。
#include "config.h" uint32 ADC_Data;
//延时 void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) for(i=0; i<5000; i++); }
#define UART_BPS 115200 /* 定义通讯波特率 */ //初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200 void UART0_Ini(void) { uint16 Fdiv; U0LCR = 0x83; // DLAB = 1,可设置波特率 Fdiv = (Fpclk >> 4) / UART_BPS; // 设置波特率 U0DLM = Fdiv >> 8; U0DLL = Fdiv % 256; U0LCR = 0x03; } //向串口发送字节数据,并等待发送完毕。 void UART0_SendByte(uint8 data) { U0THR = data; // 发送数据 while( (U0LSR&0x40)==0 ); // 等待数据发送完毕 }
//ADC初始化 void ADC_Init(void) { ADCR = (3 << 2) | // 选择通道AIN2,AIN3 ((Fpclk / 10000 - 1) << 8) | // CLKDIV = Fpclk / 10000 - 1 ,即转换时钟为10KHz //如果这儿设定为11kHz的话,下面这样就得不到正确结果,看来这个时钟对芯片还是有影响的。 (1 << 16) | // BURST = 1 ,硬件控制转换操作 (0 << 17) | // CLKS = 0 ,使用11clock转换 (1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式) (0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式) (0 << 24) | // START = 0 ,不理会是否启动ADC转换 (0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换) }
int main(void) { uint8 data[2]; PINSEL0 = 0x00000005; // 设置P0.0、P0.1连接到UART0的TXD、RXD PINSEL1 = 0x14000000; // 设置P0.29、P0.30连接到AIN2、AIN3 UART0_Ini(); // 初始化UART0 ADC_Init(); while(1) { while( (ADDR&0x80000000)==0 ); // 等待转换结束 ADC_Data = ADDR; // 读取ADC结果 ADC_Data = (ADC_Data>>6) & 0x3FF; data[0] = ADC_Data >> 8; data[1] = ADC_Data; UART0_SendByte(data[0]); UART0_SendByte(data[1]); DelayNS(10); } return(0); }
//为什么串口发出的数不是A,B,A,B,A……这样的两个通道轮换采集的数,而是没有规律的两个通道的数? |