1.ADC12_A初始化参数
typedef struct ADC_MemMap
{
union
{
uint16_t CTL0;
struct
{
uint16_t SC :1; /* ADC12 Start Conversion */
uint16_t ENC :1; /* ADC12 Enable Conversion */
uint16_t TOVIE :1; /* ADC12 Timer Overflow interrupt enable */
uint16_t OVIE :1; /* ADC12 Overflow interrupt enable */
uint16_t ON :1; /* ADC12 On/enable */
uint16_t ADCREFON :1; /* ADC12 Reference on */
uint16_t REF2_5V :1; /* ADC12 Ref 0:1.5V / 1:2.5V */
uint16_t MSC :1; /* ADC12 Multiple SampleConversion */
uint16_t SHT0 :4; /* ADC12 Sample Hold 0 Select */
uint16_t SHT1 :4; /* ADC12 Sample Hold 1 Select */
};
};
union
{
uint16_t CTL1;
struct
{
uint16_t ADBUSY :1; /* ADC12 Busy */
uint16_t CONSEQ :2; /* ADC12 Conversion Sequence Select */
uint16_t SSEL :2; /* ADC12 Clock Source Select */
uint16_t DIV :3; /* ADC12 Clock Divider Select */
uint16_t ISSH :1; /* ADC12 Invert Sample Hold Signal */
uint16_t SHP :1; /* ADC12 Sample/Hold Pulse Mode */
uint16_t SHS :2; /* ADC12 Sample/Hold Source */
uint16_t CSTARTADD :4; /* ADC12 Conversion Start Address */
};
};
union
{
uint16_t CTL2;
struct
{
uint16_t REFBURST :1; /* ADC12+ Reference Burst */
uint16_t ADCREFOUT :1; /* ADC12+ Reference Out */
uint16_t SR :1; /* ADC12+ Sampling Rate */
uint16_t DF :1; /* ADC12+ Data Format */
uint16_t RES :2; /* ADC12+ Resolution */
uint16_t TCOFF :1; /* ADC12+ Temperature Sensor Off */
uint16_t PDIV :1; /* ADC12+ predivider 0:/1 1:/4 */
};
};
uint16_t RESERVED_1[2];
uint16_t IFG;
uint16_t IE;
uint16_t IV;
struct
{
uint8_t INCH :4; /* ADC12 Input Channel Select*/
uint8_t REF :3; /* ADC12 Select Reference */
uint8_t EOS :1; /* ADC12 End of Sequence */
}MCTL[16];
uint16_t MEM[16];
}volatile * ADC_MemMapPtr;
#define ADC12_SSEL_ADC12OSC 0
#define ADC12_SSEL_ACLK 1
#define ADC12_SSEL_MCLK 2
#define ADC12_SSEL_SMCLK 3
#define ADC12_SREF_0 0
#define ADC12_SREF_1 1
#define ADC12_SREF_2 2
#define ADC12_SREF_3 3
#define ADC12_SREF_4 4
#define ADC12_SREF_5 5
#define ADC12_SREF_6 6
#define ADC12_SREF_7 7
#define ADC_BASE_PTR ((ADC_MemMapPtr)__MSP430_BASEADDRESS_ADC12_PLUS__)
1.1 初始化的通道及引脚
typedef enum
{
ADC_CH0 =BIT0, //P6.0
ADC_CH1 =BIT1, //P6.1
ADC_CH2 =BIT2, //P6.2
ADC_CH3 =BIT3, //P6.3
ADC_CH4 =BIT4, //P6.4
ADC_CH5 =BIT5, //P6.5
ADC_CH6 =BIT6, //P6.6
ADC_CH7 =BIT7, //P6.7
ADC_CH8 =BIT8, //VeREF+ //外部正基准
ADC_CH9 =BIT9, //VeREF- //外部负基准
ADC_CH10 =BITA, //片内温度传感器
ADC_CH11 =BITB, //(AVCC-AVSS)/2
ADC_CH12 =BITC, //P7.0
ADC_CH13 =BITD, //P7.1
ADC_CH14 =BITE, //P7.2
ADC_CH15 =BITF, //P7.3
ADC_CH_NUM =16u, //通道数量
}ADC_CHn; //通道
1.2 参考电压
typedef enum
{
ADC_VREF_1_5V , //内部1.5V
ADC_VREF_2_5V , //内部2.5V
ADC_VREF_3_3V , //供电电压作为参考电压
ADC_VREF_External , //使用外部提供参考电压
}ADC_VREF; //参考电压
值得注意的是,参考手册里面解释如下
单片机的采样电压是不允许超过参考电压:
从参考公式来看,必须小于参考电压,如果超过参考电压,输出只能到最大参考电压,并且还会可能烧坏单片机。
1.3 转换精度
typedef enum
{
ADC_8bit , //8 位精度,最大值256-1
ADC_10bit , //10位精度,最大值1024-1
ADC_12bit , //12位精度,最大值4096-1
}ADC_Resolution; //精度
2 初始化
/*******************************************************************************
* 函数名称:ADC_Init(uint16_t ch,ADC_VREF Vref,ADC_Resolution nBit)
* 功能说明:ADC初始化一个或多个ADC通道
* 参数说明:
uint16_t ch :要初始化的通道
ADCVREF Vref :参考电压
ADC_Resolution nBit :转换精度
* 函数返回:无
********************************************************************************/
void ADC_Init(uint16_t ch,ADC_VREF Vref,ADC_Resolution nBit)
{
ADC12->ENC = DISABLE; //先对该位复位,否则置位后有些寄存器不能再进行操作
uint16_t SREF_RegValue = 0u;
switch(Vref) //选择参考电压
{
case ADC_VREF_1_5V:
REFCTL0 &=~ REFMSTR; //把REF参考电压控制权交给ADC
ADC12->ADCREFON = BIT_SET;
ADC12->REF2_5V = RESET;
SREF_RegValue = ADC12_SREF_1; //使用内部提供的参考电压
break;
case ADC_VREF_2_5V:
REFCTL0 &=~ REFMSTR;
ADC12->ADCREFON = BIT_SET;
ADC12->REF2_5V = BIT_SET;
SREF_RegValue = ADC12_SREF_1; //使用内部提供的参考电压
break;
case ADC_VREF_External:
P5SEL |= BIT0; //VeREF+
P5SEL |= BIT1; //VeREF-
SREF_RegValue = ADC12_SREF_2; //使用外部参考电压
case ADC_VREF_3_3V:
SREF_RegValue = ADC12_SREF_0; //使用电源电压作为参考电压,
break;
default :break;
}
//初始化通道
uint16_t CH_Mask = 0x01;
for(uint8_t CH_Num=0; CH_Num < ADC_CH_NUM; CH_Num++)
{
if(ch & CH_Mask) //要初始化的通道
{
if((CH_Mask & InitialedChannel_Bit) == 0) //如果该通道未被初始化过
{
ADC12->MCTL[InitialedChannel_Num].INCH = CH_Num;
ADC12->MCTL[InitialedChannel_Num].REF = SREF_RegValue;//参考电压选择,通道设置
ADC_Channel_Bit[InitialedChannel_Num] = CH_Mask;//将该通道初始化标志置位 InitialedChannel_Bit |= CH_Mask; //置位已初始化的通道标志位
InitialedChannel_Num ++;//初始化的通道数加1
}
else //如果是之前已经初始化过的通道,则要在这里从新设置一下,只设置通道参考电压
{
ADC12->MCTL[ADC_GetChanelNum((ADC_CHn)CH_Mask)].REF = SREF_RegValue;//改变参考电压
}
}
CH_Mask <<= 1;
}
if(InitialedChannel_Num > 1) //有多个通道时要加上序列通道结束位
{
for(int i=0; i<(InitialedChannel_Num-1); i++) //前面所有通道序列结束位清零
上一篇:谈谈MSP430 的框架程序
下一篇:MSP430学习笔记(4)ADC12
设计资源 培训 开发板 精华推荐
- 适用于汽车应用的 A5970D 1A 降压稳压器的典型软启动网络电路
- L78L33AB正压稳压器高输出电流短路保护的典型应用
- 使用 ROHM Semiconductor 的 BD45251 的参考设计
- MC33074DR2G 直流耦合反相放大器最大输出摆幅的典型应用
- BeMicro SDK/SDP 内插器、BeMicro SDK/SDP 内插器套件可轻松将 Arrow 的 BeMicro SDK 平台连接到 ADI 系统演示平台 (SDP) 系列的各种子板
- AND8159/D,压控衰减器NE570/SA571压扩器应用电路
- 2020电赛E题-放大器非线性失真研究装置(南京大学)
- 触摸调光LED
- AD8032AR-EBZ,双通道高速运算放大器评估板,采用 8 引脚 SOIC 封装
- MIC5233 的典型应用:高输入电压、低 I Q 电容 LDO 稳压器