Praveen Aroul、您好!
我对 AFE4404有一些问题。
我将其与 Arduino IDE 和 SFH7072上的 ESP32搭配使用
我在这些传感器上编写了一个代码、但不了解如何正确处理寄存器设置。
需要相关帮助。
谢谢、
此致、
Nishikant
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.
Praveen Aroul、您好!
我对 AFE4404有一些问题。
我将其与 Arduino IDE 和 SFH7072上的 ESP32搭配使用
我在这些传感器上编写了一个代码、但不了解如何正确处理寄存器设置。
需要相关帮助。
谢谢、
此致、
Nishikant
#include
#include
#include
const int Resetz = 15;
CONST int ADC_RDY = 4;
#define HRM_ADD 0x58
#define ADC_STEP_SIZE 0.0000057220458984
define MAX 500
双 ADC_;
双精度 arr_0x2A[MAX]、arr_0x2B[MAX]、arr_0x2C[MAX]、arr_0x2D[MAX]、arr_0x2E[MAX]、 ARR_0x2F[MAX]、ARR_40[MAX];
void setup(){
Wire.begin();
Serial.begin(115200);
PinMode (Resetz、输出);
引脚模式(ADC_RDY、输入);
PinMode (Resetz、输出);
引脚模式(ADC_RDY、输入);
HRM_POWER_ON ();//打开 AFE 并触发
AFE_Reg_Init();//启用寄存器写入
Set_All_reg ();//写入所有寄存器
HRM_POWER_DOWN ();//关闭电源
延迟(1000);
}
void loop(){
//将主代码放在此处,重复运行:
HRM_POWER_ON ();//打开 AFE 并触发
AFE_Reg_Init();//启用寄存器写入
Set_All_reg ();//写入所有寄存器
延迟(100);
AFE_Enable_Read ();//读取使能
// Serial.println ("adc_RDY input>>>>>>>>>>>>>>>>>>>) ");
// int ADC = digitalRead (ADC_RDY);
// Serial.println (ADC);
//如果(ADC > 0){
// Serial.println ("adc_RDY 输入可用");
//}
// Serial.println ("adc_RDY input>>>>>>>>>>>>>>>>>>>) ");
INT 计数= 0;
while (count <= 20)
{
//Serial.print ("0x2A:");
ADC_= AFE_Reg_Read (0x2A);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
//Serial.print (adc、hex);
ARR_0x2A[count]= ADC_;
// Serial.println ("\n");
//Serial.print ("0x2B:");
ADC_= AFE_Reg_Read (0x2B);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
//Serial.print (adc、hex);
ARR_0x2B[计数]= ADC_;
// Serial.println ("\n");
// Serial.print ("0x2C:");
ADC_= AFE_Reg_Read (0x2C);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
// Serial.print (adc、hex);
ARR_0x2C[count]= ADC_;
// Serial.println ("\n");
// Serial.print ("0x2D:");
ADC_= AFE_Reg_Read (0x2D);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
// Serial.print (adc、hex);
ARR_0x2D[计数]= ADC_;
// Serial.println ("\n");
// Serial.print ("0x2E:");
ADC_= AFE_Reg_Read (0x2E);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
// Serial.print (adc、hex);
ARR_0x2E[count]= ADC_;
// Serial.println ("\n");
// Serial.print ("0x2F:");
ADC_= AFE_Reg_Read (0x2F);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
// Serial.print (adc、hex);
ARR_0x2F[计数]= ADC_;
// Serial.println ("\n");
// Serial.print ("0x40:");
ADC_= AFE_Reg_Read (0x40);
ADC_*= ADC_STEP_SIZE;
ADC_*= 0.1;
// Serial.print (adc、hex);
arr_R_40[计数]= ADC_;
serial.println ("\n"\});
count++;
延迟(40);
}
//AFE_Reg_Read (47);
AFE_Disable_Read ();
HRM_POWER_DOWN ();//关闭电源
serial.println ("########### ");
对于(int k = 0;k <= 20;k++){
serial.print ("arr_0x2A:::");serial.println (arr_0x2A[k]、DEC);
serial.print ("arr_0x2B:::");serial.println (arr_0x2B[k]、DEC);
serial.print ("arr_0x2C::");serial.println (arr_0x2C[k]、DEC);
serial.print ("arr_0x2D::::");serial.println (arr_0x2D[k]、DEC);
serial.print ("arr_0x2E::::");serial.println (arr_0x2e[k]、DEC);
serial.print ("arr_0x2F:::");serial.println (arr_0x2F[k]、DEC);
serial.print ("arr_R_40:::");serial.println (arr_R_40[k]、DEC);
延迟(1000);
}
serial.println("");
延迟(1000000);
}
/********
HRM 通电
(小部分 /
void HRM_POWER_ON (){
serial.println ("HRM_POWER_ON");
延迟(1000);
digitalWrite (Resetz、HIGH);//AFE 初始化
延迟(10);
digitalWrite (Resetz、low);
delayMicroseconds (35);/25us 至50us。
digitalWrite (Resetz、HIGH);//通过将 RESETZ =低电平设置为25 - 50us 来重置内部寄存器
延迟(10);
}
/********
通过将 RESETZ 引脚设置为低电平200us 以上来断电
秘书长的报告 /
void HRM_POWER_DOWN (){
serial.println ("\nHRM_POWER_DOWN");
延迟(100);
digitalWrite (Resetz、low);
delayMicroseconds (200);
}
/*********
重新注册器写入模式
(小部分 /
void AFE_Reg_Init(){
serial.println ("设置 init 寄存器");
延迟(1000);
Wire.beginTransmission(HRM_ADD);
AFE_Reg_Write (0x00、0x000000);
}
/ /
/* AFE4404_Enable_Read */
/ /
void AFE_Enable_Read ()//禁止写入寄存器
{
//Serial.println ("AFE_Reg_Read");
延迟(10);
字节 configData[3];
CONFIGData[0]= 0x00;
CONFIGData[1]= 0x00;
CONFIGData[2]= 0x01;
I2C_WRITE (0x00、configData);
}
/ /
/* AFE4404_Disable_Read */
/ /
void AFE_Disable_read ()//Permitt 写入寄存器
{
// Serial.println ("AFE_Reg_disable read");
延迟(10);
字节 configData[3];
CONFIGData[0]= 0x00;
CONFIGData[1]= 0x00;
CONFIGData[2]= 0x00;
I2C_WRITE (0x00、configData);
}
/*********
重新生成器写入
(小部分 /
void AFE_Reg_Write (int reg_address、unsigned long data1)
{
字节 configData[3];
configData[0]=(byte)(data1 >> 16);
configData[1]=(字节)((((data1和0x00FFFF)>> 8));
configData[2]=(字节)((((data1 & 0x0000FF)));
I2C_WRITE (reg_address、configData);
}
char i2c_write (int reg_address、byte configData[])
{
int TRANS_END = 0;
Wire.beginTransmission(HRM_ADD);
// Serial.println (reg_address);
Wire.write (reg_address);
// Serial.print (configData[0]);
// Wire.write (configData[0]);
// Serial.print (configData[1]);
// Wire.write (configData[1]);
// Serial.print (configData[2]);
// Wire.write (configData[2]);
Wire.write (configData、3);
wire.endTransmission ();
延迟(1);
// Serial.println (");
返回(TRANS_END);
}
/ /
/* AFE4404_Reg_Read */
/ /
带符号长 AFE_Reg_Read (int reg_address)
{
字节 configData[3];
带符号长整型返回值;
I2C_Read (reg_address、configData);
RetVal = CONFIGData[0];
RetVal =(RetVal << 8)| CONFIGData[1];
RetVal =(RetVal << 8)| CONFIGData[2];
//Serial.println ("######### hex_value###### ");
serial.print (reg_address);Serial.print (":");Serial.println (RetVal);
//Serial.println ("######### hex_value###### ");
延迟(200);
if (reg_address >= 0x2A && reg_address <= 0x40)
{
if (RetVal & 0x00200000)//检查 ADC 值是正值还是负值
{
RetVal &= 0x003FFFFF;//将其转换为22位值
serial.print (reg_address);serial.print (":::将其转换为22位值 cos -ve:");Serial.println (RetVal);
返回(RetVal ^ 0xFFC00000);
}
}
// Serial.println ("######### RetVal ^ 0xFFC00000########## ");
// Serial.print (reg_address);Serial.print (":");Serial.println (RetVal);
// Serial.println ("######### conversion 值######## ");
//延迟(1000);
返回 RetVal;
}
char i2c_read (int reg_address、字节*读取_Data){
int TRANS_END = 0;
int byteCount = 3;
Wire.beginTransmission(0x58);
Wire.write (reg_address);
wire.endTransmission ();
Wire.requestFrom (0x58、3);
延迟(10);
while (Wire.Available ()&&(byteCount!= 0))
{
*Read_Data++= Wire.Read();
字节计数--;
}
返回(TRANS_END);
}
/*********
设置所有写入寄存器
秘书长的报告 /
void set_all_reg (){
AFE_Reg_Write (01、0x000064);//1h
AFE_Reg_Write (02、0x00018E);
AFE_Reg_Write (03、0x000320);
AFE_Reg_Write (04、0x0004AE);
AFE_Reg_Write (05、0x0001F4);
AFE_Reg_Write (06、0x00031E);
AFE_Reg_Write (07、0x000384);
AFE_Reg_Write (0x08、0x0004AE);
AFE_Reg_Write (0x09、0x000000);
AFE_Reg_Write (10、0x00018E);
AFE_Reg_Write (11、0x0000514);
AFE_Reg_Write (12、0x00063E);
AFE_Reg_Write (13、0x0015E8);
AFE_Reg_Write (14、0x0017B3);
AFE_Reg_Write (15、0x0017BD);
AFE_Reg_Write (16、0x001988);
AFE_Reg_Write (17、0x001992);
AFE_Reg_Write (18、0x001B5E);
AFE_Reg_Write (19、0x001B68);
AFE_Reg_Write (20、0x001D33);
AFE_Reg_Write (21、0x0015E0);
AFE_Reg_Write (22、0x0015E6);
AFE_Reg_Write (23、0x0017B5);
AFE_Reg_Write (24、0x0017BB);
AFE_Reg_Write (25、0x00198A);
AFE_Reg_Write (26、0x001990);
AFE_Reg_Write (27、0x001B60);
AFE_Reg_Write (28、0x001B66);
AFE_Reg_Write (29、0x009C3F);
AFE_Reg_Write (30、0x000103);//1E //0000//160 millisec//103 101/02
AFE_Reg_Write (32、0x008000);// 20h//8000
AFE_Reg_Write (33、0x000003);//21h 增益1
/*1. 第一次测试:将22h 寄存器设置为000A00 (红色 LED)-在本例中,哪个 LED 闪烁/亮起
2.第二次测试:将22h 寄存器设置为000280,然后重新运行程序-在这种情况下,哪个 LED 闪烁/亮起。
3.第三次测试:将22h 寄存器设置为00000A,然后重新运行程序-在这种情况下,哪个 LED 闪烁/亮起。 *
AFE_Reg_Write (34、0x000104);/22h LED A28A 104
AFE_Reg_Write (35、0x000200);/23.
AFE_Reg_Write (41、0x000000);/29
AFE_Reg_Write (49、0x000000);//31
AFE_Reg_Write (50、0x001DFB);//32
AFE_Reg_Write (51、0x00991F);//33
AFE_Reg_Write (52、0x000000);//34
AFE_Reg_Write (53、0x000000);//35
AFE_Reg_Write (54、0x000000);///两个 LED 模式36
AFE_Reg_Write (55、0x000000);//37
AFE_Reg_Write (57、0x000000);//39
AFE_Reg_Write (58、0x000000);//3A 偏移电流
AFE_Reg_Write (61、0x000020);//////20抽取模式开启
}
您能否查看我的代码以了解设置是否正确、或者我是否需要更正一些缺失的问题?
Praveen、您好!
很抱歉、我的回答很晚、我配置正确、我还得到一些读数、通信正常、我可以将 LED 电流更改为。
请检查此代码,寄存器值是否正确??
e2e.ti.com/.../0385.hrm.txt###
我得到了这些读取 wrt 代码
e2e.ti.com/.../Ai2.txt
Praveen Aroul、您好!
这是写入寄存器的正确方法吗?
void AFE_Reg_Write (int reg_address、unsigned long data1)//在 data1中,我发送24位数据(0x00018E)
{
byte configData[3];
configData[0]=(byte)(data1 >> 16);
configData[1]=(byte)((((((sys2c & 0x00FFFF))>>
));configData[byte)
、configData](byte);configData[1]=(byte)
char i2c_write (int reg_address、byte configData[])
{
/*24 bit data writtern on register in MSB first pattern */
int tras_end = 0;
Wire.beginTransmission(HRM_ADD);
// Serial.println (reg_address);
Wire.write (reg_address);
// Serial.print (configData[0]);
Wire.write (configData[0]);//MSB
// Serial.print (configData[1]);
Wire.write (configData[1]);
// Serial.print (configData[2]);
Wire.write (configData[2]);//LSB
// Wire.write (configData、 3);//LSB
Wire.endTransmission ();
delay (10);
// Serial.println (");
return (TRANS_END);
}
如果我出错、请改正。
谢谢你
Nishi、
我检查了您的寄存器设置并发现了一个错误。
您已将转换时间设置为115us。 但平均值数量设置为4 (NUMAV 为3)、在这种情况下、最小所需的 ADC 转换时间为265us。
您可能需要将 NUMAV 更改为1。
我没有 Arduino 方面的专业知识。 因此无法对代码进行注释。
我建议您参阅 AFE4404EVM 产品文件夹(https://www.ti.com/product/AFE4404/technicaldocuments)中提供的 AFE4404EVM 固件源代码