主题中讨论的其他器件: ADS1256
你(们)好
我正在开发一个用于 ads1255的驱动程序、以便使用具有 pic18f46k80微控制器的 SPI 读取模拟数据
我从互联网上遵循了示例代码、但无法正常工作
此外、我还阅读了数据表、但仍然无法获得
因此需要使用 SPI 和 ADs1255连接到微控制器的示例代码
谢谢
R Sridhar
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Sridhar、您好!
下面是 e2e 中一些示例代码的链接。 这将是您的最佳起点: https://e2e.ti.com/support/data-converters/f/73/t/571671?ADS1256-Sample-code-for-ADS1256-
布莱恩
你(们)好
我已经检查了您的代码、它非常有用
我当前正在将波特率从 uC 写入到 ads1255模块、它接受并设置波特率
我还通过读取寄存器来检查波特率、它仅在连接 PICKIT-4时起作用、仅当我单击断开然后连接时起作用
那么、我认为初始化中存在一些问题
那么、您能否为 ads1255模块提供示例初始化
我的代码中
我将更新我的代码以供参考
void ads_1255_channel_function (void)
{
// SPI_WriteByte (ADS125X_CMD_RESET);DelayMicro (100);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_CMD_SDATAC);DelayMicro (100);
spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_MUX);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
spiTx[2]=(ADS125X_MUXP_AIN4|ADS125X_MUXN_AIN0);
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (1);
SPI_WriteByte (spiTx[2]);DelayMicro (10);
}
void ads_1255_channel_read_function (void)
{
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_CMD_SYNC);DelayMicro (10);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_CMD_WAKEUP);DelayMicro (40);
spiTx[0]= ADS125X_CMD_RDATA;//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (10);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[1]);DelayMicro (10);
DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
sprintf (ext_int_str、"%05x"、data_rate _u8);
LedDisplay (ext_int_str、0、0);Delay1sec (2);
}
谢谢
R Sridhar
你(们)好
现在、我的 ads1255模块正在使用 ads1255
读取 SPI 数据时出错
我的数据模式为8位、但我以24位模式读取、因此无法读取正确的 ADC 值
我正在更新我的代码以供参考、以帮助他人
//基准电压
#define ADS125X_VREF (2.5f)
#define ADS125X_OSC_FREQ (7680000)
/*
const 默认值={
ClkinFrequency:7680000、
spiFrequency:976563、
spiMode:1、
VREF:2.5、
};
*
// ADS1256寄存器
#define ADS125X_REG_STATUS 0x00
#define ADS125X_REG_MUX 0x01
#define ADS125X_REG_ADCON 0x02
#define ADS125X_REG_DRATE 0x03
#define ADS125X_REG_IO 0x04
#define ADS125X_REG_OFC0 0x05
#define ADS125X_REG_OFC1 0x06
#define ADS125X_REG_OFC2 0x07
#define ADS125X_REG_FSC0 0x08
#define ADS125X_REG_FSC1 0x09
#define ADS125X_REG_FSC2 0x0A
// ADS1256命令
//数据表第34页/表24
//所有命令都是独立的
//除了寄存器读取和写入(RREG、WREG)
//需要第二个命令字节加上数据
#define ADS125X_CMD_WAKEUP 0x00
#define ADS125X_CMD_RDATA 0x01
#define ADS125X_CMD_RDATAC 0x03
#define ADS125X_CMD_SDATAC 0x0F
#define ADS125X_CMD_RREG 0x10
#define ADS125X_CMD_WREG 0x50
#define ADS125X_CMD_SELFCAL 0xF0
#define ADS125X_CMD_SELFOCAL 0xF1
#define ADS125X_CMD_SELFGCAL 0xF2
#define ADS125X_CMD_SYSOCAL 0xF3
#define ADS125X_CMD_SYSGCAL 0xF4
#define ADS125X_CMD_SYNC 0xFC
#define ADS125X_CMD_STANDBY 0xFD
#define ADS125X_CMD_RESET 0xFE
#define ADS125X_BUFON 0x02
#define ADS125X_BUFOFF 0x00
#define ADS125X_CLKOUT_OFF 0x00
#define ADS125X_CLKOUT_1 0x20
#define ADS125X_CLKOUT_Half 0x40
#define ADS125X_CLKOUT_四分之一0x60
#define ADS125X_RDATA 0x01 /*读取数据*/
#define ADS125X_RDATAC 0x03 //连续读取数据*/
#define ADS125X_SDATAC 0x0F /*持续停止读取数据*/
#define ADS125X_RREG 0x10 //从 REG 读取*/
#define ADS125X_WREG 0x50 /*写入 REG */
#define ADS125X_SELFCAL 0xF0 //偏移和增益自校准*/
#define ADS125X_SELFOCAL 0xF1/*偏移自校准*/
#define ADS125X_SELFGCAL 0xF2 /*增益自校准*/
#define ADS125X_SYSOCAL 0xF3 /*系统偏移校准*/
#define ADS125X_SYSGCAL 0xF4 /*系统增益校准*
#define ADS125X_SYNC 0xFC //同步 A/D 转换*/
#define ADS125X_STANDBY 0xFD //开始待机模式*/
#define ADS125X_RESET 0xFE //重置为加电值*/
#define ADS125X_WAKEUP 0xFF //完成同步并退出待机模式*/
//多路复用器代码
#define ADS125X_MUXP_AIN0 0x00
#define ADS125X_MUXP_AIN1 0x10
#define ADS125X_MUXP_AIN2 0x20
#define ADS125X_MUXP_AIN3 0x30
#define ADS125X_MUXP_AIN4 0x40
#define ADS125X_MUXP_AIN5 0x50
#define ADS125X_MUXP_AIN6 0x60
#define ADS125X_MUXP_AIN7 0x70
#define ADS125X_MUXP_AINCOM 0x80
#define ADS125X_MUXN_AIN0 0x00
#define ADS125X_MUXN_AIN1 0x01
#define ADS125X_MUXN_AIN2 0x02
#define ADS125X_MUXN_AIN3 0x03
#define ADS125X_MUXN_AIN4 0x04
#define ADS125X_MUXN_AIN5 0x05
#define ADS125X_MUXN_AIN6 0x06
#define ADS125X_MUXN_AIN7 0x07
#define ADS125X_MUXN_AINCOM 0x08
//增益代码
#define ADS125X_PGA1 0x00
#define ADS125X_PGA2 0x01
#define ADS125X_PGA4 0x02
#define ADS125X_PGA8 0x03
#define ADS125X_PGA16 0x04
#define ADS125X_PGA32 0x05
#define ADS125X_PGA64 0x06
//数据速率代码
/**@注:数据速率因晶振频率而异。
*下面列出的数据速率假定晶振频率为7.68Mhz
*有关其他频率、请参阅数据表。
*
#define ADS125X_DRATE_30000SPS 0xF0
#define ADS125X_DRATE_15000SPS 0xE0
#define ADS125X_DRATE_7500SPS 0xD0
#define ADS125X_DRATE_3750SPS 0xC0
#define ADS125X_DRATE_2000SPS 0xB0
#define ADS125X_DRATE_1000SPS 0xA1
#define ADS125X_DRATE_500SPS 0x92
#define ADS125X_DRATE_100SPS 0x82
#define ADS125X_DRATE_60SPS 0x72
#define ADS125X_DRATE_50SPS 0x63
#define ADS125X_DRATE_30SPS 0x53
#define ADS125X_DRATE_25SPS 0x43
#define ADS125X_DRATE_15SPS 0x33
#define ADS125X_DRATE_10SPS 0x23
#define ADS125X_DRATE_5SPS 0x13
#define ADS125X_DRATE_2_5SPS 0x03
char dummy = 0;
/**
*@简短等待 DRDY 引脚变为低电平
*@param *指向 ADS 句柄的指针
*
uint8_t ADS125X_DRDY_WAIT (){
while (READ_ADC_DRDY_Func ());
// while (!read_adc_DRDY_Func ());
// while (read_adc_DRDY_Func ());
返回0;
}
//#include "Menu.h"//如果包含、则自动将其删除以避免错误
/*主应用程序*/
静态长整型 I = 0、j;
unsigned long ext_int_u32;
char ext_int_str[10]、val[10];
unsigned char abc=0xAA;
extern void SPI_WriteByte (uint8_t byte);
extern uint8_t SPI_ReadByte (void);
uint8_t spiTx[10]、spiRx[10]、data_rate_u8;
unsigned char a[3];
long total、avg_total;
int ADC_Array[10];
long adc_val_fil=0;
INT FRONT = 0;
Int Rear =-1;
int itemCount = 0、TempCnt;
extern long ADC_Moving_Avg;
extern long WeightADC;
extern long WeightADCFilterCnt;
外部长 Avg_ADC_buff [100];
外部长 Avg_ADC_cnt;
空 RemoveData()
{if (itemCount =(unsigned int) adc_Moving_Avg)
{itemCount--;}
其他
{}
}
长 MOV_AVG_DataInsert (长数据)
{int l=0;
long s采样_adc=0;
long final_adc_data=0;
//如果 ADC 缓冲器达到最大限制,此函数将递减
//缓冲区变量
RemoveData();
//将新的 ADC 数据插入缓冲区
if (itemCount!=(unsigned int) adc_Moving_Avg)
{if (rear =(unsigned int) adc_Moving_Avg)-1)
{rear =-1;}
ADC_Array[++refore]=数据;
itemCount++;
}
//读取缓冲区中的值
for (l=0;<itemCount;l++)
{SAMPLING_ADC = SAMPLING_ADC + ADC_Array[l];}
final_adc_data=采样_adc/itemCount;
返回 final_adc_data;
}
空 ClearAdcbuffer()
{ree=1;
itemCount=0;
memset (adc_Array、0、10);
}
长整型 AVERAGE_Filter_func (空)
{
长 Value1 =0;
for (TempCnt=0;TempCnt {Value1 += Avg_ADC_buff [TempCnt];}
Value1 /= ADC_Moving_Avg;
return (Value1);
}
空 ADC_Filter_func (长整型值)
{
WeightADC +=值;
WeightADCFilterCnt++;
//ADC_Moving_Avg=5;
if (WeightADCFilterCnt >= 10)// 1至9
{
Avg_ADC_buff [Avg_ADC_Cnt++]= WeightADC /(长) 10;
IF (Avg_ADC_cnt >= ADC_Moving_Avg)
Avg_ADC_Cnt = 0;
WeightADC = WeightADCFilterCnt = 0;
}
}
void ads_1255_status_function (void)
{
spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_STATUS);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
spiTx[2]= 0x06;//缓冲器被启用&自动校准被启用
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (1);
SPI_WriteByte (spiTx[2]);DelayMicro (10);
}
void ads_1255_status_read_function (void)
{
spiTx[0]=(ADS125X_CMD_RREG|ADS125X_REG_STATUS);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (10);
DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
sprintf (ext_int_str、"%05x"、data_rate _u8);
LedDisplay (ext_int_str、0、0);Delay1sec (2);
}
void ads_1255_adcon_function (void)
{
spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_ADCON);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
spiTx[2]= 0x47;//clkin/2、gain64
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (1);
SPI_WriteByte (spiTx[2]);DelayMicro (10);
}
void ads_1255_adcon_read_function (void)
{
spiTx[0]=(ADS125X_CMD_RREG|ADS125X_REG_ADCON);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (10);
DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
sprintf (ext_int_str、"%05x"、data_rate _u8);
LedDisplay (ext_int_str、0、0);Delay1sec (2);
}
void ads_1255_data_rate 函数(void)
{
spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_DRATE);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
spiTx[2]= 0xA1;//1000SPS//500->0x92
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (1);
SPI_WriteByte (spiTx[2]);DelayMicro (10);
}
void ads_1255_data_rate _read_function (void)
{
spirx[0]=(ADS125X_CMD_RREG|ADS125X_REG_DRATE);//第一个命令字节
spirx[1]= 0;//第二个命令字节=要读取的字节-1
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spirx[0]);DelayMicro (1);
SPI_WriteByte (spirx[1]);DelayMicro (10);
DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
sprintf (ext_int_str、"%05x"、data_rate _u8);
LedDisplay (ext_int_str、0、0);Delay1sec (2);
}
void ads_1255_channel_function (void)
{
ADS125X_DRDY_WAIT ();
spiTx[0]=(ADS125X_CMD_WREG|ADS125X_REG_MUX);//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
spiTx[2]= 0x01;
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (1);
SPI_WriteByte (spiTx[2]);DelayMicro (10);
}
void ads_1255_channel_read_function (void)
{
spiTx[0]=(ADS125X_CMD_RREG|ADS125X_REG_MUX);;//第一个命令字节
spiTx[1]= 0;//第二个命令字节=要读取的字节-1
ADS125X_DRDY_WAIT ();
SPI_WriteByte (spiTx[0]);DelayMicro (1);
SPI_WriteByte (spiTx[1]);DelayMicro (10);
DATA_RATE_u8=SPI_ReadByte ();DelayMicro (10);
sprintf (ext_int_str、"%05x"、data_rate _u8);
LedDisplay (ext_int_str、0、0);Delay1sec (2);
}
void ads_1255_self_cal_function (void)
{
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_SYSOCAL);DelayMicro (10);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_SYSGCAL);DelayMicro (10);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_SELFOCAL);DelayMicro (10);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_SELFGCAL);DelayMicro (10);
ADS125X_DRDY_WAIT ();
SPI_WriteByte (ADS125X_SELFCAL);DelayMicro (10);
}
void ads_1255_read_function (void)
{
ADS_1255_CHANNEL 函数();
ADS_1255_DATA_RATE_FUNC();
ADS_1255_DATA_RATE_READ_FUNC();
ads_1255_self_cal_function ();
ads_1255_adcon_function ();
}
无符号长整型 shift_8_bit_value_to_24_bit_value (字符 arr[])
{
unsigned long Adcdata=0;
unsigned char ADC_Byte=0;
对于(ADC_Byte=0;ADC_Byte<3;ADC_Byte++)
{
Adcdata =(Adcdata|arr[2-adc_Byte]);
Adcdata <<= 8;
}
返回 Adcdata;
}
void ads_1255_read_adc_function (void)
{
memset (spiRx、0、sizeof (spiRx));
ADS125X_DRDY_WAIT ();
// SPI_WriteByte (ADS125X_CMD_SYNC);DelayMicro (10);
// while (!read_adc_DRDY_Func ()) DelayMicro (1);
// SPI_WriteByte (ADS125X_CMD_WAKEUP);DelayMicro (40);
spirx[0]=(ADS125X_CMD_RDATA);//第一个命令字节
spirx[1]= 0;//第二个命令字节=要读取的字节-1
spirx[2]= 0;//第三个命令字节=要读取的字节-1
spirx[3]= 0;//第4个命令字节=要读取的字节-1
// spirx[4]= 0;//第4个命令字节=要读取的字节-1
总计=0;
SPI_WriteByte (spirx[0]);DelayMicro (8);
SPI_WriteByte (spirx[1]);DelayMicro (1);A[2]=SPI_ReadByte ();DelayMicro (1);
SPI_WriteByte (spirx[2]);DelayMicro (1);A[1]=SPI_ReadByte ();DelayMicro (1);
SPI_WriteByte (spirx[3]);DelayMicro (1);A[0]= SPI_ReadByte ();DelayMicro (1);
total=shift_8_bit_value_TO_24_bit_value (&a[0]);
// avg_total=MOV_AVG_DataInsert (total);
AdcVal=(total>>15);//获取原始 ADC 值完整范围的实际值为1000000
ADC_Moving_Avg=100;
// Setup.ADCFilter=2;
Wadccnt++;//ADC 滤波器函数
WeightAdc += AdcVal;
if (Wadccnt >= Setup.ADCFilter)//trial
{
Wadccnt = 0;
AdcVal = 0;
AdcVal = WeightAdc / Setup.ADCFilter;//prev
AdcBuff[AdcCounter++]= AdcVal;
if (AdcCounter >= 100)//prev
if (AdcCounter >= ADC_Moving_Avg)//试用
AdcCounter = 0;
WeightAdc = 0;
AdcIntr = 1;
}
}
空 INT1_ISR (空)
{
if (ext_int_u32>=100)
{ext_int_u32=0;
// EXT_INT1_InterruptDisable ();
}
其他
{ext_int_u32++;}
ADS_1255_READ_ADC_FUNC();
//***用户区域结束->代码***
EXT_INT1_InterruptFlagClear ();
//每次执行此 ISR 时调用回调函数
int1_callback ();
}
void SPI_Initialize (void)(空)
{
// SPI 设置
TRISCbits.TRISC3=0;//SCK
TRISCbits.TRISC4=1;//SDI
TRISCbits.TRISC5=0;//sdo
SSPSTAT = 0xC0;
SSPCON1 = 0x01;
SSPCON2 = 0x00;
SSPCON1bits.SSPEN = 1;
SSPADD=0x00;
// PIE1bits.SSPIE = 1;
SSPCON1bits.CKP = 0;
SPI_SetInterruptHandler (SPI_ISR);
}
谢谢
R Sridhar