Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sampling not sincronized #8

Open
AlbiBone opened this issue Apr 11, 2019 · 1 comment
Open

Sampling not sincronized #8

AlbiBone opened this issue Apr 11, 2019 · 1 comment

Comments

@AlbiBone
Copy link

AlbiBone commented Apr 11, 2019

Hello, I am using this library but I have some problems with the sincronization of the data-rate coming from the ADS1220 and the reading-rete of my Arduino UNO.
Basically the Arduino loop is executed too fast in comparison than the data-rate and therefore I get a lot of samples that are 0.00 mV between one "real" sample and the other. See the attached picture:

ADS1220

It look like that the execution do not wait new data coming from the ADS1220.

Here is the code I'm using.

`//////////////////////////////////////////////////////////////////////////////////////////
//
// Demo code for the ADS1220 24-bit ADC breakout board
//
// Author: Ashwin Whitchurch
// Copyright (c) 2018 ProtoCentral
//
// This example gives differential voltage across the AN0 and AN1 pins in mVolts
//
// Arduino connections:
//
// |ADS1220 pin label| Pin Function |Arduino Connection|
// |-----------------|:--------------------:|-----------------:|
// | DRDY | Data ready Output pin| D6 |
// | MISO | Slave Out | D12 |
// | MOSI | Slave In | D11 |
// | SCLK | Serial Clock | D13 |
// | CS | Chip Select | D7 |
// | DVDD | Digital VDD | +5V |
// | DGND | Digital Gnd | Gnd |
// | AN0-AN3 | Analog Input | Analog Input |
// | AVDD | Analog VDD | - |
// | AGND | Analog Gnd | - |
//
// This software is licensed under the MIT License(http://opensource.org/licenses/MIT).
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// For information on how to use, visit https://github.com/Protocentral/Protocentral_ADS1220
//
/////////////////////////////////////////////////////////////////////////////////////////

#include "Protocentral_ADS1220.h"
#include <SPI.h>

#define PGA 1 // Programmable Gain = 1
#define VREF 3.300 // Internal reference of 2.048V
#define VFSR VREF/PGA
#define FSR (((long int)1<<23)-1)

#define ADS1220_CS_PIN 7
#define ADS1220_DRDY_PIN 6

Protocentral_ADS1220 pc_ads1220;
int32_t adc_data;

void setup(){
Serial.begin(115200);

pc_ads1220.begin(ADS1220_CS_PIN,ADS1220_DRDY_PIN);

pc_ads1220.set_data_rate(DR_20SPS);
pc_ads1220.set_pga_gain(PGA_GAIN_1);
pc_ads1220.select_mux_channels(MUX_AIN0_AIN1);  //Configure for differential measurement between AIN0 and AIN1
pc_ads1220.set_conv_mode_continuous();
pc_ads1220.writeRegister(0x02, 0xD0);             // Register #2 (11 = analog supply reference,
                                                  //              01 = Simultaneous 50-Hz and 60-Hz rejection.
                                                  //               0 = Switch is always open (default)
                                                  //              000 = IDAC current setting Off (default)
pc_ads1220.Start_Conv();  //Start continuous conversion mode

}

void loop(){
while(true){
adc_data=pc_ads1220.Read_WaitForData();
float Vout = (float)((adc_data * VFSR * 1000)/FSR); //In mV
Serial.print("t = ");Serial.print(millis());Serial.print(" ms, V = ");Serial.print(Vout);Serial.println(" mV");
}
}`

@kutukvpavel
Copy link

kutukvpavel commented Oct 31, 2020

Well, I stumbled upon this strange design decision too (good thing I looked at the code before trying to use the lib). The "WaitForData" name of the functions is actually very misleading. Under the hood there's no wait cycle, just an if statement, that returns 0 if the data is not ready yet, so you are supposed to create your own wait cycle, kinda like:

ads1220.Start_Conv();
int32_t data;  
while ((data = ads1220.Read_WaitForData(), data) == 0);  
Serial.println(data);  

God knows why the developers have implemented it this way. The library in general looks unfinished, to say the least. For example, field "NewDataAvailable" is defined, but never used. There are nested includes (cpp file includes headers already included in the .h file...), they don't hurt, but are completely redundant.

Personally, since we have defined DRDY pin in our own code, I would've written the wait cycle like this (though _WaitForData starts to look even more WTFish here):

ads1220.Start_Conv();  
while(digitalRead(your_DRDY_definition_here));  
int32_t data = ads1220.Read_WaitForData();  
Serial.println(data);  

This library is more like a nice template you can start development with, that has all necessary constants declared and SPI mechanics hidden. But you'll still have to extend it.

Edit: I've looked some more into the lib, and it appears that all read functions, except the most basic Read_WaitForData, are just a copy/paste of the latter with minor modifications. Yeah, so don't expect them to work at all, at least out-of-the-box. Probably, I'll make a proper fork at some point, since I'm using ads1220 on an stm32-based board often.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants