HX711 Смешные скорости

Я использую плату SparkFun HX711 и перьевую плату Adafruit AdaLogger (M0). Я сократил трассировку на задней панели HX711, чтобы получить более быструю скорость передачи данных (должно быть около 80 sps). Я сделал это, просмотрев спецификацию и подтвердив этот пост (ссылка Github для более быстрых ставок).

Прежде чем я прочитаю с платы, я получаю startTime от micros (), и сразу же после того, как я получу данные шкалы, я снова вызываю micros() и записываю конечное время. Затем я записываю эти данные вместе с данными ячейки загрузки на SD-карту. Затем, чтобы проверить время, после завершения эксперимента в excel я беру 1/((EndTime - startTime)*10^-6), чтобы получить приблизительное количество образцов в секунду.

Моя проблема в том, что, по-видимому, я записываю максимум около 6000 SPS, но обычно около 600 SPS. Что было бы потрясающе, если бы я не был так уверен, что это ложь. Я надеялся, что кто-нибудь может взглянуть и увидеть, что я делаю не так? Я использовал этот же код на другом M0 с немодифицированным HX711 и получал около 10 SPS. Единственное, что отличалось (я думал), это вырезание следа на задней части платы, чтобы включить более высокую скорость.

В ссылке GitHub выше они упоминают, что вы можете получить более высокую скорость, если вы соедините более быстрый кристалл с колпачком, чтобы соединить контакты 13 и 14. Я не делал этого, но, возможно, более быстрый процессор на Пере может играть какую-то роль в этом?

VCC и VDD подключены к 3,3 В, а GND-к заземляющему штифту на пере. Штифт 11 подключен к DAT, а штифт 10-к CLK

#include <SPI.h>
#include <SD.h>
#include "HX711.h"

#define FILE_BASE_NAME "FAST" // max six characters
#define DOUT_one 11   // Red 
#define CLK_one  10   // Orange 

const uint8_t CS_PIN = 4;
const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;

char fileName[] = FILE_BASE_NAME "00.csv";

float calibration_factor_one = -7050; // needs to be calibrated still

File file;

long startTime=0;
long endTime =0;

String dataString = "";

double scale_one_value = 0.0;

HX711 scale_one;

void SetUpSDCard(){
  if (!SD.begin(CS_PIN)) {
    Serial.println(F("begin failed"));
    return;
    }
   while (SD.exists(fileName)) {
    if (fileName[BASE_NAME_SIZE + 1] != '9') {
      fileName[BASE_NAME_SIZE + 1]++;
    } else if (fileName[BASE_NAME_SIZE] != '9') {
      fileName[BASE_NAME_SIZE + 1] = '0';
      fileName[BASE_NAME_SIZE]++;
    } else {
      Serial.println(F("Can't create file name"));
      return;
    }
  }
   file = SD.open(fileName, FILE_WRITE);
  if (!file) {
    Serial.println(F("open failed"));
    return;
  }
  Serial.print(F("opened: "));
  Serial.println(fileName);
  }

void SetUpLoadCell(){
  Serial.println("Remove all weight from scale");  
  scale_one.begin(DOUT_one, CLK_one);
  scale_one.set_scale();
  scale_one.tare(); 

  long zero_factor_one = scale_one.read_average(); //Get a baseline reading
  Serial.print("Zero factor: "); 
  Serial.println(zero_factor_one);
  Serial.println("Load cell one initialized");
  scale_one.set_scale(calibration_factor_one); //Adjust to this calibration factor
  }

void LogData(){
  startTime= micros();
  scale_one_value = scale_one.get_units();
  endTime = micros();

  dataString = String(startTime) + "," + String(scale_one_value) + "," + String(endTime);
  file.println(dataString);
  file.flush();
  }

void setup() {
  Serial.begin(9600);
  SetUpSDCard();
  Serial.println("Remove all weight from scale");
  SetUpLoadCell();
}

void loop() {
  LogData();
}

Тогда сохраненные данные, которые находятся на SD-карте, выглядят следующим образом, это всего лишь первые 20 строк.

3383895,    0,      3384049
3401786,    0,      3401938
3411851,    0,      3412004
3421850,    -0.02,  3422004
3432012,    -0.03,  3432164
3442074,    0.01,   3442226
3452118,    0,      3452269
3462299,    0,      3462450
3472441,    0.03,   3473497
3483434,    0.03,   3485070
3495011,    0.02,   3496638
3506580,    0.01,   3508211
3518576,    0.03,   3519785
3529783,    0.02,   3531353
3541282,    0,      3542924
3552831,    0,      3554495
3564476,    0,      3566070
3575900,    0.01,   3577638
3587476,    -0.01,  3589209
3599068,    -0.03,  3600782

, 👍1


2 ответа


Лучший ответ:

2

Вы не измеряете, сколько образцов вы делаете за секунду, вместо этого вы измеряете время, необходимое для извлечения одного образца из HX711.

Вы сохраняете время, извлекаете следующий образец, а затем снова сохраняете время. Затем вы проводите сравнительный возраст хранения этих данных на SD-карте, в течение которого HX711 берет любое количество других образцов. К тому времени, когда вы в конечном итоге снова приступите к чтению из HX711, он уже готов дать вам образец.

Вам нужно учитывать количество времени, которое требуется для записи на SD - карту, чтобы получить какие-либо значимые результаты-то есть общее количество времени, которое требуется для выполнения цикла (), или более просто: сколько времени прошло с момента последнего запуска функции LogData ().

Фактическое время выборки HX711, вероятно, будет бледнеть в незначительности по сравнению со всем остальным вашим последовательным кодом.

,

о боже. lmao. Да.. Именно это и происходит! Я чувствую себя идиотом, ха-ха-ха, @Diesel


0

Чтобы измерить частоту выборки данных, измерьте время, затраченное на заполнение массива 10 (а еще лучше — 100) измерениями.

N = 100;
t0 = millis();
for (i=0; i<N; i++){
    s[i] = get_sample();
}
samplingTime = (millis()-t0)/N; 
,

Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, [измените], чтобы добавить дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа . Дополнительную информацию о том, как писать хорошие ответы, вы можете найти [в справочном центре](/help/how-to-ответ)., @Community