历史上的今天
今天是:2025年01月19日(星期日)
2021年01月19日 | MSP430G2553ADC要点总结
2021-01-19 来源:eefocus
一、 ADC10的结构
①10位ADC内核
ADC10内核是一个10位的模/数转换器,并能够将结果存放在转换存储器中。该内核使用两个可编程的参考电压(VR+和VR-)定义转换的最大值和最小值。**当输入模拟电压等于或者高于VR+时, ADC10输出满量程值03FFH,当输入电压等于或小于VR-时, ADC10输出0。**输入通道和参考电压定义在转换控制存储器中。转换结果可以是直接的二进制或者是补码格式。当使用二进制时转换公式是:
N_ADC=1023×(V_IN-V_(R-))/(V_(R+)-V_(R-) )
控制寄存器 : ADC10CTL0和ADC10CTL1来配置
开关控制 : ADC10ON
除少数例外,ADC10的控制位只有在ENC=0的条件下才能被修改。在任何转换开始之前必须把ENC置位。
ADC10CLK既是转换时序,又是采样时钟。通过控制位ADC10SSELx来选择ADC10的时钟源,ADC10DIVx位可以将时钟进行1到8分频。 ADC10CLK的时钟源有SMCLK、MCLK、 ACLK和内部振荡器ADC10OSC。ADC10OSC是内部生成的频率约5MHz的时钟,受芯片本身及供电电压、温度等因素的影响。
②ADC10模拟多路器
ADC10只有一个内核,当对多个模拟信号进行采样并进行A/D转换时,需要用到多路选择器分时接通每一个模拟信号,完成一次采样和转换。 ADC10配置有8路外部通道和4路内部通道,通过A0~A7实现外部8路模拟信号输入, 4路内部通道可以将VeREF+、VREF-/VeREF-、(AVcc-AVss) /2以及片内温度传感器的输出作为待转换模拟输入信号。内部通道的测量可以用于监控有关ADC10的自检、校验和诊断功能以及芯片内的温度。
ADC10外部输入Ax, VREF+和VREF-共用I/O端口,这些数字CMOS门电路在模拟信号通过时易产生寄生电流,禁止端口管脚的缓冲功能可以减少寄生电路并降低整体能耗。关闭这些I/O的输入输出寄存器可以使用控制位ADC10AEx。
③参考电压发生器
ADC10模块内部有两个可选择的参考电压,设置REFON=1时,内部参考电压可用。控制位REF2_5V=1,内部参考电压是2.5V; REF2_5V=0,参考电压1.5V。内部参考电压既可用在模块内部(REFOUT=0),也可以在器件具备管脚VREF+和VREF-的前提下,通过管脚VREF+输出(REFOUT=1)。
外部参考电压可以分别通过管脚A4和A3给VR+和VR-使用。当使用外部参考电压或使用Vcc作为参考电压时,内部参考电压可以关闭以节省能耗。
外部正参考电压VeREF+可以通过控制位SREF0=1、SREF1=1来进行缓存设置,这样在使用外部参考电压时具有大的内阻,从而降低了电流消耗。当REFBURST=1时增加的电流消耗仅限于采样和转换过程。ADC10内部参考电压发生器的设计上考虑了低功耗应用,在使用中可以参考用户说明的设置,将不使用的部分关闭掉以最大限度地节省能耗。
④采样与转换时序
*采样输入信号SHI的上升沿触发一次模/数转换。*控制位SHSx来设定SHI的源,这些源包括:
• ADC10SC位
• Timer_A输出单元1
• Timer_A输出单元0
• Timer_A输出单元2
SHI信号源的极性可以通过ISSH位的设置而翻转。控制位SHTx的设定选择采样时间tsample分别为4、 8、 16、 64个ADC10CLK周期。采样定时器在设定采样时间后置位SAMPCON,并与ADC10CLK同步,所以采样时间应该是tsample与tsync之和。当SAMPCON由高变低时触发模/数转换开始,模/数转换需要13个ADC10CLK周期。
二、 ADC10转换模式
ADC10有四种转换模式,控制位CONSEQx设定不同工作模式,如下
| CONSEQx | 模式 | 操作描述 |
|---|---|---|
| 00 | 单通道单次转换 | 一个模拟信号通道,只转换一次 |
| 01 | 序列通道单次转换 | 多个模拟信号通道,每个通道转换一次 |
| 10 | 单通道重复转换 | 一个模拟信号通道,重复模/数转换 |
| 11 | 序列通道重复转换 | 多个模拟信号通道,顺次重复模/数转换 |
①单通道单次转换
INCHx选择单通道并采样和转换一次。模/数转换结果写到ADC10MEM中。如下图示是单通道单次模式的流程图。当ADC10SC触发模/数转换时(软件设置触发),控制位ADC10SC可以成功触发一次模/数转换。当使用其它触发源时, ENC必须在每次模/数转换之间进行状态切换。
② 序列通道单次转换
多个通道顺次被采样和转换一次。序列开始于选择位INCHx并递减到A0通道。每次模/数转换的结果被写入ADC10MEM中,当A0通道转换完成后停止工作。如下图示是序列通道单次转换流程图。当ADC10SC触发该序列模/数转换开始时,不需要ENC状态切换;当其它触发源用于触发序列转换开始时, ENC必须在每一个序列之间切换状态。
③ 单通道重复转换
由INCHx选定输入通道后,采样和模/数转换连续重复进行。每一次ADC转换结果被写入ADC10MEM中。如下图示是单通道重复转换流程图。
④ 序列通道重复转换
多个模拟通道被顺次采样和转换后重复前面的过程。通道序列从INCHx开始递减到通道A0。每一个ADC转换结果被写入ADC10MEM中。序列在通道A0完成转换后,有触发信号重新下一轮序列转换开始。此模式的转换流程图如下所示
⑤ 使用控制位MSC
在多次重复采样/转换时,可以使用控制位MSC将转换过程尽可能快地自动连续起来。具体设置如下表所示。
| 有效条件 | MSC | 具体操作内容 |
|---|---|---|
| CONSEQx>0 | 0 | 每次转换需要SHI信号的上升沿触发采样定时器 |
| CONSEQx>0 | 1 | 仅首次转换由SHI信号的上升沿触发采样定时器,而后采样转换将在前一次转换完成后立即进行 |
⑥停止ADC10的方法
如何停止ADC10取决于在哪种转换模式下,以下是推荐使用的方法,用来停止单次转换和序列转换:
• 在单通道单次转换模式下,复位ENC能够立刻停止模/数转换,但是结果是不可信的。若要获得正确的转换结果,可以查询ADC10BUSY位,直到该位复位后再清除ENC,这样得到的转换结果是可信的。
• 在单通道重复转换模式下,复位ENC将在当前模/数转换完成后ADC10停止工作。
• 在一个序列或者重复序列工作模式下,复位ENC将使得ADC10在当前序列完成后停止工作。
• 任何模式下,如果设定CONSEQx=0并复位ENC,则ADC10模块停止工作。得到转换数据是不可信的。
三、 ADC10数据传输控制器
ADC10模块有一个数据传输控制器(DTC), DTC自动传输模/数转换结果从ADC10MEM到片上其他内存单元。通过设定ADC10DTC1寄存器为非0值便使能了DTC。当DTC工作时,每次ADC10模块完成一次模/数转换并将结果写入ADC10MEM中,就将触发一次数据传输。在传输预定义数量数据完成之中,不允许有其他软件干预。每一次DTC传输需要一个CPU周期(MCLK)。在数据传送期间,为避免任何总线干扰,CPU除执行传输必须的那个机器周期外则时钟处于停止状态。
在ADC10模块处于工作状态时,无法初始化DTC传输。所以在配置DTC时需要保证没有处于模/数转换中或者队列转换中。
ADC10CTL0 &= ~ENC;while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active12






四、 ADC10中断系统

ADC10模块有一个中断向量,中断系统如上图示。当DTC不使用时(ADC10DTC1=0),每次模/数转换完成将结果写入ADC10MEM时ADC10IFG被置位;当DTC使用时,每次数据传输完毕或者内部传输计数器为0时, ADC10IFG被置位。在ADC10IE和GIE都使能的前提下, ADC10IFG将生成中断请求。在中断请求被响应后中断标志位ADC10IFG自动复位,或者可以软件清除中断标志位。
五、 ADC10寄存器


六、 ADC10程序实例
例一
#include "msp430g2553.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON,
//interrupt enabled
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= 0x02; // PA.1 ADC option select
P1DIR |= 0x01; // Set P1.0 to output direction
for (;;)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
if (ADC10MEM < 0x1FF)
P1OUT &= ~0x01; // Clear P1.0 LED off
else
P1OUT |= 0x01; // Set P1.0 LED on
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
本例中采用A1通道的单次采样,默认参考电压AVcc。使用软件设置ADC10SC启动采样和转换,转换完成后ADC10SC自动清除复位。通过设定ADC10SHTx控制采样和转换时间是16× ADC10CLKs。在主程序循环中,使用MSP430的低功耗模式LPM0,等待模/数转换完成,触发ADC10中断,在中断中退出LPM0,返回主程序判断A1通道的采样值,依据采样值的大小设定P1.0。
例二
#include "msp430g2553.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = ADC10DF + INCH_1; // Conversion code singed format, input A1
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10AE0 |= 0x02; // P1.0 ADC option select
P1DIR |= 0x01; // Set P1.0 to output direction
for (;;)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
if ((int)ADC10MEM < 0)
P1OUT &= ~0x01; // Clear P1.0 LED off
else
P1OUT |= 0x01; // Set P1.0 LED on
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
这个例子中与上例不同的是采用的是带符号数表征ADC10的转换值。
例三
#include "msp430g2553.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = INCH_11; // AVcc/2
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON;
P1DIR |= 0x01; // Set P1.0 to output direction
for (;;)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
while (ADC10CTL1 & ADC10BUSY); // ADC10BUSY?
if (ADC10MEM < 0x311) // ADC10MEM = A11 > 0.65?
P1OUT |= 0x01; // Set P1.0 LED on
else
P1OUT &= ~0x01; // Clear P1.0 LED off
}
}
本例中使用A11通道,测量的是AVcc/2,参考电平选择内部参考电平VREF的1.5V。从而将该测量成为测定电池电压的应用。程序中使用了查询ADC10BUSY,以判断模/数转换是否完成。
例四
#include "msp430g2553.h“
unsigned short buf[0x20];
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = CONSEQ_2 + INCH_1; // Repeat single channel, A1
ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl
ADC10DTC1 = 0x20; // 32 conversions
ADC10AE0 |= 0x02; // P1.1 ADC option select
P1DIR |= 0x01; // Set P1.0 to output direction
for (;;)
{
ADC10CTL0 &= ~ENC;
while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active
ADC10SA = (unsigned short)buf; // Data buffer start
P1OUT |= 0x01; // Set P1.0 LED on
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
P1OUT &= ~0x01; // Clear P1.0 LED off
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
本例中涉及了ADC10模块的采样转换模式、数据传输模式,具体来讲选择单通道重复模式,数据传输次数为32次的one-block传输。参考电压是AVcc,软件置位ADC10SC触发采样开始,在模/数转换中让单片机工作在LPM0低功耗模式,并用P1.0的高低电平来表征转换开始与结束。
上一篇:MSP430 DMA程序库
史海拾趣
|
如题,大家把自己的资料拿出来分享本来是一件很有意义的事情,但是好的资料并不是对每个人适用,我就下过好几次看题目好像是对我有用的东西,但是下来一看内容不太对口,浪费点芯币没什么,还浪费感情,不便于选择,以后希望大家能好人做到底把内容 ...… 查看全部问答> |
|
1.有效的解决传输线的阻抗计算。 a.算法基于IPC b.可以解决所有PCB设计层叠及阻抗的计算 c.中、英文界面友好 2.解决电源载流设计方案 解决电源的走线、铜皮、过孔载流,温升,DC损耗问题。 3.趋肤效应分析 用于分析高速,射频传输线的 ...… 查看全部问答> |
|
想自己编写程序控制 ppc上 activesync的菜单 CWnd* pWnd=FindWindowW(NULL,L\"ActiveSync\"); HWND hwndMB = SHFindMenuBar (pWnd->m_hWnd); 已经得到menubar的句柄了 下面该怎么写呢 查了MSDN 说是 ...… 查看全部问答> |
|
关于这两个参数的计算 根据如上条件 是怎么算出来0x00 0x00 0x06的? 下面来掰一下小学计算: 1.( (ADDST + 1) + (DATAST + 1) )*HCLK =MAX(Trc ,Twc); 2.DATAST*HCLK = Twp; 3.DATAST = (Tavqv + Tv + Tsu)/HCLK - ADDST - 4 ;手册上写 ...… 查看全部问答> |




