📄 adc12.c
字号:
/****************************************************************************
文件名:adc12.c
编写者:czhang
描述:ADC12模块程序。用于14xx系列。
MCLK:DCO ACLK:32.768kHz
版本:2005-4 V1.0
*****************************************************************************/
#include <msp430x14x.h>
#include "adc12.h"
unsigned char Wait=0; //等待转换结束的标志位 0:没有结束 1:结束
unsigned int AdMem[16]; //转换结果缓冲区
#define AD_CI 10
unsigned char AdCi=AD_CI; //单通道或者序列多次转换的转换次数
#define DUO_CI 1 //0:单通道或者序列单次转换 1:单通道或者序列多次转换
/****************************************************************************
初始化
****************************************************************************/
void Adc12Init()
{
ADC12CTL0 &= ~ENC; //使AD模块处于初始状态
ADC12CTL0 = MSC+REFON+REF2_5V+SHT0_15+SHT1_15; //使用内部2.5V参考电压,使用采样保持器。
}
/****************************************************************************
打开或关闭ADC12模块
doit:0:打开 100:关闭
****************************************************************************/
void Adc12Open(unsigned char doit)
{
if(doit==0)
{
ADC12CTL0 |= ADC12ON;
ADC12CTL0 |= ENC; //允许转换
}
else if(doit==100)
{
ADC12CTL0 &= ~ADC12ON; //不允许转换
ADC12CTL0 &= ~ENC;
}
}
/****************************************************************************
设置转换模式
adr:转换的首地址。取值范围为0~15
mod:转换模式。0:单通道单次 1:序列通道单次 2:单通道多次 3:序列通道多次
****************************************************************************/
void AdcDo(unsigned int adr,unsigned char mod)
{
ADC12CTL1 = (adr<<12)+SHP+(mod<<1); //SHP表示由采样定时器控制采样
}
/****************************************************************************
设置通道
tongdao:选择的模拟输入通道,取值范围为0~15
eos:0表示序列没有结束,0x80表示在序列转换时,表示本次转换结束后,本转换序列结束。
mem:转换存储器控制寄存器,取值范围为0~15
verf:参考电压,取值范围为0~7
inter:0:本通道转换完后不引发中断 1:本通道转换完后引发中断
****************************************************************************/
void SetTongDao(unsigned char tongdao,unsigned char eos,unsigned char mem,unsigned char verf,unsigned char inter)
{
char *pmem_ctl= ADC12MCTL;
pmem_ctl += mem;
*pmem_ctl = tongdao+ eos + (verf<<4);
if(inter==0)
ADC12IE &= ~(0x1<<mem);
else
ADC12IE |= (0x1<<mem);
}
/****************************************************************************
软件引发转换开始
****************************************************************************/
void Adc12Go()
{
unsigned char q0;
for(q0=0;q0<16;q0++)
AdMem[q0]=0;
Wait=0;
ADC12CTL0 |= ENC+ADC12SC; //转换开始
while(Wait==0) //等待转换结束
;
}
/*****************************************************************************
AD转换器中断函数
******************************************************************************/
#pragma vector=ADC_VECTOR
__interrupt void Adc()
{
#if DUO_CI==0 //单通道或者序列单次转换
unsigned char q0;
int *pmem=ADC12MEM;
Wait=1; //转换结束的标志位置位
for(q0=0;q0<16;q0++)
{
AdMem[q0]= *pmem;
pmem++;
}
#elif DUO_CI==1 //单通道或者序列多次转换
unsigned char q0;
unsigned int iq0;
int *pmem=ADC12MEM;
if(Wait==0)
{
for(q0=0;q0<16;q0++)
{
AdMem[q0] += *pmem;
pmem++;
}
AdCi--;
if(AdCi==0)
{
Adc12Open(100); //关闭ADC12模块
Wait=1; //转换结束的标志位置位
for(q0=0;q0<16;q0++)
{
AdMem[q0] = AdMem[q0]/AD_CI;
}
AdCi=AD_CI;
}
}
else
{
for(q0=0;q0<16;q0++)
{
iq0 += *pmem;
pmem++;
}
}
#endif
}
/****************************************************************************
从ADC12MEM中读出转换结果,本函数读出了ADC12MEM所有的16个寄存器,可根据需要进行
修改,不读出所有的寄存器。
padc:读出的结果保存在数组中,padc为指向此数组的指针
****************************************************************************/
void AdcGet(unsigned int *padc)
{
unsigned char q0;
for(q0=0;q0<16;q0++)
{
*padc= AdMem[q0];
padc++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -