MSP430G2553 模数转换器 ADC10
一、ADC10组成
ADC10模块是MSP430 MCU内部的一个高性能、10位的模数转换器,包含了SAR(Successive-Approximation-Register) core、采样选择控制、基准源发生器和DTC(Data Transfer Controller)。DTC功能允许采样结果直接内部存储,而不需要CPU的干预。
ADC10的框图和主要寄存器的含义,如下图所示。虽然ADC10牵扯的寄存器配置很多,但实际使用起来并不复杂。
二、相关寄存器
主要寄存器及功能有:
ADC10AEx:模拟输入使能,用于使能某个管脚的模拟输入功能
ADC10MEM:保存AD转换的结果
ADC10CTL0:
- ADC10ON:开启/关闭ADC10
- ENC:Enable conversion。几乎所有的ADC10设置都要在ENC=0时进行。
- ADC10SC:Start conversion。开始转换后会自动清零。
- SREFx:选择正负基准源
- REFOUT、REFBURST、REF2_5V、REFON:选择内部基准源及其工作方式
- ADC10SHTx:选择采集和保持的时钟周期数目
- ADC10SR:选择reference buffer drive capability,影响最大采集速率
- ADC10IE、ADC10IFG:中断使能和中断标志位
- MSC:多次采集转换设置,只用于序列(sequence)或反复(repeated)模式采样。
ADC10CTL1:
- INCHx:输入通道选择,可选择外部管脚、基准源、内部温度传感器等。
- SHSx:选择采样信号由谁触发,默认是ADC10SC位,也可以是TimerA.OUTx。
- ADC10DF:转换数据格式,直接二进制或者二补码。
- ADC10SSELx、ADC10DIVx:选择ADC10的时钟,分频比。时钟默认采用ADC10内部的专门时钟ADC10OSC,频率约在5MHz左右。
- CONSEQx:选择模式,有单通道单次(默认)、多通道单次、单通道重复、多通道重复四种。
- ADC10BUSY:标志ADC10是否采样、转换完成。
如果使用到DTC的功能,还需要操作ADC10DTC0、ADC10DTC1、ADC10SA寄存器,具体可查看MSP430x2xx Family User's Guide。
三、代码示例
利用ADC10,每2秒读取一次A6(P1.6)通道上的电压,通过串口打印显示。
// voltage meter 2015.10.1
// for MSPG2 launchpad, VCC = 3.6V; and if Vcc changes,
// ref_vcc should be modified. #include "io430.h" #define A6 BIT6 // ADC input pin P1.6
#define RXD BIT1 //P1.1
#define TXD BIT2 //P1.2 #define IDLE 0
#define BUSY 1 // function definitions
void initADC10(void);
void initTA0(void); void sendByte(unsigned char);
void printf(char *, ...);
void initUART(void); // global variables
float volts = 0.0; // unit: mV
float ref_vcc = 3600.0;
char i = ;
char status = IDLE; void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD; // DCO setup
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ; // ADC10 setup
initADC10(); // UART setup
initUART(); // Timer0 setup
initTA0(); __enable_interrupt(); LPM0; while()
{
switch(status)
{
case IDLE:
break;
case BUSY:
ADC10CTL0 |= ADC10SC; // start a new conversion
while ((ADC10CTL1 & ADC10BUSY) == 0x01); // wait for conversion to end
volts = ADC10MEM * ref_vcc /1023.0;
printf("Voltage: %i mV\r\n", (int)volts);
status = IDLE;
break;
}
LPM0; }
} void initADC10(void)
{
// Use Vcc(3.6V)/GND for Refs, 16 x ADC10CLKs, reference buffer on, turn on ADC
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10SR + ADC10ON; // A6 input, use ADC10CLK div 1, single channel mode
ADC10CTL1 = INCH_6 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0; // ADC input on P1.6
ADC10AE0 = A6; // Enable conversions
ADC10CTL0 |= ENC;
} void initTA0(void)
{
TA0CCR0 = - ;
TA0CCTL0 = CCIE; // enable compare interrupt
TA0CTL = TASSEL_2 + ID_3 + MC_1 + TACLR;
// input clock: SMCLK/8 -> 125kHz; Up to CCR0 mode
// timer overflow freq: 125k/(TA0CCR0+1) -> 2Hz -> 500ms
// clear and start the timer, up mode
} void initUART(void) {
//config P1.1 RXD, P1.2 TXD
P1SEL |= TXD + RXD;
P1SEL2 |= TXD + RXD; //reset UCA0, to be configured
UCA0CTL1 = UCSWRST;
//config
UCA0CTL1 |= UCSSEL_2; //SMCLK
UCA0BR0 = ;
UCA0BR1 = ;//1MHz baut rate = 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
//make UCA0 out of reset
UCA0CTL1 &= ~UCSWRST;
} void sendByte(unsigned char byte )
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = byte; // TX -> RXed character
} //interrupt service routines
#pragma vector = TIMER0_A0_VECTOR
__interrupt void CCR0_ISR(void)
{
if(++i == ) // interval: 1/2 * 4 = 2s, freq: 0.5Hz
{
// automatic flag clearing
i = ;
status = BUSY;
LPM0_EXIT;
}
}
MSP430G2553 模数转换器 ADC10的更多相关文章
- 模数转换器(ADC)的基本原理【转】
模数转换器(ADC)的基本原理 模拟信号转换为数字信号,一般分为四个步骤进行,即取样.保持.量化和编码.前两个步骤在取样-保持电路中完成,后两步骤则在ADC中完成. 常用的ADC有积分型.逐次逼近型. ...
- MSP430G2553之timerA产生PWM
总结:选SMCLK(可以测出来) 若选ACLK,经示波器PWM时有时无 举例一: #include <MSP430G2553.h> #define CPU_F ((doub ...
- ∑–△型模数转换器(ADC)简介
∑–△型模数转换器(ADC) 1.概述 近年来,随着超大规模集成电路制造水平的提高,Σ-Δ型模数转换器正以其分辨率高.线性度好.成本低等特点得到越来越广泛的应用.Σ-Δ型模数转换器方案早在20世纪60 ...
- msp430学习笔记-msp430g2553
C语言例程:http://wenku.baidu.com/link?url=49JzNSvt3m0fRuf8SWTEM8yEw1yzqr4lBR-QbX8FddcmjTVYnDhuR97wB60HNf ...
- MSP430G2553 Launchpad 硬件I2C驱动
一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...
- 采用FPGA实现音频模数转换器
http://www.21ic.com/app/eda/200905/42832.htm http://www.eefocus.com/article/09-10/84673s.html 摘 要 简要 ...
- MSP430G2553电子时钟实验
用msp430g2553控制1602液晶显示时间,并能够通过按键设置时间.我做了正计时和倒计时两种模式 /*********************************************** ...
- 理解模数转换器的噪声、ENOB和有效分辨率
ADC的主要趋势之一是分辨率越来越高.这一趋势影响各种应用,包括工厂自动化.温度检测和数据采集.对更高分辨率的需求正促使设计者从传统的12位逐次逼近寄存器(SAR)ADC转至分辨率高达24位的Δ-ΣA ...
- SAR ADC : 逐次逼近寄存器型(SAR)模数转换器(ADC)
1.为实现二进制搜索算法,N位寄存器首先设置在中间刻度(即:100... .00,MSB设置为1).这样,DAC输出(VDAC)被设为VREF/2,VREF是提供给ADC的基准电压.然后,比较判断VI ...
随机推荐
- ubuntu安装了mysql 但是编译报错 mysql.h: No such file or directory
在Ubuntu体系中,已经安装了mysql,即应用sudo apt-get install mysql-server mysql-client 但是用C编译mysql数据库时,报错fatal erro ...
- MySQL 多表关联更新及删除
目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一. 多表关联更新 问题 ...
- Bootstrap-Plugin:下拉菜单(Dropdown)插件
ylbtech-Bootstrap-Plugin:下拉菜单(Dropdown)插件 1.返回顶部 1. Bootstrap 下拉菜单(Dropdown)插件 Bootstrap 下拉菜单 这一章讲解了 ...
- 学习笔记之C++ Primer中文版(第五版)
非常权威系统的语言书,正好学习下C++11内容. C++ Primer_百度百科 http://baike.baidu.com/link?url=YLvDJE9w3CjGp3eQwjuXYKUZs7v ...
- CFGym 100211J 题解
一.题目 二.题意 给定一个字母表(最多也就是英文小写字母的前10个字母),一个交换表,两个字符串,判断字符串A能否通过交换表的交换方式变成字符串B. 三.思路 1.一开始,比赛时,我半模拟半记忆化地 ...
- linux记录每个用户执行的命令
1.在/etc/profile中添加如下代码: #history USER_IP=`>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` HISTD ...
- django rest_framework 框架的使用02
rest_framework 访问频率的限制(节流) 对于用户访问频率的显示,rest_framework 也有自己的类进行约束 先来一个自己的基于它的类的节流类的限制 class VisitCont ...
- 让别人能登陆你的mysql
线上的数据库肯定是不能轻易在开发新功能的时候动的,如果你的数据库跟线上不一样了又没有新数据库的备份,就很麻烦. 当然去动线上数据库,出了什么问题我是不想背锅的. 最稳健的办法!让管理线上数据库的同学, ...
- Spring Boot 异步调用
添加一个类ThreadPoolConfig.java package com.cjcx.inter.framework.config; import org.springframework.conte ...
- 智能指针--C++
智能指针(一):STL auto_ptr实现原理 智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了 ...