Ультразвуковой расходомер с использованием TDC-GP22 и Arduino Uno

Я работаю над проектом ультразвукового расходомера с TDC-GP22 с использованием Arduino UNO. Я использовал библиотеку leokoppel

.

В моем коде конфигурации регистров копируются из Примечание по применению GP22, со страницы 22 на страницу 25. Я не использовал датчик температуры, поэтому пропустил шаги, связанные с этим. Калибровки тоже нет. Я просто хочу получить некоторые результаты времени полета, чтобы иметь возможность рассчитать расстояние между двумя датчиками на данный момент.

Мой код для теста:

#include "GP22.h"
#include <SPI.h>
#include <avr/io.h>

/*
 *  
 * Test setup (Arduino Uno, through 5->3.3V level shift)

 *     10 -> SS 
 *     11 -> MOSI
 *     12 -> MISO
 *     13 -> SCK
 *     2  -> INT
 *     5V -> VCC
 *     GND -> GND
 *     4 -> DS18B20 temperature sensor (optional)
 */

const bool DEBUG = 1;
const int FAST_MODE = 1;
const int PIN_INT = 2;

GP22 tdc(PIN_INT, DEBUG);

float cycleFactor_ns = 0; 

void setup() {

  Serial.begin(115200);
  Serial.println("Go !");

  tdc.init();

  tdc.writeRegister(0, 0x430BE800);
  tdc.writeRegister(1, 0x21444000);
  tdc.writeRegister(2, 0xA0138800);
  tdc.writeRegister(3, 0xD0A24800);
  tdc.writeRegister(4, 0x10004000);
  tdc.writeRegister(5, 0x40000000);
  tdc.writeRegister(6, 0xC0C06100);

  tdc.printConfigRegisters(); 

  byte a = tdc.readRegister(READ_REG_1);             

  Serial.println(a,HEX);
  Serial.println("Test communication: ");
  Serial.print(tdc.testCommunication());
 }  

void loop() {

  tdc.sendOpcode(OPCODE_INIT);
  tdc.sendOpcode(OPCODE_START_TOF_RESTART);
  tdc.waitForInterrupt(10000000);

  delay(20);

  Serial.println(tdc.readRegister(READ_RES_3),HEX);
}

С помощью осциллографа я получил правильное количество огненных импульсов (20) с правильной частотой (1 МГц): Сигнал (синий - сигнал передатчика до усиления, зеленый - после усиления, желтый - сигнал получателя)

Но что я понял из кода:

Идти !

прикрепленный пинChangeISR_debug

Регистр 0: 0x430be800

Регистр 1: 0x21444000

Регистр 2: 0xa0138800

Регистр 3: 0xd0a24800

Регистр 4: 0x10004000

Регистр 5: 0x40000000

Регистр 6: 0xc0c06100



21

Тестовая связь:

/ Тест занял 180 мс

1

69978000

69978000

69978000

69978000

69978000

69978000

69978000

...

21 — это первый байт регистра 1, а 1 — это результат функции testcommunication(). Эти два средства означают, что проверка связи прошла успешно. Но результаты чтения RES_3 всегда одни и те же, а waitForInterrupt() не работает (возможно, код не должен так писаться) -- тайм-аут все время.

Конечно, я ожидаю, что результат может меняться при каждом измерении (невозможно все время получать точно одинаковые измерения ToF)

Любая помощь приветствуется!

, 👍6

Обсуждение

Вы решили свою проблему? Мне также интересно прочитать результат TDC GP22., @Tom

Я работал с GP22. Мне было интересно, заставляли ли вы когда-нибудь работать свою. Я знаю, что в техническом описании сказано генерировать стартовый и стоп-импульс через контакты старта и стопа, это путь, по которому я пошел. Мне интересно, добились ли вы какого-либо прогресса с момента вашего последнего поста об этом?, @Digit