(四),ADC101,ADC10是十位的AD,在g2553上有A0~A7八個可以外接的AD通道,A10接到片上的溫度傳感器上,其他的通道都接在內部的VCC或GND上。因為是10為的AD所以計算公式如下:
本文引用地址:http://www.ex-cimer.com/article/201611/322837.htm
2 ,ADC參考電壓的選擇:ADC的參考電壓可以為:
由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的話,盡量不要用內部的參考電壓,最好外接一個比較穩(wěn)定的電壓作為參考電壓,因為內部的產生的參考電壓不是特別穩(wěn)定或精度不是特別的高。例如我在使用時遇到的情況如下:
Vref設為2.5V但實際的值大概為2.475V, 選擇VCCVSS作為參考,用電壓表測得大概為3.58V還是不小的偏差的。
另外,在有可能的情況下,盡量采用較大的VR+和VR-,以減小紋波對采樣結果的影響。
3,ADC10的采樣方式有:單通道單次采樣,單通道多次采樣,多通道單次采樣,多通道多次采樣。
4,DTC:因為ADC10只有一個采樣結果存儲寄存器ADC10MEM,所以除了在單通道單次采樣的模式下,其他的三個模式都必須使用DCT,否則轉換結果會不停地被新的結果給覆蓋。
DTC是轉換結果傳送控制,也就是轉換結果可以不用CPU的干預,就可以自動地存儲在指定的存儲空間內。使用這種方式轉換速度快,訪問方便,適用于高速采樣模式中。DTC的使用可以從下面的例子中很容易看明白:
#include <msp430g2553.h>
#include "ser_12864.h"
uchar s1[]={"DTC:"};
uchar s2[]={"2_cha_2_time_DTC"};
void ADC_init()
{
ADC10CTL1 = CONSEQ_3 + INCH_1;// 2通道多次轉換, 最大轉換通道為A1
ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl參考電壓選默認值VCC和VSS
//采樣保持時間為16 x ADC10CLKs,ADC內核開,中斷使能MSC多次轉換選擇開
//如果MSC置位,則第一次開始轉換時需要觸發(fā)源觸發(fā)一次,以后的轉換會自動進行中斷使能
//使用DTC時,當一個塊傳送結束,產生中斷
//數據傳送控制寄存器0 ADC10DTC0設置為默認模式:單傳送塊模式,單塊傳送完停止
ADC10DTC1 = 0x04; //數據傳送控制寄存器1 4 conversions定義在每塊的傳送數目一共采樣4次 所以單塊傳送4次
//以后就停止了傳送 因為是兩通道的,所以是每個通道采樣數據傳送2次
ADC10AE0 |= BIT0+BIT1;// P1.0 P1.1 ADC option select 使能模擬輸入腳A0 A1
//不知道為什么,當P10 P11都懸空時,采樣值不同,用電壓表測得懸空電壓不同,但是當都接上采樣源的時候,
//采樣是相同的
}
void main(void)
{
uint adc_sample[8]={0};//存儲ADC序列采樣結果
WDTCTL = WDTPW+WDTHOLD;
BCSCTL1 = CALBC1_12MHZ;//設定cpu時鐘DCO頻率為12MHz
DCOCTL = CALDCO_12MHZ;
P2DIR |=BIT3+BIT4;//液晶的兩條線
init_lcd();
ADC_init();
wr_string(0,0,s1);
wr_string(0,3,s2);
for (;;)
{
ADC10CTL0 &= ~ENC;//ADC不使能其實這句話可以放在緊接著CPU喚醒之后的,因為CPU喚醒了,說明我們想要的
//轉換數據傳送完成了,如果ADC繼續(xù)轉換,那么轉換結果也不再傳輸,是無用的。所以緊接著放在CPU喚醒之后
//計時關閉ADC,有利于降低功耗
while (ADC10CTL1 & BUSY);// Wait if ADC10 core is active等待忙
ADC10SA = (unsigned int)adc_sample;//數據傳送開始地址寄存器設置DTC的開始地址Data buffer start
//設置數據開始傳送的地址為數組adc_sample[]的首地址,因為寄存器ADC10SA和轉換結果都是16位的,所以要把
//地址強制轉換為16位的int或unsigned int
//應該也可以用指針直接訪問DTC的存儲區(qū),還沒試過
//例如:前面定義了單塊傳送4次數據,所以每次傳送完成了一個塊,也就是4次,就會把中斷標志位置位,產生中斷
//因為上面設置的地址為數組adc_sample[]的首地址,所以每次轉換的結果就會傳送到該數組的前4位上,所以如果
//一切正常的話,數組里應該是前4位為轉換的結果,后4位為初始值0通過下面的顯示,驗證轉換是正確的
//一次觸發(fā)首先對A1、A0采樣,放入a[0]和a[1]中,再對A1、A0采樣,放入a[2]和a[3]中。如此循環(huán)下去。
//驗證得知,當多通道采樣時,先采高的通道,再采低的通道。如上面每次采樣時,先采A1 再A0
//因為一共采樣傳送4次,所以數組的后4位為初始值0
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion startADC使能,開始轉換 ADC10SC為采樣觸發(fā)源
//不需要cpu的干預,DTC就可以把采樣結果存儲到指定的存儲區(qū)中
__bis_SR_register(CPUOFF + GIE);// LPM0, ADC10_ISR will force exit如果轉換結果傳送完成,
//就會進入中斷,CPU喚醒 繼續(xù)往下運行
wr_int(2,0,adc_sample[0]);//顯示轉換結果A1
wr_int(6,0,adc_sample[1]);//A0
wr_int(0,1,adc_sample[2]);//A1
wr_int(3,1,adc_sample[3]);//A0
wr_int(6,1,adc_sample[4]);
wr_int(0,2,adc_sample[5]);
wr_int(3,2,adc_sample[6]);
wr_int(6,2,adc_sample[7]);
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)//中斷響應以后,中斷標志位自動清零
{
__bic_SR_register_on_exit(CPUOFF);// Clear CPUOFF bit from 0(SR)
}
上面的例子是把存儲結果存儲在了uint型的數組中。也可以用指針直接指定要存放的地址,然后再用指針進行訪問(理論上可以,但還沒有試過)。也可以把存儲結果直接存放在一個16位的寄存器中,如:
ADC10SA = (unsigned int)&TACCR1;// Data transfer location把轉換結果存儲在TACCR1所在的
//位置處,就相當于存儲在TACCR1中 因為ADC轉換結果和寄存器TACCR1都是16位的,所以要把地址強制轉換為16位的
//int 或 unsigned int型
5,ADC采樣注意事項:用片上的ADC10進行采樣,如果外部分壓電路的電阻過大(比如幾K以上),AD引腳會把電壓拉高,使采樣結果發(fā)生很大的偏差。應換成小電阻(幾十~幾百歐),如果要求更精確的話,要加運放進行電壓跟隨。
6,AD采樣交流信號:
一般是50Hz,100Hz,1000Hz。方法是在交流信號的一個周期內采樣多次(如40次,30次等),然后利用公式可以求出交流信號的有效值,平均值等。
7,片上溫度傳感器
ADC的A10通道接片上的溫度傳感器,MSP430內嵌的溫度傳感器實際上就是一個輸出電壓隨環(huán)境溫度而變化的溫度二極管。
當使用片上溫度傳感器時,采樣周期必須大于30us片上溫度傳感器的偏移很大,所以精確測量需要
進行校準。選擇片上溫度傳感器INCH_10,ADC其他的設置都和外部通道的設置相同,包括參考電壓源的選擇和轉換存儲的選擇
選擇了片上溫度傳感器,會自動地打開片上參考電壓源發(fā)生器作為溫度傳感器的電壓源,但是這并不會時能VREF+輸出,也不會
影響AD轉換參考源的選擇,轉換參考源的選擇和其他通道的選擇相同
公式為:VTEMP=0.00355(TEMPC)+0.986
片上溫度傳感器的校準,可以參見我的溫度傳感器校準程序,也可以參考其他的論文。下面只給出程序的一部分:
void ADC_init()
{
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled 參考電壓選默認值VCC和VSS
//采樣保持時間為16 x ADC10CLKs,ADC開,中斷使能
ADC10CTL1 = INCH_10;// ADC輸入通道選擇A10,為內部的溫度傳感器
//其他是默認,采樣觸發(fā)輸入源選擇為ADC10SC,采樣輸入信號不翻轉,轉換時鐘選擇內部時鐘源:ADC10OSC,3.7~6.3MHz
//不分頻,單通道單次轉換
//ADC10AE0 |= 0x02;// PA.1 ADC option select 使能模擬輸入腳A1
//P1DIR |= 0x01;// Set P1.0 to output direction
//所以是P11為ADC輸入腳,P10控制led
}
(五),通用串行通信接口(USCI)
1,USCI_A:支持UART,IrDA,SPI
USCI_B:支持I2C, SPI
2,UART這個模塊沒什么好說的,和其他的一寫處理器如S12,ARM等差不多。只要設置好幾個控制寄存器,波特率,寫幾個收發(fā)函數就可以了。下面就給出msp430g2553于PC用UART通信的基本程序:
#include"msp430g2553.h"
unsigned char rev;
char *string1="Helloworld!";
char string2[]="Get it!";//是換行符
void putchar(unsigned char c)//發(fā)送字符函數
{
while (!(IFG2&UCA0TXIFG));// USCI_A0 TX buffer ready? 等待TX buffer為空
UCA0TXBUF = c;// TX -> RXed character發(fā)送字符c
}
void putstr(char *s)//發(fā)送字符串函數
{
IE2 &= ~UCA0RXIE;//發(fā)送時先關閉接收中斷,不接收
while((*s)!=看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();