
























//***************************
// Pin assign
// STM32f407 ADS1256
// GPIOA_Pin_3 <--- DRDY
// GPIOA_Pin_1 ---> CS
// GPIOA_Pin_5 ---> SCK
// GPIOA_Pin_6(MISO) <--- DOUT
// GPIOA_Pin_7(MOSI) ---> DIN
//*************************** #include "ads1256.h"
#define ADS1256_GPIO GPIOA
#define ADS1256_DRDY GPIO_PIN_3
#define ADS1256_CS GPIO_PIN_1
extern SPI_HandleTypeDef hspi1;
//-----------------------------------------------------------------//
// 功 能: SPI通信
// 入口参数: / 发送的SPI数据
// 出口参数: / 接收的SPI数据
// 全局变量: /
// 备 注: 发送接收函数
//-----------------------------------------------------------------//
unsigned char SPI_WriteByte(unsigned char TxData)
{
unsigned char RxData=0;
HAL_SPI_TransmitReceive(&hspi1, &TxData, &RxData, 1, 10);
return RxData;
}
//-----------------------------------------------------------------//
// 功 能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte) //ADS1256WREG(ADS1256_MUX,channel); //设置通道
{
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// CS_0();
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1) {}
//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
//写入数据的个数n-1
SPI_WriteByte(0x00);
//向regaddr地址指向的寄存器写入数据databyte
SPI_WriteByte(databyte);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
}
//初始化ADS1256
float ADS1256_GAIN = 1.0f;
void ADS1256_Init(uint8_t gain) {
//*************自校准****************
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// SPI_WriteByte(ADS1256_CMD_SELFCAL);
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************
// ADS1256WREG(ADS1256_STATUS,0x06); // 高位在前、使用缓冲
ADS1256WREG(ADS1256_STATUS,0x04); // 高位在前、不使用缓冲
ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
if(gain == ADS1256_GAIN_1) ADS1256_GAIN = 1.0f; // 放大倍数1 ±5V
if(gain == ADS1256_GAIN_2) ADS1256_GAIN = 2.0f; // 放大倍数2 ±2.5V
if(gain == ADS1256_GAIN_4) ADS1256_GAIN = 4.0f; // 放大倍数4 ±1.25V
if(gain == ADS1256_GAIN_8) ADS1256_GAIN = 8.0f; // 放大倍数8 ±0.625V
if(gain == ADS1256_GAIN_16) ADS1256_GAIN = 16.0f; // 放大倍数16 ±0.3125V
if(gain == ADS1256_GAIN_32) ADS1256_GAIN = 32.0f; // 放大倍数32 ±0.15625V
if(gain == ADS1256_GAIN_64) ADS1256_GAIN = 64.0f; // 放大倍数64 ±0.078125V
ADS1256WREG(ADS1256_ADCON, gain); // 放大倍数8 ±0.625V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1); // 放大倍数1 ±5V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_4); // 放大倍数4 ±1.25V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_8); // 放大倍数8 ±0.625V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_16); // 放大倍数8 ±0.3125V
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_1000SPS); // 数据10sps
ADS1256WREG(ADS1256_IO,0x00);
//*************自校准****************
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SELFCAL);
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************
}
// 微秒级延迟(纯循环)
void delay_us(uint32_t us) {
us *= 40; // 校准值(需根据实际测试调整)
while (us--) {
__asm__ volatile ("nop"); // 插入空指令确保循环不被优化
}
}
// 毫秒级延迟(基于delay_us)
void delay_ms(uint32_t ms) {
while (ms--) {
delay_us(1000);
}
}
//读取AD值
unsigned char pre_channel = 0;
int ADS1256ReadData(unsigned char channel) {
unsigned int sum=0;
while(HAL_GPIO_ReadPin(ADS1256_GPIO,ADS1256_DRDY)==1);//当ADS1256_DRDY为低时才能写寄存器
if (pre_channel != channel) {
pre_channel = channel;
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
ADS1256WREG(ADS1256_MUX,channel); //设置通道
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
while (HAL_GPIO_ReadPin(ADS1256_GPIO, ADS1256_DRDY) == 1);
}
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_RDATA);
// HAL_Delay(1);
delay_us(10);
sum |= (SPI_WriteByte(0xff) << 16);
sum |= (SPI_WriteByte(0xff) << 8);
sum |= SPI_WriteByte(0xff);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
if (sum>0x7FFFFF) // if MSB=1,
{
sum -= 0x1000000; // do 2's complement
}
return sum;
}
double ADS1256ReadVoltage(unsigned char channel) {
double voltage = ADS1256ReadData(channel)*(double)0.000000598;
voltage /= ADS1256_GAIN;
return voltage;
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。