Msp430 LCD_B/ADC_12实验操作报告
04011344 王晨
一、 实验内容
Lab17
基本:使DAC0输出正弦波频率为300Hz,在LCD上显示频率;
提高:用按键控制DAC0输出正弦波频率为在100Hz—1000Hz循环输出,步进值为100Hz,并在LCD上显示频率;
基本部分实验代码:
#include <msp430f6638.h>
#include <math.h>
#define PI 3.1415926
void Init_lcd(void); //lcd初始化
void LcdGo(unsigned char doit); //打开或关闭液晶
void LcdBlink(unsigned char doit); //显示或者消隐显示内容
void LCD_Clear(void); //清屏
void Init_TS3A5017DR(void); //Configure TS3A5017DR IN1 and IN2
//delay
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
// LCD segment definitions.
#define d 0x01
#define c 0x20
#define b 0x40
#define a 0x80
#define dp 0x10
#define g 0x04
#define f 0x08
#define e 0x02
const char char_gen[] = { // As used in 430 Day Watch Demo board
a+b+c+d+e+f, // Displays "0"
b+c, // Displays "1"
a+b+d+e+g, // Displays "2"
a+b+c+d+g, // Displays "3"
b+c+f+g, // Displays "4"
a+c+d+f+g, // Displays "5"
a+c+d+e+f+g, // Displays "6"
a+b+c, // Displays "7"
a+b+c+d+e+f+g, // Displays "8"
a+b+c+d+f+g, // Displays "9"
a+b+c+e+f+g, // Displays "A"
c+d+e+f+g, // Displays "b"
a+d+e+f, // Displays "c"
b+c+d+e+g, // Displays "d"
a+d+e+f+g, // Displays "E"
a+e+f+g, // Displays "f"
a+b+c+d+f+g, // Displays "g"
c+e+f+g, // Displays "h"
b+c, // Displays "i"
b+c+d, // Displays "j"
b+c+e+f+g, // Displays "k"
d+e+f, // Displays "L"
a+b+c+e+f, // Displays "n"
a+b+c+d+e+f+g+dp // Displays "full"
};
int sin_table[180];
int *sin_data_pr;
double i=0;
int j;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//8MHz
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
do {
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL1 = DCORSEL_6; // Select DCO range 16MHz operation
UCSCTL2 |= 610; // Set DCO Multiplier for 8MHz
// (N + 1) * FLLRef = Fdco, (249 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst‐case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx UG for
// optimization , 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle
__delay_cycles(650000);
//timerA
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCR0 = 370;
TA0CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, up mode, clear TAR
for(j=0;j<180;j++)
{
i+=PI/90;
sin_table[j]=(int)((sin(i)+1)*2048);
}
sin_data_pr=&sin_table[0];
DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 +
DAC12ENC + DAC12CALON+DAC12OPS;
P5DIR=BIT1;//打开扬声器的运放
P5OUT&=~BIT1;
//Lcd initial
Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2
Init_lcd(); //lcd初始化
LcdGo(1); //打开液晶模块
LCD_Clear(); //清屏
LCDMEM[5] = char_gen[0];
LCDMEM[4] = char_gen[0];
LCDMEM[3] = char_gen[3];
for (;;)
{
__bis_SR_register(CPUOFF + GIE); // Enter LPM0
DAC12_0DAT=*sin_data_pr++;
if (sin_data_pr >= &sin_table[180])
{
sin_data_pr = &sin_table[0];
}
DAC12_0DAT &= 0xFFF; // Modulo 4096
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
static unsigned int ch=0;
ch++;
if(ch>=50000)//0.93s
{
LCDMEM[5] = char_gen[0];
LCDMEM[4] = char_gen[0];
LCDMEM[3] = char_gen[3];
ch=0;
}
__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR)
}
//LCD初始化
void Init_lcd(void)
{
LCDBCTL0 =LCDDIV0 + LCDPRE0 + LCDMX1 + LCDSSEL + LCDMX1 + LCD4MUX ;
LCDBPCTL0 = LCDS0 + LCDS1 + LCDS2 + LCDS3 + LCDS4 + LCDS5 + LCDS6+ LCDS7 + LCDS8 +
LCDS9 + LCDS10 + LCDS11 ;
P5SEL = 0xfc;//用作LCD驱动
}
/****************************************************************
打开或关闭液晶
1:打开 0:关闭
****************************************************************/
void LcdGo(unsigned char doit)
{
if(doit==1)
{
//打开液晶显示
LCDBCTL0 |= LCDON;
}
else if(doit==0)
{
//关闭液晶显示
LCDBCTL0 &= ~LCDON;
}
}
/****************************************************************
显示或者消隐显示内容
doit:0:消隐 1:显示
****************************************************************/
void LcdBlink(unsigned char doit)
{
if(doit==0)
{
LCDBCTL0 &= ~LCDSON;
}
else if(doit==1)
{
LCDBCTL0 |= LCDSON;
}
}
void LCD_Clear(void)//清屏
{
unsigned char index;
for (index=0; index<12; index++)
{
LCDMEM[index] = 0;
}
}
void Init_TS3A5017DR(void)
{
P3DIR |= BIT4 + BIT5; //P3.4:IN1;P3.5:IN2 set as output
P3OUT &= ~BIT4; //IN1 = 0
P3OUT |= BIT5; //IN2 = 1
}
提高部分实验代码:
#include <msp430f6638.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
#define PI 3.1416
#define d 0x01
#define c 0x20
#define b 0x40
#define a 0x80
#define dp 0x10
#define g 0x04
#define f 0x08
#define e 0x02
int sin_table[100];
int *sin_data_pr;
uint fre_term_pr;
int j;
double i=0;
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
const char char_gen[] = { // As used in 430 Day Watch Demo board
a+b+c+d+e+f, // Displays "0"
b+c, // Displays "1"
a+b+d+e+g, // Displays "2"
a+b+c+d+g, // Displays "3"
b+c+f+g, // Displays "4"
a+c+d+f+g, // Displays "5"
a+c+d+e+f+g, // Displays "6"
a+b+c, // Displays "7"
a+b+c+d+e+f+g, // Displays "8"
a+b+c+d+f+g, // Displays "9"
a+b+c+e+f+g, // Displays "A"
c+d+e+f+g, // Displays "b"
a+d+e+f, // Displays "c"
b+c+d+e+g, // Displays "d"
a+d+e+f+g, // Displays "E"
a+e+f+g, // Displays "f"
a+b+c+d+f+g, // Displays "g"
c+e+f+g, // Displays "h"
b+c, // Displays "i"
b+c+d, // Displays "j"
b+c+e+f+g, // Displays "k"
d+e+f, // Displays "L"
a+b+c+e+f, // Displays "n"
a+b+c+d+e+f+g+dp // Displays "full"
};
/* Private function prototypes -----------------------------------------------*/
void Init_lcd(void); // LCD初始化
void LcdGo(unsigned char Dot); // 打开或关闭液晶
void LcdBlink(unsigned char doit); // 显示或者消隐显示内容
void LCD_Clear(void); // 清屏
void Init_TS3A5017DR(void); // Configure TS3A5017DR IN1 and IN2
void Backlight_Enable(void); // 打开背光
void Init_lcd(void)
{
LCDBCTL0 =LCDDIV0 + LCDPRE0 + LCDMX1 + LCDSSEL + LCDMX1 + LCD4MUX ;
LCDBPCTL0 = LCDS0 + LCDS1 + LCDS2 + LCDS3 + LCDS4 + LCDS5+LCDS6+LCDS7+LCDS8+LCDS9+LCDS10+LCDS11;
P5SEL = 0xfc;
}
void LcdGo(unsigned char Dot)
{
if(Dot==1)
{
//打开液晶显示
LCDBCTL0 |= LCDON;
}
else if(Dot==0)
{
//关闭液晶显示
LCDBCTL0 &= ~LCDON;
}
}
void LcdBlink(unsigned char doit)
{
if(doit==0)
{
LCDBCTL0 &= ~LCDSON;
}
else if(doit==1)
{
LCDBCTL0 |= LCDSON;
}
}
void LCD_Clear(void)//清屏
{
unsigned char index;
for (index=0; index<12; index++)
{
LCDMEM[index] = 0;
}
}
void Init_TS3A5017DR(void)
{
// Configure TS3A5017DR IN1 and IN2
P3DIR |= BIT4 + BIT5; //P3.4 : IN1 ; P3.5 : IN2 set as output
P3OUT &= ~BIT4; //IN1 = 0
P3OUT |= BIT5; //IN2 = 1
}
void Backlight_Enable(void)
{
P5DIR |= BIT7;
P5OUT &= ~BIT7;
}
uint fre_term[10]={977,488,326,244,195,163,140,122,109,98};
void DAC_Init() //DAC初始化
{
DAC12_0CTL0|=DAC12CALON; //启动校验
while((DAC12_0CTL0 & DAC12CALON)!=0);
DAC12_0CTL0|=DAC12SREF_0+DAC12LSEL_0+DAC12IR+DAC12AMP_5+DAC12OPS;
DAC12_0DAT=0x0000;
}
void Clock_Init() //MCLK 16MHZ ,SMCLK 16MHz
{
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
UCSCTL5 |=DIVS_1; //SMCLK 2fenpin
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 24MHz operation
UCSCTL2 = FLLD_1 + 243; // Set DCO Multiplier for 12MHz
// (N + 1) * FLLRef = Fdco
// (243 + 1) * 32768 = 8MHz
// Set FLL Div = fDCOCLK/2=4MHz
__bic_SR_register(SCG0); // Enable the FLL control loop
__delay_cycles(375000);
// Loop until XT1,XT2 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); //
}
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2
Init_lcd(); // LCD初始化
Clock_Init();
//TA0_Init();
TA0CCR0=fre_term[0];
TA0CCTL0|=CCIE;
TA0CTL|=TASSEL_2+MC_1+ID_0+TACLR;//SMCLK=DCO
DAC_Init();
Backlight_Enable(); // 打开背光
LcdGo(1); // 打开液晶模块
LCD_Clear(); // 清屏
LcdBlink(1);
delay_ms(1000);
for(j=0;j<100;j++)
{
i+=PI/50;
sin_table[j]=(int)((sin(i)+1)*2048);
}
LCDMEM[3] = char_gen[1];
delay_ms(1000);
LCDMEM[4]=char_gen[0];
delay_ms(1000);
LCDMEM[5]=char_gen[0];
delay_ms(1000);
//Port_Init();
P2IE|=BIT6+BIT7;
P2IFG&=~(BIT6+BIT7);
P5DIR|=BIT1;//打开扬声器的运放
P5OUT&=~BIT1;
__bis_SR_register(GIE);
while(1)
{
}
}
#pragma vector=PORT2_VECTOR
__interrupt void PortISR(void)
{
switch(__even_in_range(P2IV,16))
{
case 0:break;
case 2:break;
case 4:break;
case 6:break;
case 8:break;
case 10:break;
case 12:break;
case 14: //p2.6
if(fre_term_pr<9)
{
fre_term_pr++;
}
else
fre_term_pr=0;
TA0CCR0=fre_term[fre_term_pr];
if(fre_term_pr==9)
{
LCDMEM[2] = char_gen[1];
LCDMEM[3] = char_gen[0];
}
else
{
LCDMEM[3] = char_gen[fre_term_pr+1];
LCDMEM[2] = 0;
}
P2IFG&=~BIT6;
break;
case 16: //p2.7
if(fre_term_pr>0)
{
fre_term_pr--;
}
else
fre_term_pr=9;
TA0CCR0=fre_term[fre_term_pr];
if(fre_term_pr==9)
{
LCDMEM[2] = char_gen[1];
LCDMEM[3] = char_gen[0];
}
else
{
LCDMEM[3] = char_gen[fre_term_pr+1];
LCDMEM[2] = 0;
}
P2IFG&=~BIT7;
break;
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
DAC12_0DAT=*sin_data_pr++;
if (sin_data_pr >= &sin_table[100])
{
sin_data_pr = &sin_table[0];
}
DAC12_0DAT &= 0xFFF; // Modulo 4096
//__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR)
}
实验现象:可以实现频率的加减切换,频率值为100Hz至1kHz,必进1为100Hz。同时通过扬声器输出。
Lab20 温度采集与显示
把Lab19实验中的实测温度值以摄氏度数值显示在段码LCD上。
实验代码如下:
#include <msp430f6638.h>
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
// LCD segment definitions.
#define d 0x01
#define c 0x20
#define b 0x40
#define a 0x80
#define dp 0x10
#define g 0x04
#define f 0x08
#define e 0x02
#define CALADC12_15V_30C *((unsigned int *)0x1A1A) // Temperature Sensor Calibration-30 C
//See device datasheet for TLV table memory mapping
#define CALADC12_15V_85C *((unsigned int *)0x1A1C) // Temperature Sensor Calibration-85 C
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
const char char_gen[] = { // As used in 430 Day Watch Demo board
a+b+c+d+e+f, // Displays "0"
b+c, // Displays "1"
a+b+d+e+g, // Displays "2"
a+b+c+d+g, // Displays "3"
b+c+f+g, // Displays "4"
a+c+d+f+g, // Displays "5"
a+c+d+e+f+g, // Displays "6"
a+b+c, // Displays "7"
a+b+c+d+e+f+g, // Displays "8"
a+b+c+d+f+g, // Displays "9"
dp, // Displays "."
a+b+c+e+f+g, // Displays "A"
c+d+e+f+g, // Displays "b"
a+d+e+f, // Displays "c"
b+c+d+e+g, // Displays "d"
a+d+e+f+g, // Displays "E"
a+e+f+g, // Displays "f"
a+b+c+d+f+g, // Displays "g"
c+e+f+g, // Displays "h"
b+c, // Displays "i"
b+c+d, // Displays "j"
b+c+e+f+g, // Displays "k"
d+e+f, // Displays "L"
a+b+c+e+f, // Displays "n"
a+b+c+d+e+f+g+dp // Displays "full"
};
//int qian,bai,shi,ge,dot1,dot2;
int shi,ge,dot1,dot2;
unsigned int temp;
volatile float temperatureDegC;
char answer;
//volatile float temperatureDegF;
/* Private function prototypes -----------------------------------------------*/
void Init_lcd(void); // LCD初始化
void LcdGo(unsigned char Dot); // 打开或关闭液晶
void LcdBlink(unsigned char doit); // 显示或者消隐显示内容
void LCD_Clear(void); // 清屏
void Init_TS3A5017DR(void); // Configure TS3A5017DR IN1 and IN2
void Backlight_Enable(void); // 打开背光
/* Private functions ---------------------------------------------------------*/
void Init_lcd(void)
{
LCDBCTL0 =LCDDIV0 + LCDPRE0 + LCDMX1 + LCDSSEL + LCDMX1 + LCD4MUX ;
LCDBPCTL0 = LCDS0 + LCDS1 + LCDS2 + LCDS3 + LCDS4 + LCDS5 + LCDS6+ LCDS7 + LCDS8 \
+ LCDS9 + LCDS10 + LCDS11 ;
P5SEL = 0xfc;
}
void LcdGo(unsigned char Dot)
{
if(Dot==1)
{
//打开液晶显示
LCDBCTL0 |= LCDON;
}
else if(Dot==0)
{
//关闭液晶显示
LCDBCTL0 &= ~LCDON;
}
}
void LcdBlink(unsigned char doit)
{
if(doit==0)
{
LCDBCTL0 &= ~LCDSON;
}
else if(doit==1)
{
LCDBCTL0 |= LCDSON;
}
}
void LCD_Clear(void)//清屏
{
unsigned char index;
for (index=0; index<12; index++)
{
LCDMEM[index] = 0;
}
}
void Init_TS3A5017DR(void)
{
// Configure TS3A5017DR IN1 and IN2
P3DIR |= BIT4 + BIT5; //P3.4 : IN1 ; P3.5 : IN2 set as output
P3OUT &= ~BIT4; //IN1 = 0
P3OUT |= BIT5; //IN2 = 1
}
void Backlight_Enable(void)
{
P5DIR |= BIT7;
P5OUT &= ~BIT7;
}
void change (float tem) //temperatureDegF
{
//qian=(int)tem/1000;//千
//bai=(int)tem%1000/100;//百
shi=(int)(tem)%100/10; //十
ge=(int)tem%10;//个
dot1=(int)(tem*10)%10;
dot2=(int)(tem*100)%100;
}
char display(int mm)
{
if(mm==0) answer=char_gen[0];
else if(mm==1) answer=char_gen[1];
else if(mm==2) answer=char_gen[2];
else if(mm==3) answer=char_gen[3];
else if(mm==4) answer=char_gen[4];
else if(mm==5) answer=char_gen[5];
else if(mm==6) answer=char_gen[6];
else if(mm==7) answer=char_gen[7];
else if(mm==8) answer=char_gen[8];
else answer=char_gen[9];
return answer;
}
int main()
{
WDTCTL = WDTPW + WDTHOLD;// Stop WDT
Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2
Init_lcd(); // LCD初始化
Backlight_Enable(); // 打开背光
LcdGo(1); // 打开液晶模块
LCD_Clear(); // 清屏
REFCTL0 &= ~REFMSTR; // Reset REFMSTR to hand over control to
// ADC12_A ref control registers
ADC12CTL0 = ADC12SHT0_8 + ADC12REFON + ADC12ON;
// Internal ref = 1.5V
ADC12CTL1 = ADC12SHP; // enable sample timer
ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_10; // ADC i/p ch A10 = temp sense i/p
ADC12IE = 0x001; // ADC_IFG upon conv result-ADCMEMO
__delay_cycles(100); // Allow ~100us (at default UCS settings)
// for REF to settle
ADC12CTL0 |= ADC12ENC;
while(1)
{
ADC12CTL0 &= ~ADC12SC;
ADC12CTL0 |= ADC12SC; // Sampling and conversion start
// Temperature in Celsius. See the Device Descriptor Table section in the
// System Resets, Interrupts, and Operating Modes, System Control Module
// chapter in the device user's guide for background information on the
// used formula.
__bis_SR_register(LPM4_bits + GIE); // LPM0 with interrupts enabled
__no_operation();
temperatureDegC=(float)(((long)temp-CALADC12_15V_30C)*(85-30))/(CALADC12_15V_85C-CALADC12_15V_30C)+30.0f;
//temperatureDegF = temperatureDegC * 9.0f / 5.0f + 32.0f; // Temperature in Fahrenheit Tf = (9/5)*Tc + 32
change(temperatureDegC);
LCDMEM[5] = display(dot2);
LCDMEM[4] = display(dot1)+dp;
// LCDMEM[3] = char_gen[10];
LCDMEM[3] = display(ge);
LCDMEM[2] = display(shi);
//LCDMEM[1] = display(bai);
// LCDMEM[0]= display(bai);
__no_operation(); // SET BREAKPOINT HERE
}
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
temp = ADC12MEM0; // Move results, IFG is cleared
__bic_SR_register_on_exit(LPM4_bits); // Exit active CPU
case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14
default: break;
}
}
实验现象:测试得到温度值为319℃,显然知温度值算式有错误。
二、 思考题
1. 简述ADC常用性能指标。
答:主要常用的有以下几点:(1)分辨率 (2)量化误差 (3)转换精度 (4)转换时间
2. MSP430 ADC12有几种内部参考源?应如何选择?
答: 有四种内部参考时钟源:SMCLK,ACLK,MCLK,ADC12OSC。 ADC12_A的时钟源由ADC12PDIV位控制的预分频器和ADC12SSELx位控制的除法器选择,输入时钟由DC12DIVx位和ADC12PDIV位进行1-32分频。
3. MSP430 ADC12 转换内核为什么需要有采样保持电路?
答: 因为A/D转换需要一定的时间来完成量化及编码操作,对高速变化的信号进行瞬时采样时,A/D未转换完毕,采样值已经改变。为了保证转换精度,ADC12 转换内核具有采样与保持功能,即使现场模拟信号变化比较快,也不会影响ADC12的转化。
4.MSP430 ADC12 有哪些转换方式,各自特点是什么?
答: 转换模式有:(1)单通道单次转换 (2)序列通道单次转换 (3)单通道多次转换 (4)序列通道多次转换
转换方式: ①逐次逼近型:它由比较器、D/A转换器、比较寄存器SAR、时钟发生器以及控制逻辑电路组成,将采样输入信号与已知电压不断进行比较,然后转换成二进制数。②并行比较型:转换速度最高。③积分型:通过两次积分将输入的模拟电压转换成与其平均值成正比的时间间隔。在此时间间隔内利用计数器对时钟脉冲进行计数,从而实现A/D转换。
5、MSP430 数模转换模块是如何支持低功耗特性的?
答:ADC12_A内部参考发生器是为低功耗应用设计的。参考电压发生器包括一个带隙电压源和一个单独的缓存器(电流消耗和建立的时间分别在设备数据表中说明)。当ADC12REFON=1时两者同时启用;当ADC12REFON=0时两者都被禁用。当ADC12REFON=1和REFBURST=1,且没有任何转换被激活时,则缓存器自动禁用,并在需要时自动重新启用。当缓存器被禁用时不消耗电流,此时带隙电压源保持使能。