MSP430F5438 ADC12學習筆記
1.前言
這幾天實踐了MSP430的ADC12功能,雖然片內AD功能比較簡單但是還學出了點“門道”來,這個“門道”便是MSP430F5438A和MSP430F5438的區(qū)別。這里通過一個例子說明片內ADC的使用,首先實現(xiàn)UART和定時器1S溢出的功能,在上述功能的基礎上每1S打印一次AD轉換結果,轉換通道定向到通道11,該通道對應AVCC和AVSS插值的一半,由于AVCC和LDO的輸出之間只有一個電感連接,可以理解轉換的結果為LDO輸出電壓的一般,若擴大兩倍便是LDO的實際輸出結果,在本文所用的開發(fā)板LDO輸出為3.3V,所有打印的結果越接近3.3V越好。
代碼實現(xiàn)
//時鐘默認情況
//FLL時鐘FLL選擇XT1
//輔助時鐘ACLK選擇XT132768Hz
//主系統(tǒng)時鐘MCLK選擇DCOCLKDIV8000000Hz
//子系統(tǒng)時鐘SMCLK選擇DCOCLKDIV8000000Hz
//TA1選擇ACLK,最大計數值為32768,中斷頻率為1HZ
#include
#include
#include
voidclock_config(void);
voidselect_xt1(void);
voiddco_config(void);
voidadc12_config(void);
voiduart_config(void);
charsecond_flag=0;//1S標志
intmain(void)
{
clock_config();//初始化時鐘
adc12_config();//初始化ADC12
uart_config();
TA1CCTL0=CCIE;//使能TA1CCR0,比較匹配中斷
TA1CCR0=32768;//初始化最大值,發(fā)生比較匹配中斷頻率32768/32768=1Hz
TA1CTL=TASSEL_1+MC_1+TACLR;//選擇ACLK,最大值為CCR0,清除計數值
_EINT();//初始化全局中斷
while(1)
{
if(second_flag)
{
second_flag=0;//1s時間到
ADC12CTL0|=ADC12SC;//啟動轉換
while(!(ADC12IFG&BIT0));//等待轉換完成
//被轉換的通道為通道11(AVCC-AVSS)/2;
//此時轉換的精度為12位——4096
//AVCC通過一個電感和LDO的輸出端連接
//打印LDO輸出電壓,保留3位精度
floatldo_voltage=ADC12MEM0/4096.0*3.3*2;
printf("LDOVoltage%.3frn",ldo_voltage);
}
}
}
voidclock_config(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看門狗
select_xt1();//選擇XT1
dco_config();//ACLK=XT1=32.768K
//MCLK=SMCLK=8000K
}
voidselect_xt1(void)
{
//啟動XT1
P7SEL|=0x03;//P7.0P7.1外設功能
UCSCTL6&=~(XT1OFF);//XT1打開
UCSCTL6|=XCAP_3;//內部電容
do
{
UCSCTL7&=~XT1LFOFFG;//清楚XT1錯誤標記
}while(UCSCTL7&XT1LFOFFG);//檢測XT1錯誤標記
}
voiddco_config(void)
{
__bis_SR_register(SCG0);//禁止FLL功能
UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_5;//DCO最大頻率為16MHz
UCSCTL2=FLLD_1+243;//設置DCO頻率為8MHz
//MCLK=SMCLK=Fdcoclkdiv=(N+1)X(Ffllrefclk/n)
//N為唯一需要計算的值
// Ffllrefclk FLL參考時鐘,默認為X