/************************接线说明**********************
MSP430F5438A ADS1256模块
P1.0 DRDY DR
P3.1 SIMO DIN
P3.2 SOMI DOU
P3.3 SCLK SC
P6.5 REST RST
GND CS
*******************************************************/
#include "msp430x54x.h"
#include "ADS1256.h"
#include "Init_SYS.h"
/*******************ADS1256的模拟SPI设置********************/
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接收的数据左移
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) //判断接受的数据
r = r | 0x01;
else
r = r & 0xfe;
}
delay_us(100); //延时 t11
return r;
}
/************************************************************/
/*************************
程序功能:ADS1256写寄存器
参数:regaddr:寄存器地址
dat: 写入的值
返回值:无
**************************/
void ADS1256_WREG(unsigned char regaddr,unsigned char dat)
{
while(ADS1256_DRDY); //当DRDY为低是才能写寄存器
ADS1256_SPI(ADS1256_CMD_WREG | (regaddr & 0xF)); //WREG指令+地址
ADS1256_SPI(0x00);
ADS1256_SPI(dat); //向ADS1256寄存器写数据
}
/************************************************************/
/*************************
程序功能:ADS1256读数据
参数:无
返回值:接收的24位数据
**************************/
unsigned long ADS1256_ReadData(void)
{
unsigned char i=0;
unsigned long sum=0;
unsigned long r=0;
while(ADS1256_DRDY); //当DRDY为低是才能写指令
ADS1256_SPI(ADS1256_CMD_SYNC); //ADS1256转换指令
ADS1256_SPI(ADS1256_CMD_WAKEUP); //ADS1256唤醒指令
ADS1256_SPI(ADS1256_CMD_RDATA); //ADS1256转换指令
for(i=0;i<3;i++) //接收数据24位
{
sum = sum << 8;
r = ADS1256_SPI(0x00); //接收数据
sum |= r;
}
return sum; //返回数据
}
/************************************************************/
/*************************
程序功能:ADS1256初始化
参数:无
返回值:无
**************************/
void ADS1256_Init(void)
{
ADS1256_IO_init();
ADS1256_REST_H; // 关复位
ADS1256_WREG(ADS1256_STATUS,0x04); // 高位在前、校准、不使用缓冲
ADS1256_WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
ADS1256_WREG(ADS1256_ADCON,0x00); // 放大倍数1
ADS1256_WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS); // 数据5sps
ADS1256_WREG(ADS1256_IO,0x00); // IO状态输入
}
/************************************************************/
/*************************
程序功能:计算ADS转换结果,并预备送液晶显示
参数:选择差分通道
返回值:无
**************************/
void ADS_sum(unsigned char road)
{
unsigned char ADS1256_buf[10];
unsigned long results=0;
unsigned long Result_sum=0;
unsigned long fVoltage;
ADS1256_WREG(ADS1256_MUX,road); //设置通道
ADS1256_SPI(ADS1256_CMD_SELFCAL); //偏移和增益自动校准
results = ADS1256_ReadData(); //读取AD值,返回24位数据。
Result_sum = results >> 4;
if(Result_sum<0x80000) //测得电压值为正的情况
{
fVoltage=Result_sum*982; //954=2*2.5/2^19*100000000 2.5为基准电压 100000000为为了计算的准确性转换为整形计算,修正值为982
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*982; //954=2*2.5/2^19*100000000 2.5为基准电压 100000000为为了计算的准确性转换为整形计算,修正值为982
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]='-';
}
for(int b=0;b<10;b++)
{
UCA0TXBUF = ADS1256_buf[b];
while((UCA0IFG & UCTXIFG));
for(int j=0; j<0xffff; j++);
}
}
/**********************ADS1256_IO初始化****************************/
/*************************
程序功能:ADS1256_IO初始化
参数:无
返回值:无
**************************/
void ADS1256_IO_init()
{
P3SEL &=~ 0XFF; //第一功能
P3DIR |= BIT1 + BIT3; //P3.1 SIMO,P3.3 SCLK
P3DIR &=~ BIT2; //P3.2 SOMI
P6DIR |= BIT5;
P1DIR &=~ BIT0; //P1.0输出,DRDY引脚
}
/************************************************************/
/**********************串口初始化****************************/
/*************************
程序功能:串口初始化
参数:无
返回值:无
**************************/
void Uart_Init()
{
P3SEL |= BIT5 + BIT4; //选择串口A0
UCA0CTL1 = UCSWRST; //复位串口功能 串口寄存器修改位
UCA0CTL0 = UCMODE_0; //选择串口功能
UCA0CTL0 &= ~UC7BIT; //8位数据模式
UCA0CTL1 |= UCSSEL_2; //时钟源选择SMCLK=25M
UCA0BR0 = 0x2c; //波特率9600
UCA0BR1 = 0x0a;
UCA0MCTL = 0; //波特率调整因子
UCA0CTL1 &= ~UCSWRST; //使能串口功能
UCA0IE |= UCRXIE; //使能接收中断
}
评论4