以中断方式实现AD采集,,在程序中
最近又看了一下ADC模块,发现该模块还是有东西可以说的。首先,模式又很多种,有差分的16位,13,11,9位模式。单通道的也同样有该几个模式。
主要有个偏移寄存器还不是太懂。。怎么用。?
以下是结构框图,任何一个模块,结构框图很重要。一定要高清搞透。
ADC有两对电压参考,一对是电压参考引脚上的电压
一对是外部链接的可选电压。
还有模拟地和模拟电压。电压选择可以通过SC2[REFSEL]位来选择。
ADC_SC1A:通常只用这一个状态控制寄存器,
该寄存器有转换完成标志位;COCO.中断使能:AIEN;差分通道选择DIFF。通道选择ADCH
以上的基本功能也不用说太多了,差不多应该能看出来。通道选择里面可以选择温度传感器。
ADC_CFG1配置寄存器
配置低功耗模式ADLPC,模块分频ADIV。长采样配置ADLSMP(长采样还是短采样)MODE模式选择。输入时钟选择ADICLK
ADC_CFG2 :MUXSEL复用功能选择。这个是用来选择AD通道的a还是b的。
ADACKEN;异步时钟输出选择:该位可以来选择异步时钟,时钟源中有一个是异步时钟,可以通过外接时钟来选择。
ADHSC:高速配置。快速转换序列。
ADLSTS:长采样时间选择,长采样可以有很多种长采样时间。0,1,2,3分别对应20ADCK 12ADCK 6 ADCK 2ADCK
ADC_RN:该寄存器存放的是结果。通过查芯片手册开业看到相应的精度对应的值。
ADC_CV:比较寄存器,该比较寄存器一共有两个CV1,CV2.通过这两个寄存器可以通过硬件来进行比较采 得的AD值,范围可以再两个值之间,之后。。。。
主要通过ADC_SC2来进行配置功能。SC2中还包含 硬件采样次数。
OFS:
偏移寄存器,这个不是很懂。
下面就是几个用来校准的寄存器。
直接看代码可以看出点东西。
ADC_SC3:包括校验和校验标志,连续采集,硬件使能,硬件均值滤波。
//===========================================================================
//函数名称:ADC_Cal
//函数返回:函数执行状态。0=成功,其它为异常。
//功能概要:校验ADC.
//===========================================================================
uint_8 ADC_Cal(ADC_MemMapPtr adcmap)
{
uint_16 cal_var;
ADC_SC2_REG(adcmap) &= ~ADC_SC2_ADTRG_MASK ; // ADTRG置0使能软件触发
ADC_SC3_REG(adcmap) &= ( ~ADC_SC3_ADCO_MASK & ~ADC_SC3_AVGS_MASK ); //设置仅一次转换,清硬件均值采样次数
ADC_SC3_REG(adcmap) |= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(3) ); // 设置硬件均值功能.
ADC_SC3_REG(adcmap) |= ADC_SC3_CAL_MASK ; // 开始校验
while ( (ADC_SC1_REG(adcmap,0) & ADC_SC1_COCO_MASK ) == 0 ); // Wait calibration end
if (BGET(ADC_SC3_CALF_SHIFT,ADC_SC3_REG(adcmap))== 1 )
{
return 1; // 校验失败
}
// Calculate plus-side calibration
cal_var = 0x00;
cal_var = ADC_CLP0_REG(adcmap);
cal_var += ADC_CLP1_REG(adcmap);
cal_var += ADC_CLP2_REG(adcmap);
cal_var += ADC_CLP3_REG(adcmap);
cal_var += ADC_CLP4_REG(adcmap);
cal_var += ADC_CLPS_REG(adcmap);
cal_var = cal_var/2;
cal_var |= 0x8000; // 设置最高有效位
ADC_PG_REG(adcmap) = ADC_PG_PG(cal_var);
// Calculate minus-side calibration
cal_var = 0x00;
cal_var = ADC_CLM0_REG(adcmap);
cal_var += ADC_CLM1_REG(adcmap);
cal_var += ADC_CLM2_REG(adcmap);
cal_var += ADC_CLM3_REG(adcmap);
cal_var += ADC_CLM4_REG(adcmap);
cal_var += ADC_CLMS_REG(adcmap);
cal_var = cal_var/2;
cal_var |= 0x8000; // 设置最高有效位
ADC_MG_REG(adcmap) = ADC_MG_MG(cal_var);
ADC_SC3_REG(adcmap) &= ~ADC_SC3_CAL_MASK ; //清校验标志位
return 0;
}
后面的功能描述中还包含了一个转换时间的计算,ADCK时钟。
校准功能步骤“
1.定义一个16进制的数,
2.将CLP0,CLP1,CLP2,CLP3,CLP4和CLPS加到该数中。
3.将该数除以2.
4.设置改为的最高位位1,
5.将该数最后的值放入到PG寄存器中。校验可能需要14k个ADCK和100个总线周期,对于8M的时钟源,差不多是1.7ms。
用户偏移功能:不是很懂该功能的意思。
温度传感器。芯片内部集成了一个温度传感器。
差不多了。功能很强大,却不知道如何使用