MSP430的AD12使用靈活,功能強大.我在學習的過程中特別總結了一下,以後回頭來也方便咯,呵呵.
1.AD12(12路輸入通道(8路外部輸入通道,4路內部輸入通道),4種模式)
(1)寄存器:
A.轉換控制:ADC12CTL0、ADC12CTRL1
B.中斷控制:ADC12IFG 、 ADC12IE 、ADC12IV
C存儲控制類:ADC12MCTL0 — ADC12MCTL15(8位寄存器,每個寄存器對應於一個ADCMEM12x,定義參考電壓和通道)
D.存儲器類:ADC12MEM0 — ADC12MEM15
(2)四種工作模式
A.單通道單次轉換
B.單通道多次轉換
C.多通道(序列)單次轉換
D.多通道(序列)多次轉換
(3)ADC12CTL1有兩個和時鐘相關的設置:
A.SHS:(0-4)採樣輸入信號源選擇控制位.AD採樣時鐘.
B.ADC12SSEL:(0-3) ADC12內核時鐘.
特別注意二者的區別.
(4)ADC12在AD轉換中完全是自動完成的,所以在多次轉換中大多在中斷處理程序中處理.
在學習中多練習是必要的,如下是單通道單次轉換的例子.不同的工作模式需要設置不同的工作標誌位(0-3).
/*
MSP430
ADC12 單通道單次轉換
*/
#include <MSP430x13x.h>
#define ADCMEM ((int *)0x0140)
void Init(void)
{
WDTCTL = WDTPW + WDTHOLD ;
/*ADC12 Setting*/
P6SEL = 0xFF;
ADC12CTL0 &= ~0x02 ; //禁止轉換
ADC12MCTL0 = 0x00;
ADC12MCTL1 = 0x8A;
ADC12CTL1 = 0x0202;
ADC12CTL0 = 0x0010 + SHT0_8;
ADC12CTL0 |= 0X02; //使能ADC轉換
}
//interrupt[ADC_VECTOR] void ADC12(void) ;
//unsigned int Result ;
int main( void )
{
unsigned int i ;
unsigned int j;
unsigned int Result[2];
Init();
while(1)
{
for(i = 0;i<2 ;i++)
{
ADC12CTL0 |= 0x01 ; //開始轉換
ADC12CTL1 &= ~0x01;
for(j = 0;j<=1000 ;j++);
}
while((ADC12CTL1 & 0x01)==1);
for(j = 0; j<2 ; j++)
{
Result[j] = ADCMEM[j];
}
for(i = 0 ; i<10000 ;i++);
}
return 0;
}