微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSP430之一 关于AD转换

MSP430之一 关于AD转换

时间:11-28 来源:互联网 点击:

在这里记下来自己所学的,而且写一篇记忆更深刻,还方便查阅。希望能有帮助吧~加油一起进步。

l 首先应明确Msp4301X里的各系列中的ADC模块大凡是12位的转换精度。下图即为其功能模块图。


其实这个图感觉大概看哈就行了,真有时间和精力细细结合书渗透还是可以的,不过就是刚开始看有点花花绿绿吧。

l 熟悉并能使用一个模块,必然要熟悉其各个寄存器的作用。下面我们来看下ADC12模块中各个模块寄存器的作用,

转换控制寄存器 ADC12CTL0

ADC12CTL0

0

1

2

3

4

5

6

7

8-11

12-15

ADCSC

ENC

ADCIVIE

ADC0VIE

ADCON

REFON

2.5V

MSC

SHT0

SHT1

1. ENC=1时才能正常的AD转换

2. ADCSC是其采集/转换控制位,启动AD必须要用一条指令来配置ENC和ADCSC。

3. ADCIVIE 转换时间溢出中断。转换未完成时,继续采样则会溢出。

4. ADC0VIE 溢出中断允许位。即ADC12MEMx中数据未读出,继续写入、

5. ADC12ON 打开内核、

6. REFON 内部基准电压开启否?

7. MSC 多次采样/转换 ,有效条件为SHP=1, MSC=0时上升沿,当CONSQ!=0,MSC=1,首次上升沿,后采样接上次。

8. SHT1,SHT0,名为采样保持定时器,SHT0_x,其中X代表的是采样分频因子,采样周期是 ADC12CLK周期的4倍。2的级数倍。

转换控制寄存器 ADC12CTL1

0

1.,2

3,4

5-7

8

9

10-,11

12-15

BUSY

CONSEQ

ADCSEL

ADCdiv

ISSH

SHP

SHS

CSSTARTADD

1. BUSY 判断位,只用于单通道单次转的,需要ENC=0,不然没用。

2. CONSEQ 0 1 2 3 单通道单次,序列单次,单多次,序列多次。

3. ADC12SEL 时钟源选择,0 1 2 3 分别为ADC12OSC,ACLK ,MCLK,SMC

4. ADC12div 分频因子选择位,挺少用,

5. ISSH 一般推荐的是同相,即为ISSH 0

6. SHP 采样信号来源 0 来自输入,1为采样定时器

7. SHS 采样触发输入源,0 12 3 ADC12SC,Timer_A.OUT1,TM_B 0 ,TM_B1

8. CSSTARTADD 4位分别对应 存储的ADC12MEM-1-15,定义地址用。

最重要的两个部分说完了,呼呼喘口气、呵呵 看得累了还得用心记下来。

接下来要说的是转换储存寄存器 ADC12MEM0-MEM15;

只用低12位,后面4个读零。

其次当然是转换寄存器控制寄存器ADC12MCTLx

这个也是定义转换功能滴~~

0 1 2 3

4 5 6

7

INCH

SREF

EOS

4个模拟通道

可选6种。

结束控制.0.完了,1没有

SREF 参考电压那里,就查查书吧、就是定义以哪个为基准的。

********************************我是分割线***********************************************

说到这里基本可以用上述3个来搭建出基本的AD模型了吧。感觉硬件编程,就像是堆积木哈,找到积木,然后一个一个一堆,技术含量就是记不住,每次都要翻书。不过没关系呀,不翻书,然何以破万卷?接着加油吧!

****************************************************************************************

中断寄存器:

ADC12IFG 中断标志寄存器,ADC12IFG..x = 1 结束转换,= 0 访问ADC12MEM

ADC12IE 中断使能 =1时请求中断允许,= 0禁止中断

ADC12IV 仅有的一个中断向量,实际是定义了中断地址.

***********************************分割**************************************

到这里基本介绍完了,其实也是看了这么久程序的一个总结吧,当然不明白的地方我依旧还是去查了书,怕自己出现错误。下面将提供个例程:我只摘了工作需要的其中部分。

*************************************华丽的分割*************************************

#include msp430 14x.h>

Void main(void)

unsigned int adnum,ad_max,ad_min,ad_val,result[MAX_AD_NUM];

unsigned char k;

{

WDTCTL=WDTPW+WDTHOLD;

P6SEL&=~ BIT1;

DC12CTL0 = ADC12ON + SHT0_8 + MSC;//内部振荡器 +保持采样系数+自动转换

ADC12MCTL0 = INCH_0;//存储寄存器初始化

ADC12CTL1 = SHP + CONSEQ_2; //单通道多次转换模式

ADC12MCTL0 |= SREF_7;//参考电源选择VR+=VREF+;VR-=AVSS

ADC12IE=0x01;//使用通道 使用结束后中断

ADC12CTL0 |= ENC ;//转换允许位 ENC初始化 使能转换

ADC12CTL0 |= ADC12SC ;//位触发及采样保持

for(k=0;k<50;k++); //延迟

adnum=0;

ad_max=0;

ad_min=4095;/

for(k=0;k<12;k++);采样12次

}

{

while((ADC12IFG&BIT0)!=BIT0) ; //处理ADC12 IN.0中断

result[k]=ADC12MEM0;//果返回至内部存储器

if(result[k]>ad_max)ad_max=result[k];

if(result[k]

adnum+=result[k];

}

adnum-=(ad_max+ad_min); // ADC12CTL1 &= ~ADC12IFG;

ADC12CTL0 &= ~ENC ; //ENC设置为零修改ADX12寄存器值

ADC12CTL0=0;

ADC12MCTL0=0;

ADC12CTL1=0;

ad_val=(int)(adnum/10);//取采样平均值。

return ad_val;

}

******************************************************************

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top