S12系列单片机的AD转换特性
AD转换就是模数转换,就是把模拟信号转换成数字信号。Freescale的S12系列单片机的AD转换模块有以下特点:
1) 转换精度可配置:8位/10位/12位
2) 在STOP模式下,使用内部时钟可以进行AD转换
3) 完成AD转换后自动进入低功耗模式
4) AD采样时间可配置
5) 转换结果数据可配置左对齐或右对齐
6) 可配置转换完成产生中断
7) 模拟输入的8通道可复用
8) 转换序列长度可选1-8
9) 连续转换模式
10)多通道扫描
S12系列单片机寄存器介绍
下面以MC9S12HY64芯片为例介绍AD转换相关的常用寄存器,Freescale其他8位/16位芯片的AD转换寄存器也类似
1)控制寄存器ATDCTL0
WRAP:设置多通道转换模式下的环绕通道,在多通道(MULT = 1)模式下,当设置的环绕通道AD转换完成后通道会转到AN0,例如WRAP设置为AN5,那么AN5通道AD转换完成后,AD转换通道就转到AN0,AN6和AN7就不会进行AD转换。
2)控制寄存器ATDCTL1
ETRIGSEL,ETRIGCH:设置外部触发源
SRES:转换精度,可配置为8位/10位/12位
3)控制寄存器ATDCTL2
AFFC:AD转换完成快速标志位清零,AFFC=0状态标志位需手动清零,AFFC=1每次读取结果寄存器标志位自动清理
ICLKSTP:STOP模式下AD转换采用内部时钟工作使能位
ETRIGLE,ETRIGP:外部触发类型设置
ETRIGE:外部触发模式设置
ASCIE:AD转换序列完成中断使能位
ACMPIE:AD比较中断使能位
4)控制寄存器ATDCTL3
DJM:转换结果对齐方式,DJM=0转换结果左对齐,DJM=1转换结果右对齐
S8C,S4C,S2C,S1C:转换序列的长度,如果多通道一次只转换AN4-AN7,那长度就配置成4,如果是单通道,配置成4,那就是对转换的通道连续转换4次
FIFO:AD转换结果的存储模式,AD转换的结果按顺序存在结果寄存器中,当FIFO=0时,每次AD转换序列开始都是从ATDDR0开始存储转换结果,当FIFO=1时,每次AD转换序列开始都是从上一个序列结束时的存储结果的寄存器的后一个开始,所有转换结果都是循环存储(即存储到ATDDR9后,返回ATDDR0,再从ATDDR0-ATDDR9存储),例如要转换的为通道5、6、7,转换模式为连续转换(SCAN=1),当FIFO=0时,每次转换序列的转换结果都是存储在ATDDR0-ATDDR2中;当FIFO=1时,第一次转换序列的结果存储在ATDDR0-ATDDR2中,第二次转换序列的结果存储在ATDDR3-ATDDR5中,以此类推
ETRIGE:外部触发模式设置
ASCIE:AD转换序列完成中断使能位
ACMPIE:AD比较中断使能位
5)控制寄存器ATDCTL4
SMP:采样时间
PRS:AD转换器时钟预分频,fATDCLK=fBUS/(2*(PRS+1))
6)控制寄存器ATDCTL5
ATDCTL5寄存器写入值后会停止当前的AD转换并开始新的AD转换
SC:特殊通道转换位
SCAN:连续转换模式,SCAN=0单次转换,SCAN=1连续转换
MULT:多通道模式,MULT=0单通道转换,MULT=1多通道转换
CD,CC,CB,CA:转换通道选择,对于单通道模式,确定AD转换的通道;对于多通道模式,确定AD转换的首通道
7)状态寄存器ATDSTAT0
SCF:转换序列完成标志位,SCF为0表示当前转换序列未完成,为1表示当前转换序列完成。当出现以下情况时,SCF 标志位清零a.寄存器写入1;b. ATDCTL5写入值;c. AFFC=1并读取结果寄存器。
ETORF:外部触发覆盖标志位
FIFOR:结果寄存器覆盖写入标志位
CC:转换计数器,只读,代表存放当前AD转换结果的结果寄存器
8)状态寄存器ATDSTAT2
CCF:独立通道转换完成标志位
9)AD数字输入信号使能寄存器ATDDIEN
IEN:输入信号输入使能位
10)结果寄存器ATDDR0- ATDDR9
AD转换结果寄存器,左对齐结果数据存储格式如图1所示:
图1
右对齐结果数据存储格式如图2所示:
图2
S12系列单片机AD转换的应用举例
了解了AD转换模块的相关寄存器,就可以根据实际工程的需要来配置相应的寄存器,实现符合项目需求的AD转换功能呢,主要需要配置采样时间,使用的AD转换通道,转换结果的对齐方式,是否需要产生中断等
例如,如果当前项目采用了AD5,AD6,AD7三路AD转换,这三路AD转换精度为12位,不采用中断方式,那么根据这些需求,我们就可以对AD模块进行初始化及对结果进行查询读取,以下是相关代码
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @Purpose: A/D Convertion Driver
* @Author: Purple
* @Version: 1.0
* @Date: Create By Purple 2014.08.20
*
*
* Copyright (C) BlueWhale Tech.
* All rights reserved.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef A2DDRV_H
#define A2DDRV_H
/* Include Files */
/* Macros */
#define A2D_BEGIN_CHANNEL 5
#define A2D_END_CHANNEL 7
#define A2D_CHANNEL_NUMS (A2D_END_CHANNEL-A2D_BEGIN_CHANNEL+1)
/* Variables */
extern unsigned short int A2DResults[A2D_CHANNEL_NUMS];
/* Function Prototypes */
void A2DInit(void);
void A2DConvert(void);
#endif
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @Purpose: A/D Convertion Driver
* @Author: Purple
* @Version: 1.0
* @Date: Create By Purple 2014.08.20
*
*
* Copyright (C) BlueWhale Tech.
* All rights reserved.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Include Files */
#include "A2DDrv.h"
/* Variables */
unsigned short int A2DResults[A2D_CHANNEL_NUMS];
/* Function Definitions */
/*
* FunctionName: A2DInit
* Purpose: A/D转换模块初始化
* Parameters: 无
*/
void A2DInit(void)
{
ATDDIEN = 0x00; //AD通道输入关闭
ATDCTL1 = 0x40; //设置AD转换精度为12位
ATDCTL2 = 0x00;
ATDCTL3 = 0x80; //转换结果右对齐,FIFO模式关闭
ATDCTL3 |=((unsigned char)A2D_CHANNEL_NUMS<<3); //设置转换序列的长度
ATDCTL4 = 0x63; //设置AD采样时间
ATDCTL5 |= AD_BEGIN_CHANNEL; //设置AD采样的首通道
ATDCTL5_MULT=1; //设置多通道模式,开始AD转换
}
/* Function Definitions */
/*
* FunctionName: A2DConvert
* Purpose: A/D转换结果查询读取
* Parameters: 无
*/
void A2DConvert(void)
{
unsigned char i;
while(!ATDSTAT0_SCF); //等待转换序列完成
for(i=0;i
另外,使用AD转换需要注意以下几点:
1.对于AD转换的精度并不是越高越好,因为转换精度越高,转换结果波动也越大,转换精度越低,转换结果波动也越小,所以要根据项目的实际需求选择合适的转换精度。
2. AD转换使用多通道时应保持使用的通道口连续,这样会方便软件处理。