TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430AFE253 ADC采集

//////////////////////////////////////////////////////////////////////
//本程序实现功能:
// 1、AD采集A0端口的电压值,毫伏级:单片机端口采集电压范围是正负600毫伏,
//本程序采集电压增益为16,因此端口采集电压范围是正负37.5毫伏(600/16=37.5),定时1秒钟将采集
//的电压数值通过串口上传到计算机,在计算机上打开串口调试助手,即可看
//到采集的具体数值。此段程序的用途是检测AD是否工作正常。
// 2、串口发送十六进制数据,开发板将接收的数据直接返回。此段程序的//用途是检测开发板串口是否正常工作。
//2016/04/10,牛牛(QQ:531706356)调试整理
//////////////////////////////////////////////////////////////////////
#include "CAN.h"
#include "msp430_config.h"
#include "mcp2515.h"

#define uchar unsigned char
#define uint unsigned int
////////////////////////////////////////////////////////
void Init_Clk();
void Init_TimeA();
void init_SD24();
void ConvToPreVal();
void SendDataToUSART();
/****************************************/
uint Ch0Adc=1; //压力AD数据
int Ch0MinAdc=0x00; //零点,有符号数
uint Ch0MaxAdc=0x7FFF; //最大压力通道输入电压
uchar PresGain; //压力增益
uint PresScale=5000; //压力量程
long uint OutPutPressData; //输出压力数据

uchar FilterIndex=0;
uint FilterBuf[4]={0};
uchar times; //计数次数
uchar SYSTime;
uchar SendBuff[8]={0}; //发送缓存区
///////////////////////////////////////////////////////////
void Init_Clk()
{ uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器 //基础时钟控制寄存器BCSCTL1的第7位置0,使XT2启动
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (i = 0xFF; i > 0; i–); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS+DIVS_0; //选择MCLK为XT2 SMCLK为XT2 不分频
}

////////////////////////////////////////////////////////
void UART(void)
{
U0CTL = SWRST; U0CTL &= ~SYNC; U0CTL = CHAR; // 8-bit character
U0TCTL = SSEL1; // UCLK= SMCLK
P1SEL |= BIT3+BIT4; // P1.3,1.4 = USART0 TXD/RXD
ME1 = UTXE0 + URXE0; // Enable USART0 TXD/RXD

U0BR0 = 69; // 1MHz 115200
U0BR1 = 0x00; // 1MHz 115200
U0MCTL = 0x00; // 1MHz 115200 modulation
U0CTL &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Enable USART0 RX interrupt
}
//////////////////////////////////////////////
void init_SD24()
{ uint i;
SD24CTL = SD24SSEL_1+SD24REFON+SD24DIV_3; // 1.2V ref, SMCLK,SMLCK 8分频
SD24INCTL0 = SD24INCH_0+SD24GAIN_16; // Set channel A0+/- 16倍增益 SD24CCTL0 |= SD24SNGL + SD24IE+SD24OSR_512+SD24DF; // Single conv,enable interrupt 采样率为512 数据格式(当增益为1时0-32768表示0~-600mv 65535~32768表示0~600mv) for (i = 0; i < 0x3600; i++); // Delay for 1.2V ref startup

}
////////////////////////////////////////////////////////////
void ConvToPreVal() //换算成压力数据
{
long uint t;
long uint CompVal=0; //修正因子
if((Ch0Adc<(0xFFFF-Ch0MinAdc))&(Ch0Adc>0x8000)) t=1;//数据无效
else
{
if(Ch0Adc>0x8000)//为负数
t=Ch0MinAdc-(0xFFFF-Ch0Adc);
else
t=Ch0Adc+Ch0MinAdc;
}
t=t*PresScale;
t=t/(Ch0MaxAdc+Ch0MinAdc);
OutPutPressData=t+CompVal; //20121010
}
//////////////////////////////////////////////////////
void SendDataToUSART()
{
SendBuff[0]=OutPutPressData/256;
SendBuff[1]=OutPutPressData%256;
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = SendBuff[0]; // to TXBUF0

while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = SendBuff[1]; // to TXBUF0
}
/////////////////////////////////////////////////////////
void Init_TimeA()
{
TACCTL0 = CCIE; //TBCCR0允许中断
TACCR0 = 8000; //TIME:8000/(8mhz) =1ms TACTL = TASSEL_2 + MC_1; //SMCLK,增计数模式
_BIS_SR( GIE);}
////////////////////////////////////////////////////////////////////////
void main(void)
{ WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
Init_Clk();
UART();
init_SD24();
delay_s(1);
Init_TimeA();
__enable_interrupt(); //Enable the Global Interrupt
while(1)
{
if(SYSTime>=10) //TIME:100ms*10=1 S {
SYSTime=0;
ConvToPreVal(); SendDataToUSART();
}
}
}

/////////////////////////////////////////////////////////////
#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){ __disable_interrupt();
times++; if(times>=100) //IME:1ms*100=100MS {
SYSTime++; SD24CCTL0 |= SD24SC; //AD开始转换
times=0;
}
__enable_interrupt();}

/////////////////////////////////////////////////////////////////
#pragma vector=SD24_VECTOR //SD24 interrupt
__interrupt void SDA24(void)
{ //滑动平均滤波算法(递推平均滤波法)
uchar i;
long uint sum=0;
FilterBuf[FilterIndex++]=SD24MEM0; // Save CH0 results (clears IFG)
if(FilterIndex==4) FilterIndex=0; //先进先出,再求平均值
for(i=0;i<4;i++)sum+=FilterBuf[i];
Ch0Adc=(sum/4);
SD24INCTL0 = SD24INCH_0;
SD24CCTL0 |= SD24SNGL + SD24IE+SD24OSR_256; // Single conv,enable interrupt 采样率为512 数据格式(当增益为1时0-32768表示0~-600mv 65535~32768表示0~600mv
}

#pragma vector=USART0RX_VECTOR
__interrupt void USART0_RX (void)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
}

灰小子:

感谢分享

Maka Luo:

如果把原理图一起贴上来分享就更佳了

xingwang bai:

感谢分享

赞(0)
未经允许不得转载:TI中文支持网 » MSP430AFE253 ADC采集
分享到: 更多 (0)