Hello dear TI Team,
I am having some difficulties using the ADS1294 chip for measuring EMG signals. A simple custom board is used to measure the signals. I don't even know if the "problem" is a digital or analogue one.
I want to start with the problem. Configuration follows afterwards.
1. Problem
1. I have a square wave signal connected via audio jack on channel 1 (an oscilloscope is also connected)). The other pins are left floating.
My serial plotter shows the following chart, which has an dc offset but this is also shown on my scope. The amplitude in turn looks very good. Millivolts on y-axis.
But sometimes this happens and it it seems as if I can influence it, for example by touching the ground connection or the laptop (in that case the weired signals disapear):
Now let's see the results in the field (without RLD), channel 3 connected to my skin (biceps) via 2 wet electrodes and audio jack:
1. The one muscle contraction can be well detected, as well as the 50HZ power line interference. BUT: I touched ground pin all time, while taking the screenshot.
2. Without touching ground, these weired signals return:
The unconnected, floating channels took weird too:
If we check the frquencies there are 50 Hz harmonics?!
If I just leave the channels unconnected:
Strangely enough activating the RLD has no affect.
2. Configuration & Code
The ADS1924 is powerd via the microcontroller board, which is powered from USB (Unipolar; VDDA = 5V, VDD = 3.3V). Data is transmitted from ADS1924 to a STM Cortex M7 microcontroller using arduino framework (with mbedOS). On the MCU the bytes are converted to signed integers and the correlating voltage is calculated. Afterwards the samples are transfered to my computer via USB (serial port) and plotted in some serial plotter.
The Configuration of the ADS looks like this:
send_command(SDATAC); SPI.transfer(WREG | CONFIG1); delayMicroseconds(5); SPI.transfer(0x00); delayMicroseconds(5); SPI.transfer(0b11000101); // HR mode | multiple readback mode | clock output disabled | 1kSPS delayMicroseconds(10); SPI.transfer(WREG | CONFIG2); delayMicroseconds(5); SPI.transfer(0x00); delayMicroseconds(5); SPI.transfer(0x00); // No test signal delayMicroseconds(10); SPI.transfer(WREG | CONFIG3); delayMicroseconds(5); SPI.transfer(0x00); delayMicroseconds(5); SPI.transfer(0b11101000); // internal ref buf | 4V VREFP | RLDREF internal but buffer pwd delayMicroseconds(10); delay(50); SPI.transfer(WREG | CH1SET); delayMicroseconds(5); SPI.transfer(0x03); delayMicroseconds(5); SPI.transfer(0b00000000); // 1 -> Normal operation, PGA = 6, Normal Electrode Input delayMicroseconds(5); SPI.transfer(0b00000000); // 2 delayMicroseconds(5); SPI.transfer(0b00000000); // 3 delayMicroseconds(5); SPI.transfer(0b00000000); // 4 delayMicroseconds(10); send_command(RDATAC);
4. Question
Do you have any idea why this is happening? Is this normal? And why are the signals "pulled to zero" of all things?
Is it due to some weird interference or is just my algorithm/conversion trash/wrong?
How can I stop this and measure clean EMG signals?
Why the RLD has no influence on the signal (CONFIG 3: RLD_MEAS = 0 | RLDREF_INT = 1 | PD_RLD = 1 and RLD electrode connected to skin)?
Thank you very much for any ideas and your help!
Greetings
Benjamin Geiger