Ультразвуковой расходомер с использованием 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)
Любая помощь приветствуется!
@DYN, 👍6
Обсуждение0
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Вы решили свою проблему? Мне также интересно прочитать результат TDC GP22., @Tom
Я работал с GP22. Мне было интересно, заставляли ли вы когда-нибудь работать свою. Я знаю, что в техническом описании сказано генерировать стартовый и стоп-импульс через контакты старта и стопа, это путь, по которому я пошел. Мне интересно, добились ли вы какого-либо прогресса с момента вашего последнего поста об этом?, @Digit