您的位置:首页 > 其它

ARM裸机程序设计—ADC驱动程序设计

2011-06-02 21:42 381 查看
对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)); //返回获取的值
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: