南京立超电子科技有限公司 www.dycmcu.com
2、ADC控制寄存器
助记符 ADCON1 描述 ADC控制寄存器1。AD模块使能、启动、参考电压的选择、及序列转换完成读/写 中断标志、事件触发设置、转换完成中断允许、连续转换功能使能位 ADCON2 ADC控制寄存器2。序列通道总数设置、读/写 相邻通道之间时间间隔设置 ADT ADC时钟控制寄存器。设置ADC时钟读/写 与采样时间、ADC精度模式选择 SEQCON ADCH1 映射控制寄存器。通道映像控制 ADC通道配置寄存器1。设置AD通道读/写 引脚为AD通道功能或I/O功能 ADCH2 ADC通道配置寄存器2。设置AD通道读/写 引脚为AD通道功能或I/O功能 SEQCHx 通道寄存器。指定序列中的通道以及转读/写 换顺序,x = 0 -15 ADDxL ADDxH
ADC结果寄存器低位 ADC结果寄存器高位 只读 只读 00000000 00000000 96H 97H ----0000 96H 0000---0 A5H 读/写 0--00000 00000000 A6H 95H 00000000 94H 00000000 92H 访问 复位值 00000000 地址 93H 3、ADC功能函数
ADC主要包括ADC的初始化以及对ADC结果的读取,对于ADC的初始化用户直接调用Init_AD(),而对于ADC的结果将在ADC中断服务程序中读取。
3.1 初始化ADC
在调用初始化函数前,需要设置系统的时钟频率,配置参数请看程序清单 1。
程序清单 1 时钟配置
#define OSCCLK 27000000UL //定义时钟源频率
#define FREQUENCY (OSCCLK/12) //系统的时钟频率为时钟源频率的12分频
4
南京立超电子科技有限公司 www.dycmcu.com
例程中使用的是G80F960内部27M高速时钟源,系统时钟为该时钟源的12分频,即系统时钟频率为2.25M。
对于ADC的初始化主要包括时钟频率的选择、采样时间长短的选择、基准电压的选择、转换通道的选择、精度的选择和采样间隔的选择。对于ADC的时钟周期tAD可以通过ADT时钟控制寄存器中的TADC[3:0]位进行设置,最小周期为tsys,最大为192tsys。采样时间可以通过ADT时钟控制寄存器中的TS[3:0]位设置,最小周期为2tAD,最大为15tAD。以程序清单中的ADT设置为例,其ADC时钟周期tAD为16tsys(7.1uS),采样时间为15tAD(107uS)。ADC的精度可以通过ADCON2寄存器中的MODE位选择,可以选择10Bit或者选择12Bit,当精度为10Bit时,一个通道的转换时间为(12tAD+采样时间),而采用12Bit时,一个通道的转换时间为(12tAD+采样时间),因此在10Bit精度下一个通道的转换时间比12Bit精度下节省2tAD,在精度要求不高的情况下,10Bit精度可以提高ADC的转换效率。为了提高测量的精确性基准电压可以通过P0.5端口外接基准电压,默认情况下基准电压源为单片机供电电压VDD,采用哪种基准电源源可以通过ADCON1寄存器的REFC位进行选择。从一个通道转换完毕到下一个通道开始采样或者一次转换完毕到启动下一次转换之间的时间间隔可以通过ADCON2寄存器的TGAP[2:0]进行设置,时间间隔最小为0,最大为128 tAD。转换通道总数可以通过ADCON2中的GRP[3:0]进行设置。需要注意的是,在进行ADC转换之前需要通过ADCH1寄存器和ADCH2寄存器将相应端口配置为模拟输入口。当一次ADC转换转换完成后, ADCON1寄存器中的ADCIF位将由硬件置1,此时若ADCON1中ADCIE位为1,同时IEN0寄存器中的EADC和EA位为1,则将触发转换完成中断,ADCIF位只能由软件清除。
ADC初始化函数请看程序清单 2。
程序清单 2 ADC初始化
void Init_ADC(void) {
ADT = Bin(01111111); //ADC时钟周期为tad=16tsys,采样时间为15tad ADCON1 = Bin(10100000); //打开连续转换功能, 基准电压源为VDD ADCON2 = Bin(00000000); //转换通道总数为1,12Bit精度,时间间隔为0 ADCH1 = Bin(00000001); //将P0.2设置为模拟输入口, ADCH2 = Bin(00000000);
5
南京立超电子科技有限公司 www.dycmcu.com
SEQCHx=ADC_CH0; //确定转换通道 }
SEQCON = Bin(10000000); //转换结果右对齐 EA=1; //使能总中断 EADC=1;
//使能ADC转换中断
ADCON1|= Bin(00001000);
ADCON1|=0x01; //开始ADC转换
3.2 ADC结果读取
ADC的转换结果存放于ADC结果寄存器ADDxL和ADDxH中,SEQCON寄存器中的REG[3:0]位来确定x的值,转换结果的存放方式可以通过SEQCON寄存器的ALR位进行设置,有两种方式可供选择,左对齐(ALR置0,高8位存放在寄存器ADDxH中,低4位存放在ADDxL中的高4位)和右对齐(ALR置1,低4位存放在寄存器ADDxH的低4位中,高8位存放在ADDxL中)。一次通道转换完毕后,数据会立即更新并存放在ADDxL/H中,并将ADCON1寄存器中的ADCIF位置1,此时若ADCON1中ADCIE位为1,同时IEN0寄存器中的EADC和EA位为1,则将进入中断服务函数,ADCIF位只能由软件清除。
本例中,对于ADC结果的读取是在中断服务程序中完成的,中断服务程序见程序清单 3。
程序清单 3 ADC中断服务程序
void ISR_ADC(void) interrupt 6 {
if(ADCON1&0x40) {
ADCON1&=~0X01; //暂停ADC转换 ADCON1&=~0x40; //清除转换完成中断标志 SEQCON=0X80; //转换结果右对齐 ADC_Result=ADDxH&0X0F; //转换结果高4位 ADC_Result<<=8;
ADC_Result+=ADDxL; //转换结果低8位
6
南京立超电子科技有限公司 www.dycmcu.com
}
}
ADCON1|=0X01; //重新开始转换
4、ADC测试用例
以将P0.2作为模拟输入口,对电压进行采样计算为例对ADC的操作进行说明。 void main(void) { }
7
unsigned char v=0;
FsysInit(); //初始化系统时钟 Init_AD(); //初始化ADC EA=1;
//打开中断
EADC=1; while(1) { }
v=ADC_Result;
v=(int)(v*1.0/1024*BaseVolt);//计算电压值,单位为mV _nop_(); _nop_(); _nop_();
南京立超电子科技有限公司 www.dycmcu.com
5、规格更改记录
版本 V1.00 初始版本 版本记录 2015.2.29 6、免责声明
规格书中所出现的信息在出版当时相信是正确的,然而本公司对于说明书的使用不负任何责任。文中提到的应用目的仅仅是用来做说明,本公司不保证或表示这些没有进一步修改的应用将是适当的,也不推荐它的产品使用在会由于故障或其它原因可能会对人身造成危害的地方。本产品不授权使用于救生、维生器件或系统中做为关键器件。
本公司拥有不事先通知而修改产品的权利,对于最新的信息,请参考我们的网址 : http//www.dycmcu.com
8
相关推荐: