MSP430F4250 AD解读

1.关于MSP430F4250:

2.关于MSP430F4250 AD:

参考MSP430X4XXFamily User’s Guide:

关于16位AD采样有两种:

2.1 MSP430F4250选的是哪种?

其实并不是软件设置哪种,而是型号决定,由上述可知,MSP430F4250使用的是SD16_A 

2.2 MSP430F4250 AD的输入电压范围是多少?

此时参考的手册需要更换为MSP430F42X0手册:

2.3 MSP430F4250 AD的转换结果在哪?数据格式是什么?

继续参考MSP430X4XX Family User’s Guide手册:

 

AD的转换结果就在SD16MEMx这个寄存器里保存,数据格式和设置有关:

 

其中SD16UNI和SD16DF都是SD16CCTLx(其中x是用户选择的通道编号)寄存器中的两位。

另外补充,关于FSR:

MSP430F4250 AD有内部参考电压1.2V,如果设置了选取内部参考电压,那么FSR = 1.2V/2/GAIN= 0.6V(当GAIN = 1时)。

如果没有选取内部参考电压,那么FSR = Vref/2/GAIN(想得到最大的输入范围,就把AVcc[3.3v]接到单片机的Vref引脚上)。(纯属个人理解和设置,最高只试过1.6V的,但是手册上的意思应该可以0-3.3V,暂时没有尝试)。

是否选择内部参考电压,在SD16CTL寄存器中的:

 

2.4 MSP430F4250 AD的转换速率?

参考MSP430X4XX Family User’s Guide手册,AD转换速率和单片机时钟配置有关:

 

可知如果使用32768-Hz的外部晶振,则CPU主时钟MCLK=外设时钟SMCLK=1MHz左右(默认值,如果想要改变则可以通过设置SCFQCTL和SCFI0进行倍频)。AD设置时钟源可以选择是ACLK(32768Hz)和SMCLK(1MHz),AD时钟选择上选择SMCLK(SMCLK=MCLK为最快)即可得到最快的转换速率,下面是一种设置下的转换速率的说明:

256的过采样率,并且每四次采样触发一次中断,那么约244us进行一次AD转换。

AD代码如下:

#include <msp430x42x0.h>


#define Num_of_Results 80

/* Arrays to store SD16_A conversion results */
/* NOTE: arrays need to be global to */
/* prevent removal by compiler */
static unsigned int results[Num_of_Results];

void main(void)
{
volatile unsigned int i; // Use volatile to prevent removal
// by compiler optimization

WDTCTL = WDTPW + WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps
for (i = 0; i < 10000; i++); // Delay for 32 kHz crystal to
// stabilize
P1SEL = 0; //GPIO
P1DIR = 0xff; //out

SD16CTL = SD16REFON+SD16SSEL0; // 1.2V ref, SMCLK
SD16INCTL0 |= SD16INTDLY_0; // Interrupt on 4th sample
SD16CCTL0 |= SD16IE ; // Enable interrupt
for (i = 0; i < 0x3600; i++); // Delay for 1.2V ref startup

_EINT(); // Enable general interrupts

SD16CCTL0 |= SD16SC; // Set bit to start conversion
_BIS_SR(LPM0_bits); // Enter LPM0

}

#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
static unsigned int index = 0;

switch (SD16IV)
{
case 2: // SD16MEM Overflow
break;
case 4: // SD16MEM0 IFG
results[index] = SD16MEM0; // Save CH0 results (clears IFG)
P1OUT = 0x03; //Pin 0,1 out 1
if (++index == Num_of_Results)
{
index = 0; // SET BREAKPOINT HERE
//SD16CCTL0 &=~ SD16SC;
P1OUT = 0x00; //Pin 0,1 out 0
}
break;
}
}

AD代码的示波器测试:(通过观察P1.0输出)

连续转换的每次转换时间为224us,转换80次为19.6ms。 

以上纯属个人见解,初学者可以参考但一切以官方手册为准。

永不止步步 发表于04-18 10:44 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308317个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号