13.电压参考寄存器(Voltage Reference Register,CAL)
6.4 基于构件的AD编程
6.4.1 AD构件的函数原型设计
AD 模块具有初始化、采样、中值滤波、均值滤波等操作。按照构件的思想,可将它 们封装成独立的功能函数,以下是各功能函数的原型设计:
(1)AD 转换模块初始化 void ADinit (void)
(2)采样一次 ANn(0-7)路模拟量的 AD 值 uint16 ADonce(uint16 ANn)
(3)采用中值滤波,获取 ANn(0-7)路模拟量的 AD 值 uint16 ADmid(uint16 ANn)
(4)采用均值滤波,获取 ANn(0-7)路模拟量的 AD 值,N 为均值滤波次数 uint16 ADave(uint8 N, uint16 ANn)
6.4.2 AD构件的头文件
AD 构件头文件中主要包括相关宏定义、AD 的功能函数原型说明等内容。
#ifndef _AD_H
#define _AD_H //头文件
#include "mcf52233.h" //CodeFire 52233 MCU映像寄存器名定义 #include "sysinit.h" //配置头文件
#include "type.h" //类型定义头文件 #include "GeneralFun.h" //包含通用函数头文件
//---*
//函数名:ADinit * //功 能:AD转换模块初始化 * //参 数:无 * //返 回:无 * //---*
void ADinit (void); //AD转换模块初始化
//---*
//函数名:ADonce * //功 能:采集一次AN0-AN7中任意一路的模拟量的AD值 * //参 数:ANn:模拟量输入端口号(范围:0-7) * //返 回:无符号结果值(范围:0-4095) * //---*
uint16 ADonce(uint16 ANn); //采集某路模拟量的AD值
//---*
//函数名:ADmid * //功 能:中值滤波,获取AN0-AN7中任意一路的模拟量的AD转换结果的中值滤波值 * //参 数:ANn:模拟量输入端口号(范围:0-7) *
第 6 章 MCF52233 的 AD 转换模块
146
//返 回:中值滤波后的结果(范围:0-4095) * //---*
uint16 ADmid(uint16 ANn); //中值滤波
//---*
uint16 ADave(uint8 N, uint16 ANn); //均值滤波
#endif
void ADinit (void) //AD转换模块初始化 {
//1.循环顺序扫描模式,AN0-7设为单端输入,禁止中断,停止转换 MCF_ADC_CTRL1 = 0b0101000000000010;
// ||||||||||| |||___SMODE=2,循环顺序扫描
// |||||||||||_______CHNCFG=0,8路ANn都设为单端输入 // |||||||___________HLMTIE=0,禁止超上限中断
// ||||||____________LLMTIE=0,禁止超下限中断 // |||||_____________ZCIE=0,禁止过零中断
147
MCF_ADC_CTRL2 = 0b0000000000001001;
// |||||____DIV=20,ADC时钟频率3MHz
// (fBUS=60MHz,fAD=fBUS/((9+1)*2=3MHz) //3.转换器A和B和参考电压电路上电,上电延时10个ADC时钟周期
MCF_ADC_POWER = 0b0000000010100100;
// | ||||||||||____PD0=0,转换器A上电
while (MCF_ADC_POWER & MCF_ADC_POWER_PSTS0);
//8.等待转换器B上电完成
while (MCF_ADC_POWER & MCF_ADC_POWER_PSTS1);
//9.向START0写1,启动扫描
uint16 ADonce(uint16 ANn) //采集某路模拟量的AD值 {
uint16 result;
//等待数据准备好
while ((MCF_ADC_ADSTAT & (1 << ANn))==0);
//取得结果
result = (MCF_ADC_ADRSLT(ANn) & 0x7FF8) >> 3;
return result;
}
//---*
//函数名:ADmid *
第 6 章 MCF52233 的 AD 转换模块
uint16 ADmid(uint16 ANn) //中值滤波 {
uint16 ADave(uint8 N, uint16 ANn) //均值滤波 { 和 2( ADLST1 和 ADLST2)、采样禁止寄存器(ADSDIS)、上限和下限寄存器(ADLLMTn 和 ADHLMTn)、以及偏移量寄存器(ADOFSn)等进行设置,而是使用这些寄存器复位 时的默认值。默认情况下,不对结果寄存器中的值进行过零检查;采样槽 SAMPLE0-7 分 别与模拟量输入通道 ANn0-7 一一对应;开放全部 8 个采样槽;不对原始转换结果进行超 上下限检查;8 个结果寄存器中存放无符号转换结果。初始化时,还将 AD 模块配置为单 端输入的循环顺序扫描模式,在随书光盘中,提供了单端差分混合型输入的单次非同步并
149
行扫描的 AD 程序实例,两者的主要差别在于对控制寄存器 1 和 2 的设置,这里不再展开 介绍。值得注意的是,如果 ANx 和 ANy 是一对差分输入,那么读 ANx 或 ANy 对应的结 果寄存器都能获得该差分输入的转换结果。通过这两个例子的比较学习,对于 MCF52233 AD 模块的其他运行模式,读者应该也能举一反三、触类旁通了。