主题中讨论的其他器件:ADS1115、
你好。 我遇到了 我们使用 ADS112C04芯片制作的 ADC 模块问题。 附件为所述模块的原理图和 PCB 设计。 该器件从 ADS1115模块汲取灵感、添加了二极管、用于防止输入电压超出限值(-0.3V 和5.3v)。


该模块能够与通过运行 Wire.beginTransmission(address 进行验证的微控制器(ESP32模块)进行通信。 但是、随着添加的更多命令(即 RESET、START、rreg 和 wreg)、IC 开始不能正常工作、最终会冒烟。 所用代码见附件。 目标是使用内部基准电压在2ksps 条件下执行连续转换。
#include <Wire.h>
int address=0x40;
int decimalResolution=6;
int interruptPin = 36;
int initialTime=0;
int nowTime=0;
volatile bool rdy=false;
void setup() {
Serial.begin(115200);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), adsReady, FALLING);
Wire.begin();
if(ADS_begin()){
Serial.println("Iz alive! Iz alive");
}
else{
Serial.println("Dedz");
}
ADS_reset();
ADS_requestADC();
Serial.println(ADS_readRegister(address,0x20),BIN);
Serial.println(ADS_readRegister(address,0x24),BIN);
Serial.println(ADS_readRegister(address,0x28),BIN);
Serial.println(ADS_readRegister(address,0x2C),BIN);
ADS_start();
initialTime=micros();
Serial.println(ADS_readRegister(address,0x28),BIN);
}
void loop() {
if (rdy == true)
{
rdy=false;
int voltageRecord = ADS_readData(address);
nowTime = micros();
int timeRecord = (nowTime - initialTime)/1000;
String dataInstance=String(timeRecord,decimalResolution)+","+String(voltageRecord,decimalResolution);
Serial.println(dataInstance);
}
}
bool ADS_begin()
{
if (! ADS_isConnected()) return false;
return true;
}
bool ADS_isConnected()
{
Wire.beginTransmission(address);
return (Wire.endTransmission() == 0);
}
void ADS_start(){
Wire.beginTransmission(address);
Wire.write((uint8_t)0x08);
Wire.endTransmission();
}
void ADS_reset(){
Wire.beginTransmission(address);
Wire.write((uint8_t)0x06);
Wire.endTransmission();
}
void ADS_requestADC()
{
// write to register is needed in continuous mode as other flags can be changed
uint16_t config_1 = 0x00; // bit 7-4 Input multiplexer config
config_1 |= 0x00; // bit 3-1 Gain
config_1 |= 0x00; // bit 0 PGA enable
uint16_t config_2 = 0x40; // bit 7-5 Data rate
config_2 |= 0x00; // bit 4 Opeating mode
config_2 |= 0x08; // bit 3 conversion mode
config_2 |= 0x00; // bit 2-1 voltage reference
config_2 |= 0x00; // bit 0 temperature sensor mode
Serial.println(ADS_writeRegister(address, config_1, config_2));
}
bool ADS_writeRegister(uint8_t address, uint16_t config_1, uint16_t config_2)
{
Wire.beginTransmission(address);
Wire.write((uint8_t)0x40);
Wire.write((uint8_t)config_1);
Wire.write((uint8_t)0x44);
Wire.write((uint8_t)config_2);
return (Wire.endTransmission() == 0);
}
int ADS_readRegister(uint8_t address,uint8_t reg_map)
{
uint16_t value=0;
Wire.beginTransmission(address);
Wire.write((uint8_t)reg_map);
Wire.endTransmission();
Wire.requestFrom((int) address, 1);
value=Wire.read();
return value;
}
int ADS_readData(uint8_t address)
{
uint16_t value=0;
int rv=0;
Wire.beginTransmission(address);
Wire.write((uint8_t)0x10);
Wire.endTransmission();
rv=Wire.requestFrom((int) address, 2);
if (rv == 2)
{
value = Wire.read() << 8;
value += Wire.read();
return value;
}
}
void adsReady()
{
rdy = true;
}
我不确定这是硬件问题还是软件问题。 想知道我们哪里出了问题。 但我怀疑 这个问题与 IC 的 RESET 引脚连接到 VDD 时调用的 RESET 命令有关。 烟似乎来自这个引脚。 在修复模块之前、希望验证我的怀疑。
非常感谢。