微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 电设工作小结之——MSP430G2553学习笔记——2

电设工作小结之——MSP430G2553学习笔记——2

时间:11-28 来源:互联网 点击:
(四),ADC10

1,ADC10是十位的AD,在g2553上有A0~A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的VCC或GND上。因为是10为的AD所以计算公式如下:

2 ,ADC参考电压的选择:ADC的参考电压可以为:

由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。例如我在使用时遇到的情况如下:

Vref设为2.5V但实际的值大概为2.475V, 选择VCCVSS作为参考,用电压表测得大概为3.58V还是不小的偏差的。

另外,在有可能的情况下,尽量采用较大的VR+和VR-,以减小纹波对采样结果的影响。

3,ADC10的采样方式有:单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。

4,DTC:因为ADC10只有一个采样结果存储寄存器ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用DCT,否则转换结果会不停地被新的结果给覆盖。

DTC是转换结果传送控制,也就是转换结果可以不用CPU的干预,就可以自动地存储在指定的存储空间内。使用这种方式转换速度快,访问方便,适用于高速采样模式中。DTC的使用可以从下面的例子中很容易看明白:

#include msp430g2553.h>

#include "ser_12864.h"

uchar s1[]={"DTC:"};

uchar s2[]={"2_cha_2_time_DTC"};

void ADC_init()

{

ADC10CTL1 = CONSEQ_3 + INCH_1;// 2通道多次转换, 最大转换通道为A1

ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl参考电压选默认值VCC和VSS

//采样保持时间为16 x ADC10CLKs,ADC内核开,中断使能MSC多次转换选择开

//如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行中断使能

//使用DTC时,当一个块传送结束,产生中断

//数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止

ADC10DTC1 = 0x04; //数据传送控制寄存器1 4 conversions定义在每块的传送数目一共采样4次 所以单块传送4次

//以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次

ADC10AE0 |= BIT0+BIT1;// P1.0 P1.1 ADC option select 使能模拟输入脚A0 A1

//不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,

//采样是相同的

}

void main(void)

{

uint adc_sample[8]={0};//存储ADC序列采样结果

WDTCTL = WDTPW+WDTHOLD;

BCSCTL1 = CALBC1_12MHZ;//设定cpu时钟DCO频率为12MHz

DCOCTL = CALDCO_12MHZ;

P2DIR |=BIT3+BIT4;//液晶的两条线

init_lcd();

ADC_init();

wr_string(0,0,s1);

wr_string(0,3,s2);

for (;;)

{

ADC10CTL0 &= ~ENC;//ADC不使能其实这句话可以放在紧接着CPU唤醒之后的,因为CPU唤醒了,说明我们想要的

//转换数据传送完成了,如果ADC继续转换,那么转换结果也不再传输,是无用的。所以紧接着放在CPU唤醒之后

//计时关闭ADC,有利于降低功耗

while (ADC10CTL1 & BUSY);// Wait if ADC10 core is active等待忙

ADC10SA = (unsigned int)adc_sample;//数据传送开始地址寄存器设置DTC的开始地址Data buffer start

//设置数据开始传送的地址为数组adc_sample[]的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把

//地址强制转换为16位的int或unsigned int

//应该也可以用指针直接访问DTC的存储区,还没试过

//例如:前面定义了单块传送4次数据,所以每次传送完成了一个块,也就是4次,就会把中断标志位置位,产生中断

//因为上面设置的地址为数组adc_sample[]的首地址,所以每次转换的结果就会传送到该数组的前4位上,所以如果

//一切正常的话,数组里应该是前4位为转换的结果,后4位为初始值0通过下面的显示,验证转换是正确的

//一次触发首先对A1、A0采样,放入a[0]和a[1]中,再对A1、A0采样,放入a[2]和a[3]中。如此循环下去。

//验证得知,当多通道采样时,先采高的通道,再采低的通道。如上面每次采样时,先采A1 再A0

//因为一共采样传送4次,所以数组的后4位为初始值0

ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion startADC使能,开始转换 ADC10SC为采样触发源

//不需要cpu的干预,DTC就可以把采样结果存储到指定的存储区中

__bis_SR_register(CPUOFF + GIE);// LPM0, ADC10_ISR will force exit如果转换结果传送完成,

//就会进入中断,CPU唤醒 继续往下运行

wr_int(2,0,adc_sample[0]);//显示转换结果A1

wr_int(6,0,adc_sample[1]);//A0

上一篇:ISP和JTAG
下一篇:STM32的ADC产生随机数

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top