一、实验目的
1、了解模/数转换(Analogue-to-Digital Conversion,简称ADC) 的基本原理、转换过程及性能指标;
2、熟练掌握ADC 12模块的四种工作模式;
3、熟练掌握ADC 12模块关键寄存器及其配置和应用方法;
4、掌握应用MSP430F 5529片内温度传感器的方法和编程实现方法;
5、了解PC设备的应用方法及片外温度传感器的编程实现方法;
6、掌握拨盘电位器工作原理、应用和编程实现方法。
二、实验内容
1、实验一
(1)实验题目及要求:编程实现并分析:采用单通道单次采样模式,选择A0通道作为输入通道,模拟转换参考电压组合选择ADC 12模块内部生成电压2.5V和AVss,转换结果存储在ADC12MEM 0缓冲寄存器中。
(2)具体代码如下:
1 #include "ad.h"
2
3 void ioinit()
4 {
5 P6SEL |= BIT0;
6 }
7 void AD_Init()
8 {
9 REFCTLO|=REFMSTR;
10 ADC12CTL0 |= ADC12MSC;
11 ADC12CTL0 |= ADC12ON;
12 ADC12CTL0|=ADC12SHT02;
13 ADC12CTL0|=ADC12REFON;
14 ADC12CTL0|=ADC12REF2_5V;
15 ADC12MCTL0|=ADC12SREF_1;
16 ADC12CTL1|=ADC12SHP;
17 ADC12CTL0|=ADC12ENC;
18 }
19
20 #include <msp430.h>
21 #include "Paper_Display.h"
22 #include "ad.h"
23 #define TimesNewRoman 0
24 #define Arial 1
25 #define ArialBlack 2
26 #define size8 0
27 #define size16 1
28 volatile unsigned char DisBuffer[250*16];
29 void initClock()
30 {
31 UCSCTL6 &= ~XT1OFF;
32 P5SEL |= BIT2 + BIT3;
33 UCSCTL6 &= ~XT2OFF;
34 __bis_SR_register(SCG0);
35 UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
36 UCSCTL1 = DCORSEL_4;
37 UCSCTL2 = FLLD_5 + 1;
38 UCSCTL3 = SELREF_5 + FLLREFDIV_3;
39 UCSCTL4 = SELA_4 + SELS_3 +SELM_3;
40 UCSCTL5 = DIVA_5 +DIVS_1;
41 }
42
43 int main(void)
44 {
45 int i=180;
46 WDTCTL = WDTPW | WDTHOLD;
47 P8DIR |= BIT1;
48 P8OUT &=~ BIT1;
49 initClock();
50 ioinit();
51 AD_Init();
52 volatile unsigned int value = 0;
53 while(1)
54 {
55 ADC12CTL0 |= ADC12SC;
56 value = ADC12MEM0;
57 __delay_cycles(200000 );
58 }
(3)运行结果:
2、实验二
(1)实验题目及要求:采用单通道单次采样模式,模拟转换参考电压组合选择ADC 12模块内部生成电压1.5V和AVss,转换结果存储在ADC12MEM 0缓冲寄存器中,应用MSP430F 5529片内温度传感器编程实现。
(2)具体代码如下:
1 #include <msp430.h>
2 #include "ad.h"
3 #define TimesNewRoman 0
4 #define Arial 1
5 #define ArialBlack 2
6 #define size8 0
7 #define size16 1
8 volatile unsigned char DisBuffer[250*16];
9 void initClock()
10 {
11 UCSCTL6 &= ~XT1OFF;
12 P5SEL |= BIT2 + BIT3;
13 UCSCTL6 &= ~XT2OFF;
14 __bis_SR_register(SCG0);
15 UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
16 UCSCTL1 = DCORSEL_4;
17 UCSCTL2 = FLLD_5 + 1;
18 UCSCTL3 = SELREF_5 + FLLREFDIV_3;
19 UCSCTL4 = SELA_4 + SELS_3 +SELM_3;
20 UCSCTL5 = DIVA_5 +DIVS_1;
21 }
22
23 int main(void)
24 {
25 int i=180;
26 WDTCTL = WDTPW | WDTHOLD;
27 P8DIR |= BIT1;
28 P8OUT &=~ BIT1;
29 initClock();
30 ioinit();
31 AD_Init();
32 volatile unsigned int value = 0;
33 while(1)
34 {
35 ADC12CTL0 |= ADC12SC;
36 value = ADC12MEM0;
37 }
38
39 }
(3)运行结果:
3、实验三:
(1)实验题目及要求:应用扩展板上拨盘齿轮电位器(R4)编程实现。
(2)具体代码如下:
1 #include <msp430.h>
2 #include "ad.h"
3 #define TimesNewRoman 0
4 #define Arial 1
5 #define ArialBlack 2
6 #define size8 0
7 #define size16 1
8 volatile unsigned char DisBuffer[250*16];
9 void initClock()
10 {
11 UCSCTL6 &= ~XT1OFF;
12 P5SEL |= BIT2 + BIT3;
13 UCSCTL6 &= ~XT2OFF;
14 __bis_SR_register(SCG0);
15 UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
16 UCSCTL1 = DCORSEL_4;
17 UCSCTL2 = FLLD_5 + 1;
18 UCSCTL3 = SELREF_5 + FLLREFDIV_3;
19 UCSCTL4 = SELA_4 + SELS_3 +SELM_3;
20 UCSCTL5 = DIVA_5 +DIVS_1;
21
22 int main(void) {
23 int i=180;
24 WDTCTL = WDTPW | WDTHOLD;
25 P8DIR |= BIT1;
26 P8OUT &=~ BIT1;
27 initClock();
28 ioinit();
29 AD_Init();
30 volatile unsigned int value = 0;
31 while(1)
32 {
33 ADC12CTL0 |= ADC12SC;
34 value = ADC12MEM0;
35 if(value > 5)
36 P8OUT |= BIT1;
37 else
38 P8OUT &= ~BIT1;
39 if(value >= 800)
40 P3OUT |= BIT7;
41 else
42 P3OUT &= ~BIT7;
43 if(value >= 1600)
44 P7OUT |= BIT4;
45 else
46 P7OUT &= ~BIT4;
47 if(value >= 2400)
48 P6OUT |= BIT3;
49 else
50 P6OUT &= ~BIT3;
51 if(value >= 3200)
52 P6OUT |= BIT4;
53 else
54 P6OUT &= ~BIT4;
55 if(value >= 4000)
56 P3OUT |= BIT5;
57 else
58 P3OUT &= ~BIT5;
59 __delay_cycles(200000 );
60 }
61 }
(3)运行结果:
见视频;
三、实验中遇到的问题及分析
1、总结MSP430F5529芯片的ADC12模块有几种内部参考源?应该如何选择?
ADC12内部参考电压发生器产生两种电压:1.5V和2.5V。AD转换都需要一个基准信号,通常为电压基准。ADC12内置参考电源,而且参考电压有6种可编程选择,分别为VR+与VR-的组合。
2、写出模/数转换内核需要用采样保持电路的原因,有哪些转换方式及各自特点。
因为被取样的信号是动态,随时改变的,而A/D转换需要时间,在这个转换的过程中,信号是变化的,为了弥补A/D转换的时间差,所以需要采样保持。如果A/D转换很快,比信号本身的变化快10倍或者更高,则无需保持电路。
转换方式:低通采样、内插公式、带通采样、过采样。
3、总结模/数转换模块是如何支持低功耗特性的?
采用低功耗电源和快速启动方式,快速启动是作为低功耗内部首先启动,同时可选时钟源功耗低,以此来达到支持低功耗的目的。
4、叙述如何采集负电压信号?
(1)采用正负输入AD
(2)如果只有负电压、采用反向放大器转为真信号
(3)如果有正有负,加直流分量将其转为正信号
5、叙述如何对正弦波或三角波进行模/数转换实现计数功能?
对于正弦波,由于其对称性,因此应该使用增减计数模式。对于对称的三角波同样可以用增减计数,对于不对称的三角波,可以使用增计数模式,也可以用连续计数模式。
6、叙述如何编程实现将采集的信号波形在屏幕上显示。
可以通过传感器将现场物理量转化为电信号送给A/D转换器,再经过A/D转换器转换成数字量,之后MSP430F5529单片机通过命令字在规定的时序下读取A/D转换器输出的数据。将数据组号成波形,用波形显示控件就能显示,不组合也行,直接传给波形显示控件,就是横坐标显示的是数据点数。