一:
最近實(shí)驗(yàn)室有幾個項(xiàng)目都需要用到高分辨率AD轉(zhuǎn)換,于是就開始了ADS1256的開發(fā)。
新手,焊得丑,見諒(能用就行)
二:
本以為很容易就能做完,結(jié)果被采樣速率的問題困擾了很久。
代碼如下,使用2.5V基準(zhǔn)源進(jìn)行測試,結(jié)果在讀ADS時經(jīng)常出現(xiàn)讀出0xFFFFFF的情況,只能忍住悲傷開始查找資料,后來在TI論壇上看到一位大哥說這種情況一般是SPI沒有讀取到數(shù)據(jù)于是直接將ADS初始化中的10SPS改成30000SPS,結(jié)果一測試OK了。
void ADS1256_Init(void)
{
ADS1256WREG(ADS1256_STATUS,0x04);
ADS1256WREG(ADS1256_MUX,0x01);
ADS1256WREG(ADS1256_ADCON,0x00);
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);
ADS1256WREG(ADS1256_IO,0x00);
}
三:
可能因?yàn)锳DS1256是外部ADC,數(shù)據(jù)轉(zhuǎn)換速率慢于單片機(jī)時就會造成SPI上沒有數(shù)據(jù)導(dǎo)致單片機(jī)讀取不到吧,模數(shù)轉(zhuǎn)換很多東西的確比較復(fù)雜,以前只注重簡單的應(yīng)用,還是需要以后繼續(xù)學(xué)習(xí),也請各位大哥多多指正。
最后附上代碼:
ADS1256.c
#include "ADS1256.h"
#define FILTER_NUM 10
unsigned int ads_value;
unsigned int ads_flitter[FILTER_NUM+1];
long double ads_voltage;
void SPI1_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/****Initial SPI1******************/
/* Enable SPI1 and GPIOA clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//SPI1 NSS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
/* SPI1 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
void Init_ADS1256_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI1_Init();
}
unsigned char SPI_WriteByte(unsigned char TxData)
{
unsigned char RxData=0;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,TxData);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
RxData=SPI_I2S_ReceiveData(SPI1);
return RxData;
}
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
SPI_WriteByte(0x00);
SPI_WriteByte(databyte);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
void ADS1256_Init(void)
{
ADS1256WREG(ADS1256_STATUS,0x04);
ADS1256WREG(ADS1256_MUX,0x01);
ADS1256WREG(ADS1256_ADCON,0x00);
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_30000SPS);
ADS1256WREG(ADS1256_IO,0x00);
}
unsigned int ADS1256ReadData(unsigned char channel)
{
unsigned int data;
ADS1256WREG(ADS1256_MUX, channel | ADS1256_MUXN_AIN1);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
SPI_WriteByte(ADS1256_CMD_RDATA);
data |= (SPI_WriteByte(0xff)<<16);
data |= (SPI_WriteByte(0xff)<<8);
data |= SPI_WriteByte(0xff);
return data;
}
unsigned int ADS_Flitter()
{
unsigned char i=0;
ads_flitter[FILTER_NUM+1] = 0;
for(i=0;i<FILTER_NUM;i++)
{
ads_flitter[i] = ADS1256ReadData(0);
ads_flitter[FILTER_NUM+1] += ads_flitter[i];
}
ads_flitter[FILTER_NUM+1] = ads_flitter[FILTER_NUM+1]/FILTER_NUM;
ads_value = ads_flitter[FILTER_NUM+1];
return ads_value;
}
long double ADS_Voltage()
{
ads_voltage = (long double)ADS_Flitter()*5/0x7FFFFF;
return ads_voltage;
}
ADS1256.h文章來源:http://www.zghlxwxcb.cn/news/detail-525544.html
#ifndef __ADS1256_H_
#define __ADS1256_H_
#include "stm32f10x.h"
#define RCC_ADS1256DRDY RCC_APB2Periph_GPIOA
#define GPIO_ADS1256DRDY_PORT GPIOA
#define GPIO_ADS1256DRDY GPIO_Pin_0
// define commands
#define ADS1256_CMD_WAKEUP 0x00
#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
#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
void SPI1_Init(void);
void Init_ADS1256_GPIO(void);
unsigned char SPI_WriteByte(unsigned char TxData);
void ADS1256WREG(unsigned char regaddr,unsigned char databyte);
void ADS1256_Init(void);
unsigned int ADS1256ReadData(unsigned char channel);
unsigned int ADS_Flitter(void);
long double ADS_Voltage(void);
#endif
main.h文章來源地址http://www.zghlxwxcb.cn/news/detail-525544.html
/**
******************************************************************************
* @file Project/STM32F10x_StdPeriph_Template/main.c
* @author MCD Application Team
* @version V3.5.0
* @date 08-April-2011
* @brief Main program body
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "ADS1256.h"
#include <stdio.h>
extern unsigned int ads_value;
extern long double ads_voltage;
int main(void)
{
Init_ADS1256_GPIO();
ADS1256_Init();
while (1)
{
ADS_Voltage();
}
}
到了這里,關(guān)于STM32F103硬件SPI驅(qū)動ADS1256的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!