大家好、
请查看下面我在通道3、4和7上观察到的奇怪行为。 前端配置了增益为24、数据速率为500SPS。 SRB1启用、偏置放大器启用、并连接到所有输入(P 和 N -因此 N 仅连接到所有通道上的 SRB1)。 P 输入被复用到一个正常的输入、并且在输入悬空时获得这个数据。
是否有人知道我为什么会在各个渠道中出现不一致的行为? 我将使用内部电压基准。

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.
/*
* afe.c
*
* Created on: Jan 26, 2021
* Author: John Tarasidis
*/
#include "main.h"
#include "afe.h"
extern SPI_HandleTypeDef hspi3;
static void afe_write_reg(uint8_t reg, uint8_t value) {
uint8_t cmd_seq[3] = {0x40 | reg, 0x00, value};
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
HAL_SPI_Transmit(&hspi3, cmd_seq, 3, HAL_MAX_DELAY);
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
}
static void afe_write_ch(uint8_t value) {
uint8_t cmd_seq[] = {0b01000101, 0x09, value, value, value, value,
value, value, value, value};
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
HAL_SPI_Transmit(&hspi3, cmd_seq, 10, HAL_MAX_DELAY);
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
}
void afe_init(void) {
HAL_Delay(200); //tpor
HAL_GPIO_TogglePin(ADS_RST_GPIO_Port, ADS_RST_Pin);
HAL_Delay(1);
HAL_GPIO_TogglePin(ADS_RST_GPIO_Port, ADS_RST_Pin);
HAL_Delay(1);
afe_sdatac(); //enable reg writes
afe_write_reg(0x03, 0xE0);
HAL_Delay(10);
afe_write_ch(0b01100001);
HAL_GPIO_WritePin(ADS_START_GPIO_Port, ADS_START_Pin, GPIO_PIN_SET); //start conversion
afe_rdatac();
afe_sdatac();
afe_write_reg(0x02, 0xC0);
afe_write_ch(0b01100000);
afe_set_dr(); //set data rate 1000kSps
afe_set_srb(); //mux reference to CHn
afe_set_bias(); //enable internal reference, enable bias amp, mux CHp&n to bias inverting
afe_rdatac();
}
void afe_sdatac(void) {
uint8_t sdatac = 0b00010001;
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
HAL_SPI_Transmit(&hspi3, &sdatac, 1, HAL_MAX_DELAY);
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
}
void afe_rdatac(void) {
uint8_t rdatac = 0b00010000;
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
HAL_SPI_Transmit(&hspi3, &rdatac, 1, HAL_MAX_DELAY);
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
}
void afe_rdata(uint8_t* sample) {
//uint8_t rdata = 0b00010010; //no longer sending rdata and instead just clocking out w/ rdatac
uint8_t zero[27] = {0};
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
//HAL_SPI_Transmit(&hspi3, &rdata, 1, HAL_MAX_DELAY);//read data
HAL_SPI_TransmitReceive(&hspi3, zero, sample, 27, HAL_MAX_DELAY);
HAL_GPIO_TogglePin(ADS_CS_GPIO_Port, ADS_CS_Pin);
}
void afe_set_dr(void) {
afe_write_reg(0x01, 0b10010101);
}
void afe_set_bias(void) {
afe_write_reg(0x0D, 0xFF); //route all 8 channels positive to bias inverting input
afe_write_reg(0x0E, 0xFF); //route all 8 channels negative to bias inverting,
//which is SRB1 for all channels
afe_write_reg(0x03, 0b11101100); //enable bias amp, route internal ref to bias
}
void afe_set_srb(void) {
afe_write_reg(0x15, 0b00100000);
}
大家好、TC 、上面是我的简单小库、我将其合并在一起、以便与 STM32L4微控制器配合使用。 在 afe_init 中、您将看到它大致遵循数据表第62页的设置序列、但随后使用偏置放大器1000kSps、SRB1多路复用器等为正常 AQ 启用功能
在主程序中,我调用 afe_init(),并在连接到 ADS1299的 DRDY 引脚的引脚上设置下降沿 EXTI 中断。 当该中断触发时、它所做的就是设置一个标志。 我的 main()是一个简单的中断驱动状态机,其中一个状态由 DRDY 标志驱动, 在该状态下发生的唯一事件是 afe_RDATA()调用,然后再写入闪存。
需要注意的是、当以 EEG 方式实际连接设备时、我发现这种行为会更好。 这可能是浮点输入的某种奇怪现象? 另请注意:在我的电路板上、每个输入和 SRB1都是相对于接地进行 RC 滤波的。 我事后意识到、我应该在通道输入和 SRB1之间使用差分电容器、而不是 AGND -这是否是问题的一部分?
谢谢、
John
快速编辑:SPI 时钟为2MHz、DRDY 引脚的响应时间通常小于30us。 已在范围内确认。