標(biāo)題:
MSP430F5529單片機24位AD采樣ADS1256串口發(fā)送采樣數(shù)據(jù)
[打印本頁]
作者:
小小白111
時間:
2017-8-7 10:32
標(biāo)題:
MSP430F5529單片機24位AD采樣ADS1256串口發(fā)送采樣數(shù)據(jù)
#include "msp430F5529.h"
#include "ADS1256.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL = BIT3+BIT4;
UCA0CTL1|=UCSWRST;
UCA0CTL1|=UCSSEL_1;
UCA0BR0 = 0x03; // 32kHz/9600=3.41 (see User's Guide)
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0
UCA0CTL1&=~UCSWRST;
UCA0IE|=UCRXIE;
_EINT();
ADS1256_IO_init();
ADS1256_Init( );
while(1)
{
ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM);
ADS_sum(ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM);
}
}
// Echo back RXed character, confirm TX buffer is ready first
/*#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
}*/
/*******************ADS1256的模擬SPI設(shè)置********************/
unsigned char ADS1256_SPI(unsigned char dat)
{
unsigned char i,r=0;
ADS1256_SCLK_L;
for(i=0;i<8;i++)
{
r = r<< 1; //SOMI接收的數(shù)據(jù)左移
if(dat & 0x80)
ADS1256_SIMO_H; //高
else //
ADS1256_SIMO_L; //低
//
ADS1256_SCLK_H; //SCK置高 |下
dat =dat << 1; // |降
ADS1256_SCLK_L; //SCK置低 V沿
if(ADS1256_SOMI) //判斷接受的數(shù)據(jù)
r = r | 0x01;
else
r = r & 0xfe;
}
delay_us(100); //延時 t11
return r;
}
/************************************************************/
/*****************ADS1256寫寄存器******************************/
void ADS1256_WREG(unsigned char regaddr,unsigned char dat)
{
while(ADS1256_DRDY); //當(dāng)DRDY為低是才能寫寄存器
ADS1256_SPI(ADS1256_CMD_WREG | (regaddr & 0xF)); //WREG指令+地址
ADS1256_SPI(0x00);
ADS1256_SPI(dat); //向ADS1256寄存器寫數(shù)據(jù)
}
/************************************************************/
/*****************ADS1256讀數(shù)據(jù)*******************************/
unsigned long ADS1256_ReadData(void)
{
unsigned char i=0;
unsigned long sum=0;
unsigned long r=0;
while(ADS1256_DRDY); //當(dāng)DRDY為低是才能寫指令
ADS1256_SPI(ADS1256_CMD_SYNC); //ADS1256轉(zhuǎn)換指令
ADS1256_SPI(ADS1256_CMD_WAKEUP); //ADS1256喚醒指令
ADS1256_SPI(ADS1256_CMD_RDATA); //ADS1256轉(zhuǎn)換指令
for(i=0;i<3;i++) //接收數(shù)據(jù)24位
{
sum = sum << 8;
r = ADS1256_SPI(0x00); //接收數(shù)據(jù)
sum |= r;
}
return sum; //返回數(shù)據(jù)
}
/************************************************************/
/********************ADS1256初始化******************************/
void ADS1256_Init(void)
{
// ADS1256_CS_L;
ADS1256_REST_L; //ADS1256復(fù)位
delay_ms(2);
ADS1256_REST_H;
ADS1256_WREG(ADS1256_STATUS,0x04); // 高位在前、校準(zhǔn)、不使用緩沖
ADS1256_WREG(ADS1256_MUX,0x08); // 初始化端口A0為‘+’,AINCOM位‘-’
ADS1256_WREG(ADS1256_ADCON,0x00); // 放大倍數(shù)1
ADS1256_WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS); // 數(shù)據(jù)5sps
ADS1256_WREG(ADS1256_IO,0x00); // IO狀態(tài)輸入
}
/************************************************************/
/********************ADS轉(zhuǎn)換結(jié)果*****************************/
void ADS_sum(unsigned char road)
{
unsigned long results=0;
unsigned long Result_sum=0;
unsigned long fVoltage;
unsigned char i,rod;
ADS1256_WREG(ADS1256_MUX,road); //設(shè)置通道
ADS1256_SPI(ADS1256_CMD_SELFCAL); //偏移和增益自動校準(zhǔn)
results = ADS1256_ReadData(); //讀取AD值,返回24位數(shù)據(jù)。
Result_sum = results >> 4;
if(Result_sum<0x80000) //測得電壓值為正的情況
{
fVoltage=Result_sum*954; //954=2*2.5/2^19*100000000 2.5為基準(zhǔn)電壓 100000000為為了計算的準(zhǔn)確性轉(zhuǎn)換為整形計算
ADS1256_buf[0]=(unsigned char)(fVoltage/100000000);
ADS1256_buf[0]=ADS1256_buf[0]+0x30;
ADS1256_buf[1]='.';
ADS1256_buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
ADS1256_buf[2]=ADS1256_buf[2]+0x30;
ADS1256_buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
ADS1256_buf[3]=ADS1256_buf[3]+0x30;
ADS1256_buf[4]=(unsigned char)(fVoltage%1000000/100000);
ADS1256_buf[4]=ADS1256_buf[4]+0x30;
ADS1256_buf[5]=(unsigned char)(fVoltage%100000/10000);
ADS1256_buf[5]=ADS1256_buf[5]+0x30;
ADS1256_buf[6]=(unsigned char)(fVoltage%10000/1000);
ADS1256_buf[6]=ADS1256_buf[6]+0x30;
ADS1256_buf[7]=(unsigned char)(fVoltage%1000/100);
ADS1256_buf[7]=ADS1256_buf[7]+0x30;
ADS1256_buf[8]='V'; //V
ADS1256_buf[9]=0x20;
}
else //測得電壓值為負的情況
{
Result_sum=0xfffff-Result_sum; //取反運算
fVoltage=Result_sum*954; //954=2*2.5/2^19*100000000 2.5為基準(zhǔn)電壓 100000000為為了計算的準(zhǔn)確性轉(zhuǎn)換為整形計算
ADS1256_buf[0]=(unsigned char)(fVoltage/100000000);
ADS1256_buf[0]=ADS1256_buf[0]+0x30;
ADS1256_buf[1]='.';
ADS1256_buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
ADS1256_buf[2]=ADS1256_buf[2]+0x30;
ADS1256_buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
ADS1256_buf[3]=ADS1256_buf[3]+0x30;
ADS1256_buf[4]=(unsigned char)(fVoltage%1000000/100000);
ADS1256_buf[4]=ADS1256_buf[4]+0x30;
ADS1256_buf[5]=(unsigned char)(fVoltage%100000/10000);
ADS1256_buf[5]=ADS1256_buf[5]+0x30;
ADS1256_buf[6]=(unsigned char)(fVoltage%10000/1000);
ADS1256_buf[6]=ADS1256_buf[6]+0x30;
ADS1256_buf[7]=(unsigned char)(fVoltage%1000/100);
ADS1256_buf[7]=ADS1256_buf[7]+0x30;
ADS1256_buf[8]='V'; //V
ADS1256_buf[9]='-';
}
if(road/16 == 0) //本次讀取的數(shù)據(jù)是上一次轉(zhuǎn)換的值
rod = (7 + 0x30); //進行通道-1計算
else
rod = ((road/16 + 0x30) -1);
PutString("第");
PutChar(rod);
PutString("路:");
i=0;
while(i<12)
{
PutChar(ADS1256_buf[i]);
i++;
}
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = '\n';
Delays( );
}
/**********************ADS1256_IO初始化****************************/
void ADS1256_IO_init()
{
P2SEL &=~ 0XFF;
P2DIR |= BIT0 + BIT3 + BIT4;
P2DIR &=~ (BIT2 + BIT5);
}
/************************************************************/
/*******************************************
函數(shù)名稱:PutSting
功 能:向PC機發(fā)送字符串
參 數(shù):ptr--指向發(fā)送字符串的指針
返回值 :無
********************************************/
void PutString(uchar *ptr)
{
while(*ptr != '\0')
{
while (!(UCA0IFG&UCTXIFG)); // TX緩存空閑?
UCA0TXBUF = *ptr++; // 發(fā)送數(shù)據(jù)
}
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = '\n';
}
/*******************************************
函數(shù)名稱:PutChar
功 能:向PC機發(fā)送一個字符對應(yīng)的ASCII碼
參 數(shù):zifu--發(fā)送的字符
返回值 :無
********************************************/
void PutChar(uchar zifu)
{
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = zifu;
}
/*******************************************
函數(shù)名稱:Delays
功 能:延時一會
參 數(shù):無
返回值 :無
********************************************/
void Delays(void)
{
uchar i=20;
uint j;
while(i--)
{
j=2000;
while(j--);
}
}
復(fù)制代碼
作者:
樂茹呀
時間:
2019-5-21 20:54
樓主頭文件ADS1256.h的內(nèi)容是什么啊。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1