模/数转换模块(ADC 12)的设计与应用
时间:2023-01-17 21:30:00
一、实验目的
了解模/数转换(Analogue-to-Digital Conversion,简称ADC) 基本原理、转换过程和性能指标;
2、熟练掌握ADC 四种工作模式的12模块;
3、熟练掌握ADC 12模块关键寄存器及其配置及应用方法;
4、掌握应用MSP430F 5529片温度传感器的方法和编程实现方法;
5、了解PC片外温度传感器的温度传感器的编程实现;
掌握拨盘电位器的工作原理、应用和编程实现方法。
二、实验内容
1、实验一
(1)实验主题及要求:编程实现与分析:采用单通道单采样模式A0通道作为输入通道,模拟转换参考电压组合选择ADC 212模块内的生成电压.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 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 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 2 #include "ad.h" 3 #define TimesNewRoman 0 4 #define Arial 1 5 #define ArialBlac 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转换器输出的数据。将数据组号成波形,用波形显示控件就能显示,不组合也行,直接传给波形显示控件,就是横坐标显示的是数据点数。