Шум линии электропередачи 50 Гц с использованием Arduino и mikroe ECG 2 (ADS1194)
Я пытаюсь провести измерения ЭКГ с помощью Mikroe ECG 2 (ADS1194), подключенного к Arduino Uno через шилд Arduino Uno Click.
Я могу измерить ЭКГ и каким-то образом прочитать данные сердечного ритма в моем канале 3. Мой код для Arduino взят из репозитория Github.
byte dataReady_Pin = 2;
byte reset_pin = 17;
byte cs_pin = 10 ;
Кажется, контакты установлены правильно, и я использовал настройки по умолчанию из https://github.com/MikroElektronika/mikrosdk_click_v2/blob/master/clicks/ecg2/lib_ecg2/src/ecg2.c.
void setup() {
Serial.begin(250000);
//задержка(3000);
Serial.println("Starting...");
if (adc.begin()) {
Serial.println("ADC started");
numberOfChannels = adc.getNumberOfChannels();
if (verbosity) {
Serial.print("ADS119X Conected") ;
Serial.println("") ;
displayRegs ();
Serial.print("Num Channels: ") ;
Serial.print(numberOfChannels) ;
Serial.println();
}
} else {
Serial.print("ADS119X not started") ;
}
// Конфигурация из примера https://github.com/MikroElektronika/mikrosdk_click_v2/blob/master/clicks/ecg2/lib_ecg2/src/ecg2.c
adc.WREG(ADS119X_ADD_CONFIG1, ADS119X_DRATE_250SPS);
adc.WREG(ADS119X_ADD_CONFIG2, 0x20);
adc.WREG(ADS119X_ADD_CONFIG3, 0x40 | 0x80 | 0x0C);
adc.WREG(ADS119X_ADD_LOFF, 0xE0 | 0x10 | 0x03);
adc.WREG(ADS119X_ADD_RLD_SENSP, 0x02 );
adc.WREG(ADS119X_ADD_RLD_SENSN, 0x02 );
adc.WREG(ADS119X_ADD_LOFF_SENSP, 0x05);
adc.WREG(ADS119X_ADD_LOFF_SENSN, 0x02);
adc.WREG(ADS119X_ADD_LOFF_FLIP, 0x00);
// остановить преобразование
adc.sendCommand(ADS119X_CMD_STOP);
adc.sendCommand (ADS119X_CMD_SDATAC);
adc.setChannelSettings(ADS119X_ADD_CH1SET, 0x00, ADS119X_CHnSET_GAIN_6, ADS119X_CHnSET_MUX_NORMAL);
adc.setChannelSettings(ADS119X_ADD_CH2SET, 0x00, ADS119X_CHnSET_GAIN_6, ADS119X_CHnSET_MUX_NORMAL);
adc.setChannelSettings(ADS119X_ADD_CH3SET, 0x00, ADS119X_CHnSET_GAIN_6, ADS119X_CHnSET_MUX_NORMAL);
adc.setChannelSettings(ADS119X_ADD_CH4SET, 0x00, ADS119X_CHnSET_GAIN_6, ADS119X_CHnSET_MUX_NORMAL);
adc.WREG(ADS119X_ADD_GPIO, 0x0F);
ads119x_pace_detect_odd_channels_select(0x00);
adc.WREG(ADS119X_ADD_CONFIG4, 0x02);
adc.sendCommand(ADS119X_CMD_START);
delay(100);
adc.sendCommand(ADS119X_CMD_RDATAC);
delay(100);
}
Я попытался подключить Arduino к аккумулятору (но USB все равно нужен для считывания данных, поскольку у меня нет дисплея или чего-то подобного) и отключить ноутбук, к которому он подключен, от электросети.
Я не инженер-электрик, поэтому у меня действительно заканчиваются идеи, как можно уменьшить этот шум 50/100 Гц.
Вот изображения измеренного сигнала и его частотного спектра.
Я был бы признателен за любые идеи о том, как можно решить эту проблему.
Я использую электроды LA, RA, LL с гелевыми штифтами хорошего качества.
Я могу потом использовать цифровой фильтр, но это не кажется мне удовлетворительным решением.

@Jakob Strutz, 👍-1
Обсуждение2 ответа
Вы пытаетесь измерить очень слабые сигналы. Сетевой шум повсюду вокруг вас. Он улавливается проводами. Он также передаётся от источника питания. Стандартные блоки питания не предназначены для медицинского применения, они быстро и неаккуратно работают.
Есть несколько способов улучшить ситуацию. Возможно, вам придётся попробовать несколько решений.
- Используйте батарею в качестве источника питания
- Спроектируйте лучший источник питания, возможно, импульсный источник питания с хорошей фильтрацией.
- Используйте ферритовые кольца на всех выводах
- Используйте цифровой фильтр для удаления 50 Гц.
В цифровом фильтре нет ничего неудовлетворительного, но лично я бы в первую очередь попытался уменьшить шум (а также).
Прежде всего, я бы не рекомендовал подключать электроды к телу, когда устройство подключено к компьютеру, работающему от сети. Вы сказали, что отключили компьютер от сети для снижения уровня шума, так что это хорошо. Но имейте в виду, что блок питания вашего компьютера, скорее всего, не предназначен для медицинских целей.
Использование аккумулятора, пожалуй, наилучший вариант, поскольку он обеспечивает очень низкий уровень шума. При использовании аккумулятора может даже не потребоваться дополнительная регулировка, за исключением защиты аккумулятора и стабилизации напряжения (вместо снижения напряжения аккумулятора).
Использование фильтра 50 Гц, рекомендованного Рохитом, также отлично работает, особенно если вы используете какой-нибудь (цифровой) режекторный фильтр на частотах 50 Гц и 100 Гц, который обеспечивает действительно высокое затухание вблизи этих частот. Полоса пропускания ЭКГ от 0,1 Гц до 30 Гц практически не подвержена влиянию этих режекторных фильтров. Если же вы стремитесь к более широкой полосе пропускания, шум станет ещё большей проблемой, поскольку полезный сигнал ослабевает с ростом частоты.
Когда дело доходит до ЭКГ, существует множество причин возникновения помех 50 Гц и гармоник. Человеческое тело, по сути, действует как антенна, которая также улавливает помехи от сети. Несмотря на то, что электроды ЭКГ расположены на разных участках тела, помехи в основном синфазные на всех электродах, то есть одинаковые и синфазные. Если предположить, что ваш входной каскад ЭКГ имеет бесконечное подавление синфазных помех, то синфазные помехи не будут иметь никакого значения, но это не так. Существует множество причин низкого подавления синфазных помех, но, поскольку вы используете комплект разработчика, я предполагаю, что конструкция и компоновка довольно хороши. Но даже при грамотно спроектированном входном каскаде коэффициент подавления синфазного сигнала (CMRR в техническом описании) ограничен. Именно поэтому существует управляемая правая ножка (DRL), которая, по сути, пытается ослабить синфазные помехи, активно управляя корпусом. Вопрос в том, используете ли вы DRL на самом деле?
Как предложил Руди, лучше всего регистрировать данные локально или использовать беспроводное соединение. Также убедитесь, что у вас нет нежелательного подключения к ПК, который может быть каким-либо образом подключен к электросети. Если вы хотите сохранить USB-подключение, попробуйте использовать USB-изолятор, который обеспечивает гальваническую развязку между ПК и Arduino. На рынке представлено множество различных USB-изоляторов в довольно широком ценовом диапазоне. Я бы не стал покупать самый дешёвый на Alibaba, но это на ваше усмотрение. При использовании аккумулятора USB-изолятор нужен только для оптической изоляции (оптической изоляции) соединения данных и заземления. Некоторые USB-изоляторы также обеспечивают изолированное напряжение 5 В на стороне ведомого устройства с помощью небольшого трансформатора, но при использовании аккумулятора это не нужно.
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Как получить данные о весе с датчиков стеклянных электронных весов для ванной?
- Получение BPM из данного кода
- Датчик Arduino Uno DHT11 Не удалось прочитать данные с датчика DHT
- Как подключить более 10 датчиков к Arduino uno r3
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
Вы подключаете электроды к большой антенне, которая улавливает много электрических помех... Ваш вопрос лучше задать по адресу https://electronics.stackexchange.com/questions, @jsotola
Запишите данные на SD-карту или используйте беспроводное соединение (Wi-Fi, Bluetooth и т.д.) для получения данных. Продолжайте работать от аккумулятора., @Rudy