• 沒有找到結果。

基于构件的AD编程

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 模块的其他运行模式,读者应该也能举一反三、触类旁通了。