在这里记下来自己所学的,而且写一篇记忆更深刻,还方便查阅。希望能有帮助吧~加油一起进步。
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;
}
******************************************************************