Goodday、
我有问题、我将 ADS112C04用于一个项目、在该项目中、我必须在单端模式下测量四个模拟信号。 其中两个信号永远不会超过2.048V、另两个信号的最大电压约为4.5V。 由于两个4.5V 最大信号、我选择使用5V 外部基准。
(输入之间的切换由 PC 发出的命令进行处理、PC 会向其需要数据的通道的 uC 发出命令、ADC 会相应地进行切换。)
但在测试时、我注意到未使用5V 基准、我似乎无法在 ADC 中启用该基准。 我从 ADC 接收到的值全部以大约2.048V 的十进制值32767进行削波。 因此、Fs 似乎是2.048V、而不是预期的5V。
我添加了我在下面编写的代码、因此您可能可以帮助我找到其中的错误、因为我认为这应该是一个(小)编码错误。 我认为它很小、因为两个2.048V 最大模拟信号具有正确的功能(记住2.048V 使用的基准电压、而不是所需的5V 外部基准电压)。
除了这个问题,我还有另外一个问题:
当我使用 PC 上的命令从 ADC 请求值时、我必须发送两次命令才能从 ADC 获取"最新"值。
我使用了软件 DRDY 检查、在以下代码中、我使用 DRDY 引脚检查新转换数据何时就绪。 两种方法的结果相同。
我希望你能帮助我进一步解决这些问题。 如果缺少任何信息、只需通知我、我将尝试提供这些信息。
提前感谢您的回复!
头文件:
/* ADS112C04.h * *创建日期:2018年6月26日 * 作者:J. de Wit */ #ifndef ADS112C04_H_ #define ADS112C04_H_ #include "i2c.h" #include "stm32f0xx_hal_i2c.h" #define ADS112C04_I2CDefaultAddress 0x45 //0b1000101 #define Timeout100 #define I2110_i2c.h"#define ADS112C4_I20001/ define 命令重启转换(#define 100b0001_b0001) #defineCommand_PowerDown0b00000010//进入断电模式(0000001x )#define Command_RDATA0b00010000//通过命令读取数据(0001xxxx )#define Command_RReg0b00100000//在地址 rr 读取寄存器(0010rrxx )#define Command_WReg0b01000000//在地址处写入寄存器---------------------------------------------------------------------- //// ADC 寄存器00h 设置 //--------------------------------------------------- // #define Reg_0x000x00//指针寄存器0的十六进制值 #defineReg_0x00_PGA_BYPASS0b00000001// PGA 禁用并绕过 #defineReg_0x00_PGA_use0b00000000// PGA 启用(默认值) #defineReg_0x00_GAIN_10b00000000//增益= 1 (默认值) #define Reg 0b00_GAIN_4 = 0b00_GAING_4 #define REGIN_0b00_GAIN_GAING_0b00/#define 0004 0b00000110//增益= 8 #defineReg_0x00_GAIN_160b00001000//增益= 16 #defineReg_0x00_GAIN_320b00001010//增益= 32 #defineReg_0x00_GAIN_640b00001100//增益= 64 #defineReg_0x00_GAIN_1280b0000110/ INRG_00 = 0b000000/ INUX0b00 AINN = AIN1 (默认值) #defineReg_0x00_MUX_20b00010000// AINP = AIN0、AINN = AIN2 #defineReg_0x00_MUX_30b00100000// AINP = AIN0、AINN = AIN3 #001Reg_0x00_MUX_3 0bINP = AIN0 、AINUX010000_INP = AINUX1、AINUX1 = AINUX1 AINN = AIN2 #defineReg_0x00_MUX_60b01010000// AINP = AIN1,AINN = AIN3 #defineReg_0x00_MUX_70b01100000// AINP = AIN2,AINN = AIN3 #define Reg_0x00_MUX_7 0b01100000 // AINP = AINN = AIN10000= AIN2,AINN = AIN10000 AINN = AVSS #defineReg_0x00_MUX_110b10100000// AINP = AIN2,AINN = AVSS #defineReg_0x00_MUX_120b10110000// AINP = AIN3,AINN = AVSS #defineReg_0x00_MUX_13 0b10010000// AINP = AINP = AIN3 (0b100000_REFN )/AVDD_4 (REFN)/AVDD_1000监视器(0b1000)/AVDD_4 (REFN)/AV0b1000监视器(UX_1000 V)/AVDD_4)被绕过 #defineReg_0x00_MUX_150b11100000// AINP 和 AINN 短接至(AVDD + AVSS)/2 #defineReg_0x00_MUX_160b11110000//保留 //------ //// ADC 寄存器01h 设置 //--------------------------------------------------- // #define Reg_0x010x01//指针寄存器1的十六进制值 #defineReg_0x01_datarate_20SPS0b00000000//正常模式 SPS,Turbo 模式 SPS * 2 #defineReg_0x01_datarate_45SPS0b00100000//正常模式 SPS,Turbo 模式 SPS * 2 #define Reg_0x01_NORMAL 数据速率/定义90SPS Turbo 模式 SPS * 2 #defineReg_0x01_datarate_175SPS0b01100000//正常模式 SPS、Turbo 模式 SPS * 2 #defineReg_0x01_datarate_330SPS0b10000000//正常模式 SPS、Turbo 模式1100SPS * 2 #defineReg_0x01_datarate_600SPS0b10100000//正常 模式0b1000sps* 0b1000sps *正常模式0b1000sps Turbo 模式 SPS * 2 #defineReg_0x01_datarate_Reserved0b11100000//正常模式 SPS、Turbo 模式 SPS * 2 #defineReg_0x01_OperatingMode_Normal0b00000000//正常模式 SPS 设置* 1.正常模式(256kHz 调制器时钟、默认值) #define Reg_0x01_OperatingMode_Turbo0b00010000//正常模式 SPS 设置* 2Turbo 模式(512kHz 调制器时钟) #define Reg_0x01_ConversionMode_SS0b00000000//单次转换模式(默认) #define Reg_0x01_ConversionMode_C0b00001000//连续转换模式 #define Reg_0x01_VoltageReference_10b00000000 //已选择内部2.048V 基准(默认)#define Reg_0x01_VoltageReference_1 0b00000000 //使用 外部 AVREF_0b000REF_0电源输入(定义 AV0b000REF_0b) ---用作参考 #define Reg_0x01_VoltageReference_40b00000110 //模拟电源(AVDD–AVSS)用作参考 #define Reg_0x01_TemperatureSMode_Off0b00000000//温度传感器模式已禁用(默认) #define Reg_0x01_Temperat000000SMode_on 0b01/---启用--- //// ADC 寄存器02h 设置 //--------------------------------------------------- // #define Reg_0x020x02//指针寄存器2的十六进制值 #defineReg_0x02_DRDY_NR0b00000000//没有可用的新转换结果(默认值) #defineReg_0x02_DRDY_R0b10000000//新转换结果准备 就绪#defineReg_0x02_DCNT_dise0b00000000/ 默认值0b0000/已禁用的定义 DC0b0000000 / 0000/ 0b0d00转换计数器 #defineReg_0x02_CRC_IDOE0b00010000//已启用反相数据输出 #defineReg_0x02_CRC_CRC160b00100000// CRC16已启用 #defineReg_0x02_CRC_Reserved0b0010000//保留 #defineReg_0x02_BCS_OFF0b0000000//当前源关闭( 0b020_0u020_0u020_0u0u020_0u0u020_0u0b)#define Reg #define 020_0b 0u020_0u0u0u0b 0u0u0u0b 0_0u0u0u0u0u0u0u0u0u0b 0u0u0u0u0u0u0u0u0u0u0u0u0u0n1 #defineReg_0x02_IDAC_100uA0b00000011// 100uA #defineReg_0x02_IDAC_250uA0b00000100// 250uA #defineReg_0x02_IDAC_500uA0b00000101// 500uA #defineReg_0x02_1000AC_1000uA0b000001--- //// ADC 寄存器03h 设置 //------------------------------------------------------ // #define Reg_0x030x03//指针寄存器3的十六进制值 #defineReg_0x03_IDAC1MUX_OFF0b00000000//禁用 IDAC1 (默认值) #defineReg_0x03_IDAC1MUX_AIN00b00100000//将 IDAC1连接到 AIN0 #define AC03_0x03_IDAC1MUX_IDAC1 0BAC0000/ 将 IDAC1连接到 IDAC1 INAC1 INAC0B0000/ IDAC1 INAC1 INAC0100IN3 #defineReg_0x03_IDAC1MUX_REFP0b10100000// IDAC1连接到 REFP #defineReg_0x03_IDAC1MUX_REFN0b11000000// IDAC1连接到 REFN #defineReg_0x03_IDAC1MUX_Reserved0b11100000//保留 #define IDAC2MUX_IDAC0b0200001/IDAC020INAC0_IDAC032_INUX032_IDAC2 连接到 REF_IDAC0B020INUX/ IDAC024_IDAC0_IDAC020INUX0_IDAC0_IDAC0X0X0_INUX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X 将 IN2 #defineReg_0x03_IDAC2MUX_AIN30b00010000//将 IDAC2连接到 AIN3 #defineReg_0x03_IDAC2MUX_REFP0b00010100//将 IDAC2连接到 REFP #defineReg_0x03_IDAC2MUX_REFN0b00011000/ 将 IDAC2MUX_0b0003 保留/将 IDAC2寄存器0b0003保留/将0b0003保留/将 IDAC3保留为0b0003位#define 0b0003 void initADS112C04 (); uint16_t ReadADCValue (uint8_t channel、gpio_typedef* gpiox、uint16_t GPIO_Pin); void Reset_ADS112C04 (); void Start_Sync_ADS112C04 (); void PowerDown_ADS112C04 (); uint16_t ReadData_ADS112C04 (); uint8_t ReadRegister0_ADS112C04 (); uint8_t ReadRegister1_ADS112C04 (); uint8_t ReadRegister2_ADS112C04 (); uint8_t ReadRegister3_ADS112C04 (); //uint8_t ReadRegister_ADS112C04 (uint8_t RegisterToRead); void WriteRegister0_ADS112C04 (uint8_t DataToWrite); void WriteRegister0_ADS1128_t DataToWrite (uint8_t DataC04);void void WriteRegister2_ADS112C04 (uint8_t DataToWrite); void WriteRegister3_ADS112C04 (uint8_t DataToWrite); //void WriteRegister_ADS112C04 (uint8_t RegisterToWrite、uint8_t DataToWrite); #endif /* ADS112C04_*
代码:
/*
ADS112C04.c
*
*创建时间:2018年6月26日
* 作者:J. de Wit
*/
#include "ADS112C04.h"
#include "USART.h"
#include "UART_FICES.h"
void initADS112C04 ()
{
uint8_t 设置寄存器0 =/*0x81;*/ ReG_0x00_MUX_9 | Reg _0x00_GAING_1 |
设置0x0001_AM_R1_ENT_AM0001_ON = 0x0001_AM_AM_AM0001_ENT_1;0x0001_ENT_AM0001_AM0001_ENT_AM0001_AM0001_ENT_AM0001_ON = 0x0001_AM0001_ENT_AM0001_ENT_AM0001_ON = 0x0001_AM0001_ENT_AM0001_ON = 0x0001_ENT_AM0001_AM0001_ENT_AM0001_AM0001_ENT_AM0001_ENT_AM0001_ON//在正常模式下将采样率设置为90SPS,连续转换数据,使用外部参考,不要使用板载温度传感器模式。
uint8_t 设置寄存器2 =/*0x00;*/ Rereg_0x02_DRDY_NR | Rereg_0x02_DCNT_Dise | Rereg_0x02_CRC_D | Rereg_0x02_BCS_OFF | Rereg_0x02_IDAC_OFF;//数据未就绪、
uint8_t 寄存器0x02_CRC_D;
Reg 0_0_012_IDAC_OFF;ADS01204_CL_1
(ADS0_CL_1);ADS0_AC1 +设置寄存器0x04_IDAC0_CL_0_CL_1 (ADS0_1);
WriteRegister1_ADS112C04 (设置 Reg1);
HAL_delay (1);
WriteRegister2_ADS112C04 (设置 Reg2);
HAL_delay (1);
WriteRegister3_ADS112C04 (设置 Reg3);
hal_delay (1);
Start_Sync_ADS112C04 ();
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
uint16_t ReadReg ADCValue (uint8_t CHANNEL、GPIO_typedef* GPIOx、uint16_t GPIO_Pin)
{
uint16_t DataReceived = 0;
uint8_t 设置 Reg0 = 0;
switch (CHANNEL)
{
案例0:
Regs_0x00_MUX_REG_1;0x00_BACT_GAING_1
;0x00_REG_1 | PGA_BUX_REGING_1;0x00_REG_1 | 0x00_REG_REG_1;0x00_REG_REG_REG_1 | 0x00_REG_REG_1;0x00_REGING_1;0x00_REG_1 | 0x00_GP_REG_REGING_1;0x00_GP_REG_REG_1;0x00_REG_REG_REG_REG_1;0x00_GP
情况3:
设置寄存器0 = Reg_0x00_MUX_12 | Reg_0x00_GAIN_1 | Reg_0x00_PGA_BYPASS;
break;
默认值:
break;
}
WriteRegister1_ADS112C04 (Received _0x01_datarate_90SPS | Reg_OperatingMode_Normal | Reg_Reg_0x01_WriteRegister01-
(ADS112_DCMD-)-(ADS112_01-)- 0x120_DCMD-(0x120_D-)
///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
uint16_t ReadData_ADS112C04 ()
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t buffer = 0x10;
uint8_t Receivebbuffer[2];
uint16_t DataReceive= 0;
HAL_I2C_Master_Transmit (&I2C1)、缓冲区1、
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_Ready){ HAL_I2C_Master_Receive_it
(&I2C1_handler、address、Receivebuffer、2);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_ready){}-->/eReceivebuffer)
///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
void Reset_ADS112C04 ()
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t buffer = Command_Reset;
HAL_I2C_Master_Transmit;it (&I2C1_handler、address、&buffer、1);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_Ready){}
//------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
void Start_Sync_ADS112C04 ()
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t buffer = Command_Start_SYNC;
HAL_I2C_Master_Transmit _it (&I2C1_handler、address、&buffer、1);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_Ready){}
//------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
void PowerDown_ADS112C04 ()
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t buffer = Command_PowerDown;
HAL_I2C_Master_Transmit;it (&I2C1_handler、address、&buffer、1);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_Ready){}
//------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
uint8_t ReadRegister0_ADS112C04 ()
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t buffer = 0x20;
uint8_t Receivebuffer = 0;
HAL_I2C_Master_Transmit;it (&I2C1_handler、address、&buffer、&buffer、1);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_READY){}
HAL_I2C_Master_receive_it (&I2C1_handler、address、&Receivebuffer、1);
while (HAL_I2C_GetState (&I2C_handler)!= HAL_I2C_DRST_READY){<0xINC8_04
、UCTADDRO = 0xint8、UCTADDRO 1;< UCC8_0 = 0xINUCTADDRO 1、U0_0 = UCC24_UCTADDRO 1;< U_0 = 0xINUCTADC1_0;UCTADC1u_0 = 0xINTOP= U0_0
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_READY){}
HAL_I2C_Master_receive_it (&I2C1_handler、address、&Receivebuffer、1);
while (HAL_I2C_GetState (&I2C_handler)!= HAL_I2C_DRST_READY){
<0xINC8_04
、UCTADDRO = 0xINU8、UCC8_0_0;}UCTADDRO = 0xINU0_0 = UCTADDRO
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_READY){}
HAL_I2C_Master_receive_it (&I2C1_handler、address、&Receivebuffer、1);
while (HAL_I2C_GetState (&I2C_handler)!= HAL_I2C_State_ready){<0x04
、UCTADDRO = 0xint8、UCC8_0、UCTADDRO = 0xint8、UCC24_0;< UCC24_0 = UCTADDRO 1;< UCC24_0 = UCTADC1_0 = 0xINUCTADC1_0;< UCC24_0 = UCTADR_0
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_Ready){}
HAL_I2C_Master_Receive_it (&I2C1_handler、address、&Receivebuffer,1);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_ready){--------------------------------------------------------------------------
///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ///----
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ //
void WriteRegister0_ADS112C04 (uint8_t DataToWrite)
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t buffer[]={0x40,DataToWrite};
HAL_I2C_Master_Transmit _it (&I2C1_handler、address、buffer、buffer、address、buffer、 2);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_ready){}
void WriteRegister1_ADS112C04 (uint8_t DataToWrite)
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t DataToWrite)、{Uint8_I2C address[、
_transmit =}、HAL_transmit、HAL_handler =(0x41)、 2);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_ready){}
void WriteRegister2_ADS112C04 (uint8_t DataToWrite)
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t DataToWrite)、{Uint8_I2C address[、
_transmit =}、HAL_transmit、HAL_handler =(0x42_iter、HAL_transmit =(_iter) 2);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_ready){}
void WriteRegister3_ADS112C04 (uint8_t DataToWrite)
{
uint8_t address =(ADS112C04_I2CDefaultAddress << 1);
uint8_t DataToWrite)、{Uint8_I2C address[、
_transmit =}、HAL_transmit、HAL_handler =(0x43、HAL_transmit) 2);
while (HAL_I2C_GetState (&I2C1_handler)!= HAL_I2C_State_Ready){}