- #include "ads1256.h"
#include "delay.h"
#include "usart.h"
/**********************************************************************/
/****************************************
延时uS
*****************************************/
void ads1256_delayus(u16 time)
{
u16 i=0;
while(time--)
{
i=3;
while(i--);
}
}
/****************************************
功能:延时Ms
*****************************************/
void ads1256_delayms(u16 time)
{
u16 i;
while(time--)
{
i=4000;
while(i--);
}
}
/****************************************
功能:寄存器设置初始化,如果初始化成功返回0,失败返回1
*****************************************/
u8 ADS1256_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOB时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE(); //使能GPIOB时钟
//PA15 CS,PA5 SCK
GPIO_Initure.Pin=GPIO_PIN_15|GPIO_PIN_5;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化
//PB5 MOSI
GPIO_Initure.Pin=GPIO_PIN_5;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
//PB4 MISO
GPIO_Initure.Pin=GPIO_PIN_4;
GPIO_Initure.Mode=GPIO_MODE_INPUT; //推挽输出
GPIO_Initure.Pull=GPIO_NOPULL; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
//PE1 RESET
GPIO_Initure.Pin=GPIO_PIN_1;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOE,&GPIO_Initure); //初始化
//PE0 DRDY
GPIO_Initure.Pin=GPIO_PIN_0;
GPIO_Initure.Mode=GPIO_MODE_INPUT; //推挽输出 GPIO_MODE_INPUT
GPIO_Initure.Pull=GPIO_NOPULL; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOE,&GPIO_Initure); //初始化
u8 ReturnData = 0;
u8 ADS1256_reg_Init[4]={
0x04, //状态寄存器初始化值
0x01, //模拟多路选择器初始化值
0x00, //AD控制寄存器初始化值
0x03, //数据速度寄存器初始化值
// 0x00, //I/O控制寄存器初始化值
};
ADS1256_CS=1;
ADS1256_SCK=0;
ADS1256_RESET=0;
ads1256_delayms(1);
ADS1256_RESET=1;
ads1256_delayms(1);
ADS1256_CS=0;
ads1256_delayms(1);
while(ADS1256_Read_DRDY) ; //当ADS1256_DRDY为低时才能写寄存器
ADS1256_SYNC(); //同步命令
ADS1256_WAKEUP(); //同步唤醒
while(ADS1256_Read_DRDY);
ADS1256_write_reg(0x00,ADS1256_reg_Init[0]);//状态寄存器初始化 自我校准不使能
ads1256_delayus(1);
ADS1256_write_reg(0x01,ADS1256_reg_Init[1]);//模拟多路选择器初始化 P是0,N是2.
ads1256_delayus(1);
ADS1256_write_reg(0x02,ADS1256_reg_Init[2]);//AD控制寄存器初始化 增益是1
ads1256_delayus(1);
ADS1256_write_reg(0x03,ADS1256_reg_Init[3]);//数据速度寄存器初始化 速度2.5 SPS
ads1256_delayus(1);
//ADS1256_write_reg(0x04,ADS1256_reg_Init[4]);//I/O控制寄存器初始化 设置为输出
// ads1256_delayus(1);
if(ADS1256_reg_Init[0] != ADS1256_read_reg(0x00))
{
printf("第一个寄存器的内容为 %xrn",ADS1256_reg_Init[0]);
printf("实际读出的内容为 %xrn",ADS1256_read_reg(0x00));
printf("状态寄存器器初始化失败!rn");
ReturnData = 1;
}
if(ADS1256_reg_Init[1] != ADS1256_read_reg(0x01))
{
printf("第二个寄存器的内容为 %xrn",ADS1256_reg_Init[1]);
printf("实际读出的内容为 %xrn",ADS1256_read_reg(0x01));
printf("模拟多路寄存器器初始化失败! rn");
ReturnData = 1;
}
delay_us(1);
if(ADS1256_reg_Init[2] != ADS1256_read_reg(0x02))
{
printf("第三个寄存器的内容为 %xrn",ADS1256_reg_Init[2]);
printf("实际读出的内容为 %xrn",ADS1256_read_reg(0x02));
printf("AD控制寄存器初始化失败! rn");
ReturnData = 1;
}
delay_us(1);
if(ADS1256_reg_Init[3] != ADS1256_read_reg(0x03))
{
printf("第四个寄存器的内容为 %xrn",ADS1256_reg_Init[3]);
printf("实际读出的内容为 %xrn",ADS1256_read_reg(0x03));
printf("数据速度寄存器初始化失败!rn");
ReturnData = 1;
}
delay_us(1);
while(ADS1256_Read_DRDY)
printf("寄存器初始化完成后没有转换低电平!rn");
ADS1256_SELFCAL(); //补偿和增益自校准
ads1256_delayus(5);
ADS1256_SYNC(); //AD转换同步
ads1256_delayms(20);
ADS1256_WAKEUP(); //退出待机模式
ads1256_delayus(5);
return(ReturnData);
}
void ADS1256_write_bit(u8 temp)
{
u8 i;
ADS1256_SCK=1;
ads1256_delayus(1);
for(i=0;i<8;i++)
{
if(temp&(0x80>>i))
ADS1256_MOSI=1;
else
ADS1256_MOSI=0;
ads1256_delayus(1);
ADS1256_SCK=0;
ads1256_delayus(1);
ADS1256_SCK=1;
}
ads1256_delayus(1);
}
/****************************************
功能:读一字节数据
ADS1256_Read_MISO PBin(4)
ADS1256_Read_DRDY PEin(0)
ADS1256_CS PAout(15)
ADS1256_RESET PEout(1)
ADS1256_DRDY PAout(15)
ADS1256_MISO PBout(4)
ADS1256_MOSI PBout(5)
ADS1256_SCK PAout(5)
*****************************************/
u8 ADS1256_read_bit(void)
{
u8 i;
u8 date;
//ADS1256_SCK=0;
for(i=0;i<8;i++)
{
ADS1256_SCK=1;
date=date<<1;
ads1256_delayus(1);
ADS1256_SCK=0;
date= date | ADS1256_Read_MISO;
ads1256_delayus(1);
}
return date;
}
/****************************************
功能:读DRDY引脚状态
*****************************************/
u8 ADS1256_DRDY(void)
{
return ADS1256_Read_DRDY;
}
/****************************************
功能:读单次数据命令
*****************************************/
void ADS1256_RDATA(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_RDATA_DRDY没有转换低电平!rn");
ADS1256_write_bit(0x01);
}
/****************************************
功能:连续读数据命令
*****************************************/
void ADS1256_RDATAC(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_RDATAC_DRDY没有转换低电平!rn");
ADS1256_write_bit(0x03);
}
/****************************************
功能:停止连续读数据命令
*****************************************/
void ADS1256_SDATAC(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SDATAC_DRDY没有转换低电平!rn");
ADS1256_write_bit(0x0F);
}
/****************************************
功能:补偿和增益自我校准命令
*****************************************/
void ADS1256_SELFCAL(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SELFCAL_DRDY没有转换低电平!rn");
ADS1256_write_bit(0xF0);
}
/****************************************
功能:补偿自我校准
*****************************************/
void ADS1256_SELFOCAL(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SELFOCAL_DRDY没有转换低电平!rn");
ADS1256_write_bit(0xF1);
}
/****************************************
功能:增益自我校准
*****************************************/
void ADS1256_SELFGCAL(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SELFGCAL_DRDY没有转换低电平!rn");
ADS1256_write_bit(0xF2);
}
/****************************************
功能:系统补偿校准
*****************************************/
void ADS1256_SYSOCAL(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SYSOCAL_DRDY没有转换低电平!rn");
ADS1256_write_bit(0xF3);
}
/****************************************
功能:系统增益校准
*****************************************/
void ADS1256_SYSGCAL(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SYSGCAL_DRDY没有转换低电平!rn");
ADS1256_write_bit(0xF4);
}
/****************************************
功能:AD转换同步
*****************************************/
void ADS1256_SYNC(void)
{
while(ADS1256_Read_DRDY)
printf("ADS1256_SYNC_DRDY没有转换低电平!rn");
ADS1256_write_bit(0xFC);
}
/****************************************
功能:启动待机模式
*****************************************/
void ADS1256_ATANDBY(void)
{
ADS1256_write_bit(0xFD);
}
/****************************************
功能:系统复位
*****************************************/
void ADS1255_RESET(void)
{
ADS1256_write_bit(0xFE);
}
/****************************************
功能:退出待机模式
*****************************************/
void ADS1256_WAKEUP(void)
{
ADS1256_write_bit(0xFF);
}
/****************************************
功能:ADS1255写寄存器
说明:根据要求写入寄存器和命令字
@para1* command 对应的是寄存器地址,@para2* 对应写入寄存器的值
*****************************************/
void ADS1256_write_reg(u8 ADS1256_command,u8 ADS1256_data)
{
while(ADS1256_Read_DRDY)
{
printf("ADS1256写寄存器DRDY未能转换低电平rn");
}
ADS1256_write_bit(ADS1256_command | 0x50); //需要写某个寄存器的命令
ADS1256_write_bit(0x00); //第二个命令,表示写入寄存器的数量为 n-1 即为1.
ADS1256_write_bit(ADS1256_data); //写入的值
ads1256_delayus(10);
}
/****************************************
功能:ADS1255读寄存器
说明:根据要求写入寄存器地址
@para1* 对应的是寄存器地址
*****************************************/
u8 ADS1256_read_reg(u8 ADS1256_command)
{
u8 reg_date;
while(ADS1256_Read_DRDY)
{
printf("读寄存器DRDY未能转换低电平rn");
}
ADS1256_write_bit(ADS1256_command | 0x10); //需要读某个寄存器的命令
ADS1256_write_bit(0x00); //第二个命令,表示读入寄存器的数量为 n-1 即为1.
ads1256_delayus(50);
reg_date=ADS1256_read_bit(); //读操作
if(reg_date==0)
printf("读取数据失败rn");
return reg_date;
}
/****************************************
//功能:读一次转化完成的数据
*****************************************/
u32 ADS1256_Read_a_Data(void)
{
u32 Data,Data1,Data2,Data3;
Data1 = ADS1256_read_bit();
Data2 = ADS1256_read_bit();
Data3 = ADS1256_read_bit();
Data = (Data1<<16) | (Data2<<8) | Data3;
return (Data);
}
/****************************************
//功能:把读数转化成电压值,输入分别为 : 读回的二进制值 参考电压 内置增益
*****************************************/
double ADS1256_DataFormatting(u32 Data , double Vref ,u8 PGA)
{
/*
电压计算公式;
设:AD采样的电压为Vin ,AD采样二进制值为X,参考电压为 Vr ,内部集成运放增益为G
Vin = ( (2*Vr) / G ) * ( x / (2^23 -1))
*/
double ReadVoltage;
if(Data & 0x00800000)
{
Data = (~Data) & 0x00FFFFFF;
ReadVoltage = -(((double)Data) / 8388607) * ((2*Vref) / ((double)PGA));
}
else
ReadVoltage = (((double)Data) / 8388607) * ((2*Vref) / ((double)PGA));
return(ReadVoltage);
}
0
|
1个回答
|
|
|