对ADC裸机程序设计做个总结: 首先是程序设计流程: 一、时钟频率设置 二、ADC初始化 1、转换通道选择(ADCCON寄存器中的[5:3]位) 2、转换频率设置(主要是设置预分频器的值)(ADCCON寄存器中的[13:6]位) 3、预分频器使能(ADCCON寄存器中的第14位) 三、读取AD转换值 1、转换启动(ADCCON寄存器中的第0位) 2、判断转换是否启动(若果启动了,那么第0位会被清0) 3、判断转换是否结束(ADCCON寄存器中的第15位,如果结束了,此位会被置1) 4、读取转换的值(ADCDAT0寄存器的[9:0]位,且数值范围在0-0x3FF之间)下面是寄存器的具体信息:
注释:其他包含文件全部采用国嵌例程里面的文件,也就是说只需更改主函数即可。想要查看转换后的值,我是采用AXD+jlink仿真调试,全速运行后,采集到数据之后,停止,然后把鼠标放在获取的那个值上即可查看出转换后的实际值是多少。
源程序:
//Main.c
/*********************************************实现功能:对开发板自带的电压进行AD转换,得到数字量*********************************************/#define GLOBAL_CLK 1#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "mmu.h"#include "profile.h"#include "memtest.h"
void delay(int times);void SET_CLK(void);void ADC_INIT(void);int Read_ADC(int channel);int adc_value=0;/**********************************************主函数***********************************************/int Main(void){ /****时钟频率初始化******/ SET_CLK(); //MMU_Init(); /****ADC初始化***********/ ADC_INIT(); /****读取AD转换的值****/ while(1) { adc_value=Read_ADC(0); delay(100); } }/**********************************************延时函数***********************************************/void delay(int times){ int x,y; for(x=times;x>0;x--) for(y=400;y>0;y--);}/**********************************************时钟频率的设置***********************************************/void SET_CLK(void) //时钟频率的设置{ //LOCKTIME不需要设置,如没设置,系统将自动选择LOCKTIME rMPLLCON = 0; rMPLLCON = (0x7f<<12)|(0x2<<4)|(0x2<<0); //设置FCLK的频率为405MHZ rCLKDIVN = (0x1<<2)|(0x1<<0); //设置FCLK:HCLK:PCLK=1:4:8 PCLK=50MHZ }/*************************************************ADC初始化**************************************************/void ADC_INIT(void){ rADCCON = (0<<3)|(0x31<<6)|(0x1<<14); //转换通道选择和转换频率设置 ADC转换频率=PCLK/(转换预分频值+1) delay(100); //主要作用是给一点时间去设置频率} /*************************************************读取AD转换后的值**************************************************/int Read_ADC(int channel){ /****转换启动************/ rADCCON |= 1<<0; //转换启动 while(rADCCON & 0x01); //判断转换是否启动
/****判断转换是否结束****/ while(!(rADCCON & 0x8000)); return((int)(rADCDAT0 &0x3ff)); //返回获取的值}