在使用ADS1256读取数据时,前面AD0~AD3读取的数据都正确。但是AD4~AD7不管有没有电压,其读取的数据大概是1953600。我使用的基准电压是2.5V的,其芯片的18及19接晶振是8M的。下面贴了代码,麻烦帮分析一下原因,谢谢!
调用的方法类似下面,前面0~3通道的调用都正常,4~7通道不管是只采集其中一个通道,还是几个都按下面的方法采集出来的数据就是不对。调用方法如下:
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);
#ifndef __ADS1247_h
#define __ADS1247_h
/*****************************头文件包含*****************************************/
#include "stm32f10x.h"
/********************************************************************************/
/******************ads1248寄存器地址*******************/
// define commands
#define ADS1256_CMD_WAKEUP 0x00 //完成SYNC和退出待机模式
#define ADS1256_CMD_RDATA 0x01 //读数据
#define ADS1256_CMD_RDATAC 0x03 //连续读数据
#define ADS1256_CMD_SDATAC 0x0f //停止连续读数据
#define ADS1256_CMD_RREG 0x10 //从寄存器度数据
#define ADS1256_CMD_WREG 0x50 //向寄存器写数据
#define ADS1256_CMD_SELFCAL 0xf0 //偏移和增益自动校准
#define ADS1256_CMD_SELFOCAL 0xf1 //偏移自动校准
#define ADS1256_CMD_SELFGCAL 0xf2 //增益自动校准
#define ADS1256_CMD_SYSOCAL 0xf3 //系统失调校准
#define ADS1256_CMD_SYSGCAL 0xf4 //系统增益校准
#define ADS1256_CMD_SYNC 0xfc //同步AD转换
#define ADS1256_CMD_STANDBY 0xfd //待机模式开始
#define ADS1256_CMD_REST 0xfe //复位
// define the ADS1256 register values
#define ADS1256_STATUS 0x00
#define ADS1256_MUX 0x01
#define ADS1256_ADCON 0x02
#define ADS1256_DRATE 0x03
#define ADS1256_IO 0x04
#define ADS1256_OFC0 0x05
#define ADS1256_OFC1 0x06
#define ADS1256_OFC2 0x07
#define ADS1256_FSC0 0x08
#define ADS1256_FSC1 0x09
#define ADS1256_FSC2 0x0A
// define multiplexer codes
#define ADS1256_MUXP_AIN0 0x00
#define ADS1256_MUXP_AIN1 0x10
#define ADS1256_MUXP_AIN2 0x20
#define ADS1256_MUXP_AIN3 0x30
#define ADS1256_MUXP_AIN4 0x40
#define ADS1256_MUXP_AIN5 0x50
#define ADS1256_MUXP_AIN6 0x60
#define ADS1256_MUXP_AIN7 0x70
#define ADS1256_MUXP_AINCOM 0x80
#define ADS1256_MUXN_AIN0 0x00
#define ADS1256_MUXN_AIN1 0x01
#define ADS1256_MUXN_AIN2 0x02
#define ADS1256_MUXN_AIN3 0x03
#define ADS1256_MUXN_AIN4 0x04
#define ADS1256_MUXN_AIN5 0x05
#define ADS1256_MUXN_AIN6 0x06
#define ADS1256_MUXN_AIN7 0x07
#define ADS1256_MUXN_AINCOM 0x08
// define gain codes
#define ADS1256_GAIN_1 0x00
#define ADS1256_GAIN_2 0x01
#define ADS1256_GAIN_4 0x02
#define ADS1256_GAIN_8 0x03
#define ADS1256_GAIN_16 0x04
#define ADS1256_GAIN_32 0x05
#define ADS1256_GAIN_64 0x06
//#define ADS1256_GAIN_64 0x07
//define drate codes
#define ADS1256_DRATE_30000SPS 0xF0
#define ADS1256_DRATE_15000SPS 0xE0
#define ADS1256_DRATE_7500SPS 0xD0
#define ADS1256_DRATE_3750SPS 0xC0
#define ADS1256_DRATE_2000SPS 0xB0
#define ADS1256_DRATE_1000SPS 0xA1
#define ADS1256_DRATE_500SPS 0x92
#define ADS1256_DRATE_100SPS 0x82
#define ADS1256_DRATE_60SPS 0x72
#define ADS1256_DRATE_50SPS 0x63
#define ADS1256_DRATE_30SPS 0x53
#define ADS1256_DRATE_25SPS 0x43
#define ADS1256_DRATE_15SPS 0x33
#define ADS1256_DRATE_10SPS 0x23
#define ADS1256_DRATE_5SPS 0x13
#define ADS1256_DRATE_2_5SPS 0x03
/******************ads1256引脚设置*******************/
#define ADS_DRDY ((GPIOB->IDR)&(1<<0))
#define RESET_HIGH() 1
#define RESET_LOW() 0
#define ADS_CS GPIO_Pin_4
#define ADS_CS_LOW() GPIO_ResetBits(GPIOC, ADS_CS)
#define ADS_CS_HIGH() GPIO_SetBits(GPIOC, ADS_CS)
void SPI_ADS1256_Init(void);
void ADS1256_GPIO_init(void);
void ADS1256_Init(void);
//void ADS_sum(unsigned char road);
unsigned long ADS_sum(unsigned char road);
u8 SPI_SendByte(u8 byte);
unsigned long ADS1256ReadData(void);
void ADS1256WREG(unsigned char regaddr,unsigned char databyte);
#endif
下面是.C文件
#include "ads1256.h"
#include "delay.h"
/*******************************************************************************
* Function Name : SPI_FLASH_Init
* Description : Initializes the peripherals used by the SPI FLASH driver.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SPI_ADS1256_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable SPI1 and GPIO clocks */
/*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
/*!< SPI_FLASH_SPI Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/*!< AFIO Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推免输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*!< Configure SPI_FLASH_SPI pins: DOUT */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Deselect the FLASH: Chip Select high */
/* SPI1 configuration */
// 在SCLK下降沿,系统通过DIN向1256发送数据
// 在SCLK上升沿,系统通过DOUT 读取1256数据
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位模式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //SCLK空闲时位低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //SCLK的下降沿采集数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //从机选择信号,软件模式,就是用GPIO选择从机
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //APB2或者APB1总线频率的1/2~1/256分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
/*******************************************************************************
* Function Name : SPI_FLASH_SendByte
* Description : Sends a byte through the SPI interface and return the byte
* received from the SPI bus.
* Input : byte : byte to send.
* Output : None
* Return : The value of the received byte.
*******************************************************************************/
u8 SPI_SendByte(u8 byte)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPI1, byte);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI1);
}
/*******************************************************************
函数名:初始化DAC接口
函数原型:void ADC_gpio_init()
参数说明:无
返回: 无
********************************************************************/
void ADS1256_GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/////////CS reset 引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4;// | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //–推免输出模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz; //–GPIO翻转速度为50MHz
GPIO_Init(GPIOC , &GPIO_InitStructure); //–将配置写入对应的GPIO寄存器中
// GPIO_InitTypeDef GPIO_InitStructure;
///////// DRDY引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; //–浮点输入模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; //–GPIO翻转速度为50MHz
//GPIO_Init(GPIOA , &GPIO_InitStructure); //–将配置写入对应的GPIO寄存器中
GPIO_Init(GPIOB , &GPIO_InitStructure); //–将配置写入对应的GPIO寄存器中
}
//—————————————————————–//
// 功 能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//—————————————————————–//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
ADS_CS_LOW();
while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_SendByte(ADS1256_CMD_WREG | (regaddr & 0xF));
//写入数据的个数n-1
SPI_SendByte(0);
//向regaddr地址指向的寄存器写入数据databyte
delay_us(5);
SPI_SendByte(databyte);
ADS_CS_HIGH();
}
//—————————————————————–//
// 功 能:ADS1256 读寄存器数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 从ADS1256中地址为regaddr的寄存器读出一个字节databyte
//—————————————————————–//
unsigned char ADS1256RREG(unsigned char regaddr)
{
//从ADS1256中地址为regaddr的寄存器读出一个字节
unsigned char r=0;
ADS_CS_LOW();
while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
//写入地址
SPI_SendByte(ADS1256_CMD_RREG | (regaddr & 0xF));
//写入读取数据的个数n-1
SPI_SendByte(0);
delay_us(10); //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
//读出regaddr地址指向的寄存器的数据
r=SPI_SendByte(0);
ADS_CS_HIGH();
return r;//返回数据
}
//—————————————————————–//
// 功 能:ADS1256初始化子程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//—————————————————————–//
void ADS1256_Init(void)
{
ADS_CS_LOW();
delay_us(100);
SPI_SendByte(ADS1256_CMD_REST);
delay_ms(10);
while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
SPI_SendByte(ADS1256_CMD_SYNC); //同步命令
SPI_SendByte(ADS1256_CMD_WAKEUP); //同步唤醒
while(ADS_DRDY);
SPI_SendByte(ADS1256_CMD_WREG | ADS1256_STATUS);//连续写入5个寄存器
SPI_SendByte(4);
SPI_SendByte(0x04); //高位在前,使用内部校准,不使用缓存
SPI_SendByte(ADS1256_MUXN_AIN0|ADS1256_MUXN_AINCOM);//端口输入A2为正,A3位负
SPI_SendByte(ADS1256_GAIN_1); //放大倍数设置
SPI_SendByte(ADS1256_DRATE_10SPS); //采集速度设置
SPI_SendByte(0x00); //IO设置0
delay_us(100);
while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
SPI_SendByte(ADS1256_CMD_SELFCAL); //偏移和增益自动校准
ADS_CS_HIGH();
delay_ms(100);
}
//—————————————————————–//
// 功 能:
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注:
//—————————————————————–//
unsigned long ADS1256ReadData(void)
{
unsigned long sum=0;
ADS_CS_LOW();
while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
SPI_SendByte(ADS1256_CMD_SYNC);
SPI_SendByte(ADS1256_CMD_WAKEUP);
SPI_SendByte(ADS1256_CMD_RDATA);//ADS1256_CMD_RDATAC–连续读 ADS1256_CMD_SDATAC–停止连续读
delay_us(10); //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
sum |= (SPI_SendByte(0x0) << 16);
sum |= (SPI_SendByte(0x0) << 8);
sum |= SPI_SendByte(0x0);
ADS_CS_HIGH();
return sum;
}
//—————————————————————–//
// 功 能:读取ADS1256单路数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//—————————————————————–//
unsigned long ADS_sum(unsigned char road)
{
unsigned long Result_sum=0;
ADS1256WREG(ADS1256_MUX,road); //设置通道
Result_sum = ADS1256ReadData();//读取AD值,返回24位数据。
return Result_sum;
}
user151383853:
前面AD0~AD3读取的数据都正确。但是AD4~AD7不管有没有电压,其读取的数据大概是1953600。
应该是个配置问题.
user5347872:
回复 user151383853:
代码已经帖上了, 麻烦能不能帮我看下,具体是那个地方有问题。谢谢