ADS1248.cpp.rar
(2.41 KB)
#include "device.h"
unsigned char D_ADS1248_REG_SYS0 = 0; // ADS1248的增益和速度
signed long results=0;
extern signed long main_results[20];
unsigned char AD_cnt=0;
unsigned char AD_reg[6];
//-----------------------------------------------------------------//
// 功 能:延时
// 入口参数: 延时时间 delaytime * us
// 出口参数: /
// 全局变量: /
// 备 注: 10:72us;50:271us;100:515us
//-----------------------------------------------------------------//
#pragma vector=PORT2_VECTOR
__interrupt void Ads1248(void)
{
unsigned char i=0;
WDTCTL = WDT_ARST_1000;
//关闭IO中断
P2IE =0;
P2IES=0;
//清中断标志位
P2IFG &=~ADSO ;
//发送单次读数据命令
ADS1248SPI(ADS1248_CMD_RDATA);
//读取ADC转换完成的数据
results=ADS1248ReadData(0xFFFFFF);
//发送空操作指令,强迫D_OUT变高
ADS1248SPI(ADS1248_CMD_NOP);
//简单数据处理
main_results[0]=results>>5;
//ADS1248内部寄存器校验,如果寄存器值发生改变则重写该寄存器
AD_cnt++;
if(AD_cnt>AD_CHECK-1)
{
AD_cnt=0;
i=ADS1248RREG(ADS1248_REG_MUX0);
if(i!=AD_reg[0])
{
ADS1248WREG(ADS1248_REG_MUX0,AD_reg[0]);
}
i=0;
i=ADS1248RREG(ADS1248_REG_MUX1);
if(i!=AD_reg[1])
{
ADS1248WREG(ADS1248_REG_MUX1,AD_reg[1]);
}
i=0;
i=ADS1248RREG(ADS1248_REG_VBIAS);
if(i!=AD_reg[2])
{
ADS1248WREG(ADS1248_REG_VBIAS,AD_reg[2]);
}
i=0;
i=ADS1248RREG(ADS1248_REG_IDAC1);
if(i!=AD_reg[3])
{
ADS1248WREG(ADS1248_REG_IDAC1,AD_reg[3]);
}
i=0;
i=ADS1248RREG(ADS1248_REG_IDAC0);
if(i!=AD_reg[4])
{
ADS1248WREG(ADS1248_REG_IDAC0,AD_reg[4]);
}
i=0;
i=ADS1248RREG(ADS1248_REG_SYS0);
if(i!=AD_reg[5])
{
ADS1248WREG(ADS1248_REG_SYS0,AD_reg[5]);
}
i=0;
}
//打开IO中断
P2IE |= ADSO;
//下降沿触发中断
P2IES|= ADSO;
//清中断标志位
P2IFG &=~ADSO ;
}
//-----------------------------------------------------------------//
// 功 能:ADS1248初始化子程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//-----------------------------------------------------------------//
void InitADS1248(void)
{
//发送复位命令
P4OUT&=~BIT4;
Delay(2*DELAY_10ms);
P4OUT|= BIT4 ;
Delay(DELAY_10ms);
//ADS1248SPI(ADS1248_CMD_RESET);
//初始化MUX0寄存器
AD_reg[0]=0x25;
ADS1248WREG(ADS1248_REG_MUX0,0x25); //00100101,Bit7-6:Burnout不使用,Bit5-3:正输入为AIN4,Bit2-0:负输入为AIN5
//初始化MUX1寄存器
AD_reg[1]=0x30;
ADS1248WREG(ADS1248_REG_MUX1,0x30); //00110000,Bit7:启用内部晶振,Bit6-5:内部基准一直打开,Bit4-3:输入基准为片上基准,Bit2-0:普通模式
//延时等待10ms,等待内部基准稳定
Delay(6*DELAY_10ms);
//初始化VBIAS
AD_reg[2]=0x00;
ADS1248WREG(ADS1248_REG_VBIAS,0); //00000000,Bit7-0:偏置电压选择关闭(默认)
//初始化IDAC1
AD_reg[3]=0xff;
ADS1248WREG(ADS1248_REG_IDAC1,0xFF);//11111111,Bit7-4:断开内部第一恒流源的连接,Bit3-0:断开内部第二恒流源的连接 0X8F打开第一内部恒流源
//初始化IDAC0
AD_reg[4]=0x08;
ADS1248WREG(ADS1248_REG_IDAC0,0x08); //00001000,Bit7-4:只读,Bit3:DRDY/DOUT功能复用Dout线 ,Bit2-0:关闭内部恒流源
//初始化SYS0
AD_reg[5]=0x00;
ADS1248WREG(ADS1248_REG_SYS0,0x00); //00000000,Bit7:必须设置为0,Bit6-41:选择1倍增益,Bit3-0:选择5SPS测量速度
}
//-----------------------------------------------------------------//
// 功 能:ADS1248 SPI接口程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: SPI速度最高2MHz,用于命令发送等操作
//-----------------------------------------------------------------//
unsigned char ADS1248SPI(unsigned char m)
{
//SPI速度最高2MHz,用于命令发送等操作
unsigned char i,r=0;
for(i=0;i<8;i++)
{
SET_ADSCK
r=r<<1;
if (m & 0x80) {SET_ADSI} else CLR_ADSI
Delay(10);
CLR_ADSCK
if (P2IN&ADSO) r++;
Delay(10);
m=m<<1;
}
return r;
}
//-----------------------------------------------------------------//
// 功 能:ADS1248 读取
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注:
// SPI速度最高2MHz,用于读取AD的24位结果.在使用START引脚控制ADS1248时,可使用此函数
// 输出为有符号数。已经把ADS1248的输出格式转变为有符号数,0输入对应码值0,正最大对应7FFFFF,负最大对应-7FFFFF
// WriteOut是在发送24个SCLK以读取数据的同时写出去的24位指令,比如写入MUX0寄存器以改变通道。注意此次读取的为设置改变前的结果
// 如果WriteOut是操作控制寄存器,则START线应该保持高
//-----------------------------------------------------------------//
signed long ADS1248ReadData(signed long WriteOut)
{
//SPI速度最高2MHz,用于读取AD的24位结果.在使用START引脚控制ADS1248时,可使用此函数
//输出为有符号数。已经把ADS1248的输出格式转变为有符号数,0输入对应码值0,正最大对应7FFFFF,负最大对应-7FFFFF
//WriteOut是在发送24个SCLK以读取数据的同时写出去的24位指令,比如写入MUX0寄存器以改变通道。注意此次读取的为设置改变前的结果
//如果WriteOut是操作控制寄存器,则START线应该保持高
unsigned char i=0;
signed long r=0;
for(i=0;i<24;i++)
{
SET_ADSCK
r=r<<1;
if (WriteOut & 0x800000) {SET_ADSI} else CLR_ADSI
Delay(10);
CLR_ADSCK
if (P2IN&ADSO) r++;
Delay(10);
WriteOut=WriteOut<<1;
}
return r;
}
//-----------------------------------------------------------------//
// 功 能:ADS1248 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1248中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1248WREG(unsigned char regaddr,unsigned char databyte)
{
//向寄存器写入数据地址
ADS1248SPI(ADS1248_CMD_WREG+(regaddr & 0xF));
//写入数据的个数n-1
ADS1248SPI(0);
//向regaddr地址指向的寄存器写入数据databyte
ADS1248SPI(databyte);
}
//-----------------------------------------------------------------//
// 功 能:ADS1248 读数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 从ADS1248中地址为regaddr的寄存器读出一个字节databyte
//-----------------------------------------------------------------//
unsigned char ADS1248RREG(unsigned char regaddr)
{
//从ADS1248中地址为regaddr的寄存器读出一个字节
unsigned char r=0;
//写入地址
ADS1248SPI(ADS1248_CMD_RREG+(regaddr & 0xF));
//写入读取数据的个数n-1
ADS1248SPI(0);
//读出regaddr地址指向的寄存器的数据
r=ADS1248SPI(ADS1248_CMD_NOP);
return r;//返回数据
}
//-----------------------------------------------------------------//
// 功 能:ADS1248 读数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 进行一次ADS1248测量,输出格式为直接二进制,有符号位
//-----------------------------------------------------------------//
/*signed long StartADS1248( void )
{
signed long r = 0;
do { }
while( P2IN & ADSO ); // 等待DRDY变低,指示AD转换结束
// r = ADS1248ReadData( (ADS1248_CMD_WREG | ADS1248_REG_SYS0)<<16+D_ADS1248_REG_SYS0 );
// 读取的为设置改变前的结果,写入增益与速度的新设置,START控制的单次采样不能执行此操作。因为START此时为低
// r = ADS1248ReadData( 0x400025 );
// 读取的为设置改变前的结果,START控制的单次采样不能执行此操作。因为START此时为低
r = ADS1248ReadData( 0xFFFFFF ); // 3个NOP指令
ADS1248WREG( ADS1248_REG_SYS0, D_ADS1248_REG_SYS0 ); // 试验:在每次读取后改变增益
// 如果不使用单独的DRDY线,在进行一次转换并读取测量值后,必须执行NOP或WREG等不影响输出寄存器的指令强制DOUT/DRDY变为高
if(r & 0x800000) r = -1*(0x1000000-r); // 转换输出格式为直接二进制,有符号位
return r;
}
*/
|