在這里記下來自己所學的,而且寫一篇記憶更深刻,還方便查閱。希望能有幫助吧~加油一起進步。
本文引用地址:http://m.butianyuan.cn/article/201611/323029.html 首先應明確Msp4301X里的各系列中的ADC模塊大凡是12位的轉(zhuǎn)換精度。下圖即為其功能模塊圖。
其實這個圖感覺大概看哈就行了,真有時間和精力細細結(jié)合書滲透還是可以的,不過就是剛開始看有點花花綠綠吧。
l 熟悉并能使用一個模塊,必然要熟悉其各個寄存器的作用。下面我們來看下ADC12模塊中各個模塊寄存器的作用,
轉(zhuǎn)換控制寄存器 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轉(zhuǎn)換
2. ADCSC是其采集/轉(zhuǎn)換控制位,啟動AD必須要用一條指令來配置ENC和ADCSC。
3. ADCIVIE 轉(zhuǎn)換時間溢出中斷。轉(zhuǎn)換未完成時,繼續(xù)采樣則會溢出。
4. ADC0VIE 溢出中斷允許位。即ADC12MEMx中數(shù)據(jù)未讀出,繼續(xù)寫入、
5. ADC12ON 打開內(nèi)核、
6. REFON 內(nèi)部基準電壓開啟否?
7. MSC 多次采樣/轉(zhuǎn)換 ,有效條件為SHP=1, MSC=0時上升沿,當CONSQ!=0,MSC=1,首次上升沿,后采樣接上次。
8. SHT1,SHT0,名為采樣保持定時器,SHT0_x,其中X代表的是采樣分頻因子,采樣周期是 ADC12CLK周期的4倍。2的級數(shù)倍。
轉(zhuǎn)換控制寄存器 ADC12CTL1
0 | 1.,2 | 3,4 | 5-7 | 8 | 9 | 10-,11 | 12-15 |
BUSY | CONSEQ | ADCSEL | ADCDIV | ISSH | SHP | SHS | CSSTARTADD |
1. BUSY 判斷位,只用于單通道單次轉(zhuǎn)的,需要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 采樣觸發(fā)輸入源,0 12 3 ADC12SC,Timer_A.OUT1,TM_B 0 ,TM_B1
8. CSSTARTADD 4位分別對應 存儲的ADC12MEM-1-15,定義地址用。
最重要的兩個部分說完了,呼呼喘口氣、呵呵 看得累了還得用心記下來。
接下來要說的是轉(zhuǎn)換儲存寄存器 ADC12MEM0-MEM15;
只用低12位,后面4個讀零。
其次當然是轉(zhuǎn)換寄存器控制寄存器ADC12MCTLx
這個也是定義轉(zhuǎn)換功能滴~~
0 1 2 3 | 4 5 6 | 7 |
INCH | SREF | EOS |
4個模擬通道 | 可選6種。 | 結(jié)束控制.0.完了,1沒有 |
SREF 參考電壓那里,就查查書吧、就是定義以哪個為基準的。
********************************我是分割線***********************************************
說到這里基本可以用上述3個來搭建出基本的AD模型了吧。感覺硬件編程,就像是堆積木哈,找到積木,然后一個一個一堆,技術(shù)含量就是記不住,每次都要翻書。不過沒關(guān)系呀,不翻書,然何以破萬卷?接著加油吧!
****************************************************************************************
中斷寄存器:
ADC12IFG 中斷標志寄存器,ADC12IFG..x = 1 結(jié)束轉(zhuǎn)換,= 0 訪問ADC12MEM
ADC12IE 中斷使能 =1時請求中斷允許,= 0禁止中斷
ADC12IV 僅有的一個中斷向量,實際是定義了中斷地址.
***********************************分割**************************************
到這里基本介紹完了,其實也是看了這么久程序的一個總結(jié)吧,當然不明白的地方我依舊還是去查了書,怕自己出現(xiàn)錯誤。下面將提供個例程:我只摘了工作需要的其中部分。
*************************************華麗的分割*************************************
#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;//內(nèi)部振蕩器 +保持采樣系數(shù)+自動轉(zhuǎn)換
ADC12MCTL0 = INCH_0;//存儲寄存器初始化
ADC12CTL1 = SHP + CONSEQ_2; //單通道多次轉(zhuǎn)換模式
ADC12MCTL0 |= SREF_7;//參考電源選擇VR+=VREF+;VR-=AVSS
ADC12IE=0x01;//使用通道 使用結(jié)束后中斷
ADC12CTL0 |= ENC ;//轉(zhuǎn)換允許位 ENC初始化 使能轉(zhuǎn)換
ADC12CTL0 |= ADC12SC ;//位觸發(fā)及采樣保持
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;//果返回至內(nèi)部存儲器
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;
}
******************************************************************
評論