使用的MSP430G2553,為AD10,正常有8路輸出,P1.0-P1.7為A0-A7
有七個(gè)寄存器,
參考電壓可以是VCC或者內(nèi)部參考電壓1.5V或者2.5V
參考時(shí)鐘可以是內(nèi)部ADC10OSC
最高轉(zhuǎn)換速率達(dá)200ksps
轉(zhuǎn)換方式四種:?jiǎn)瓮ǖ绬未?,序列通道單次,單通道多次,序列通道多次。多次轉(zhuǎn)換時(shí)候會(huì)用到DTC功能防止數(shù)據(jù)還沒被取出就被覆蓋
單通道的實(shí)例程序,開啟的為通道5,也就是P1.5
1 void AD_Channel5_Config(void)
2 {
3 /* Configure ADC Channel */
4 ADC10CTL1 = INCH_5 + ADC10DIV_0 ; // Channel 5, ADC10CLK
5
6
7 ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;
8 //SREF_1+REFON +REF2_5V 表示使用內(nèi)部參考電壓 2.5v
9 ADC10AE0 "= BIT5; //P1.5 ADC option
10
11 }
每次開始轉(zhuǎn)換需要給寄存器置位,寫了個(gè)小函數(shù)
1 void AD_Start(void)
2 {
3 ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion
4 }
轉(zhuǎn)換后的數(shù)據(jù)處理
1 #pragma vector=ADC10_VECTOR
2 __interrupt void ADC10_ISR (void)
3 {
4 int data ;
5 float shuju,c;
6 char a[4];
7 data = ADC10MEM;
8 shuju = ((double)data/1024)*2.5;
9 c =shuju;
10 a[0]= ((int)c%10+0x30);
11 a[1]= 0x2e;
12 a[2]= ((int)(c*10)%10+0x30);
13 a[3]= ((int)(c*100)%10+0x30);
14
15 uart_send_str(a);
16 __delay_cycles(5);
17 uart_send_huiche();
18 // uart_send_ch((char)(ADC10MEM*25/1024));
19 }
多通道的也調(diào)通了,幾點(diǎn)說明
首先要在ADC10CTL0中開始MSC位
然后 ADC10CTL1 = CONSEQ_3 + INCH_7; CONSEQ選擇轉(zhuǎn)換方式此時(shí)為多通道多次,后面的INCH位最高通道位,因?yàn)槲沂褂?-7四個(gè)通道所以最高INCH_7
數(shù)據(jù)傳送控制寄存器0 ADC10DTC0設(shè)置為默認(rèn)模式:?jiǎn)蝹魉蛪K模式,單塊傳送完停止。這里不做操作即可
ADC10DTC1 = 0x04;設(shè)置轉(zhuǎn)換次數(shù),這里我只轉(zhuǎn)換一遍即停止,因?yàn)樗膫€(gè)通道所以為4,轉(zhuǎn)換次數(shù)=通道數(shù)*每個(gè)通道轉(zhuǎn)換次數(shù)
ADC10AE0 |= BIT7+BIT6+BIT5+BIT4; 使能這四個(gè)通道
ADC10SA =(unsigned int) adc_result; //數(shù)據(jù)傳送開始地址寄存器 設(shè)置DTC的開始地址 Data buffer start
這里值得注意需要傳入數(shù)組首地址。之前寫的ADC10SA adc_result;編譯不通過,加了前面的(unsigned int)就OK了,不明白這里。
因?yàn)槲业亩xunsigned int adc_result[];
總之這里改好后程序就OK了。
下面給出代碼
1 void AD_MultiChannel_4_Config(unsigned int adc_result[])
2 {
3 ADC10CTL1 = CONSEQ_3 + INCH_7; // 多通道多次轉(zhuǎn)換, 最大轉(zhuǎn)換通道為A1
4
5
6 ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE + REF2_5V+ REFON + SREF_1; // ADC10ON, interrupt enabl
7
8 //采樣保持時(shí)間為16 x ADC10CLKs,ADC內(nèi)核開,中斷使能 MSC多次轉(zhuǎn)換選擇開
9
10 //如果MSC置位,則第一次開始轉(zhuǎn)換時(shí)需要觸發(fā)源觸發(fā)一次,以后的轉(zhuǎn)換會(huì)自動(dòng)進(jìn)行 中斷使能
11
12 //使用DTC時(shí),當(dāng)一個(gè)塊傳送結(jié)束,產(chǎn)生中斷
13
14
15 //數(shù)據(jù)傳送控制寄存器0 ADC10DTC0設(shè)置為默認(rèn)模式:?jiǎn)蝹魉蛪K模式,單塊傳送完停止
16
17 ADC10DTC1 = 0x04; //數(shù)據(jù)傳送控制寄存器1 4 conversions 定義在每塊的傳送數(shù)目 一共采樣4次所以單塊傳送4次
18
19 //以后就停止了傳送 因?yàn)槭莾赏ǖ赖模允敲總€(gè)通道采樣數(shù)據(jù)傳送2次
20
21
22 ADC10AE0 |= BIT7+BIT6+BIT5+BIT4; // P1.0 P1.1 ADC option select 使能模擬輸入腳A0 A1
23
24 //不知道為什么,當(dāng)P10 P11都懸空時(shí),采樣值不同,用電壓表測(cè)得懸空電壓不同,但是當(dāng)都接上采樣源的時(shí)候,
25
26 //采樣是相同的
27
28
29 while (ADC10CTL1 & BUSY);
30 ADC10SA =(unsigned int) adc_result; //數(shù)據(jù)傳送開始地址寄存器 設(shè)置DTC的開始地址 Data buffer start
31
32 //設(shè)置數(shù)據(jù)開始傳送的地址為數(shù)組adc_sample[]的首地址,因?yàn)榧拇嫫鰽DC10SA和轉(zhuǎn)換結(jié)果都是16位的,所以要把
33
34 //地址強(qiáng)制轉(zhuǎn)換為16位的int或unsigned int
35
36 //應(yīng)該也可以用指針直接訪問DTC的存儲(chǔ)區(qū),還沒試過
37
38
39
40 }
啟動(dòng)AD代碼與前面一樣
1 #pragma vector=ADC10_VECTOR
2 __interrupt void ADC10_ISR (void)
3 {
4 int data ;
5 float shuju,c;
6 char a[4];
7 /* data = ADC10MEM;
8 shuju = ((double)data/1024)*2.5;
9 c =shuju;
10 a[0]= ((int)c%10+0x30);
11 a[1]= 0x2e;
12 a[2]= ((int)(c*10)%10+0x30);
13 a[3]= ((int)(c*100)%10+0x30);
14
15 uart_send_str(a);
16 __delay_cycles(5);
17 uart_send_huiche();
18 */
19 for(data=0;data<8;data++)
20 {
21
22
23 shuju = ((double)adc_result[data]/1024)*2.5;
24 c =shuju;
25 a[0]= ((int)c%10+0x30);
26 a[1]= 0x2e;
27 a[2]= ((int)(c*10)%10+0x30);
28 a[3]= ((int)(c*100)%10+0x30);
29
30 uart_send_ch((char)data+0x30);
31 uart_send_ch(' ');
32 uart_send_str(a);
33 __delay_cycles(5);
34 uart_send_huiche();
35 __delay_cycles(5);
36
37 }
這里 unsigned int adc_result[8];
測(cè)試基本OK,還需要多做一些測(cè)試,目前手頭資源有限