Почему датчик работает нерегулярно?

Я пытаюсь подключить цифровой датчик ADXL355 к Arduino. Проводка и код, я думаю, в порядке, потому что система иногда возвращает правильные значения и в основном частично правильные ответы. Код проверяет регистр устройства, и правильные данные большую часть времени печатаются в serial. Код также проверяет температуру, но только изредка возвращает правильное значение. Значения опрашиваются каждые несколько секунд. Значения всегда верны, если они верны в первый раз после перезапуска, но никогда, если они неверны при перезапуске. Я подумал, что это может помочь отключить датчик при загрузке программы или включении Arduino через USB на компьютер, но четкой схемы нет.

Это не неисправный датчик, потому что у меня есть 2, которые ведут себя одинаково. В чем может быть проблема? Это проблема с Arduino?

Я подключаю только VDD, VDDIO, ground, chip select, sclk, MOSI и MISO.

код:

#include <SPI.h>

    const int ID = 0x00;
    const int FIFO = 0x11;
    const int TEMP = 0x06;
    const int TEMP1 = 0x07;
    const byte FIFO_WATERMARK = 0x29;
    const int chipSelectPin = 7;


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

        SPI.begin();

        pinMode(dataReadyPin, INPUT);
        pinMode(chipSelectPin, OUTPUT);

        // запись 0 для включения датчика
        writeRegister(0x2D, 0x00);

        delay(100);

        Serial.println(readRegister(ID));
        Serial.println(readRegister(FIFO_WATERMARK));
    }

    void loop() {
        int temp = (readRegister(TEMP)); // << 8) | ( readRegister(TEMP1))) ;
        temp = (temp<<8)|(readRegister(TEMP1));
        Serial.println(((1852 - temp)/9.05) + 19.21);
        Serial.println(readRegister(ID));

        delay(1000);
    }

    byte readRegister (byte thisRegister){
        byte inByte = 0 ;
        SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); // цифровая запись тактовой
        digitalWrite(chipSelectPin, LOW);
        SPI.transfer((thisRegister << 1) | 1);
        inByte = SPI.transfer(0x00);
        digitalWrite(chipSelectPin, HIGH);
        return inByte;
    }
    void writeRegister (byte thisRegister, byte value){
        SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); // цифровая запись тактовой
        digitalWrite(chipSelectPin, LOW);
        SPI.transfer(thisRegister << 1);
        SPI.transfer(value);
        digitalWrite(chipSelectPin, HIGH);
    }

Кто-то предположил, что это может быть отскок сигнала на SPI, и тактовая частота была установлена на 500 кГц, но это не сработало.

Обновление:
Не так давно правильный идентификатор устройства считывался последовательно (173 для 0xAD); теперь это возвращает 0. Температура будет либо возвращать 0 из регистра, либо изменять значения между -1 и -5, которые, возможно, были неправильно откалиброваны температурой. Но иногда правильная температура возвращалась. Теперь он также возвращает только 0 из регистров.

, 👍6

Обсуждение

Не могли бы вы показать некоторые результаты, которые вы получаете?, @Gerben

@Gerben Я обновил сообщение с выводами., @rur2641

Попробуйте добавить небольшую задержку после установки низкого значения контакта ChipSelect., @Gerben

@Gerben Это не сработало, выходные данные равны 0., @rur2641


2 ответа


1

Судя по вашему сообщению, похоже, что вы не подключили никаких оснований. Рассмотрите возможность подключения аналоговых и цифровых заземлений.

ADXL355 Grounds

Вот выдержки из таблицы

ADXL355 Ground Pins

,

Спасибо. Я забыл упомянуть, что я подключил землю. Но я не сделал этого ВССИО. Кто-то также предположил, что это связано с тем, что датчик работает на 3,3 В, а Arduino - на 5., @rur2641

Независимо от 3,3 В или 5 В GND равен 0 В. DGND и AGND внутренне изолированы. Таким образом, неустойчивое поведение можно объяснить плохим заземлением. Желаю удачи. Кстати, не задавайте перекрестных вопросов., @Mahendra Gunawardena

Это также может быть вызвано недостаточным или нерегулируемым электропитанием., @SDsolar

@Mahendra Gunawardena 6 VSSIO привязан к VSS через контактный разъем P1 6, @rur2641

Подключение небольшого керамического или электролитического конденсатора к силовой шине / может / помочь устранить проблему., @Avamander


2

Это плохой продукт, посмотрите на это: это точно описывает проблемы, с которыми вы (и я) сталкиваетесь. Поправьте меня, если вы уже нашли какие-либо решения.

Редактировать

Попробуйте посмотреть описание regster 0x2f в техническом описании и ответить на этот вопрос.
Я думаю, что первая проблема, которую вы описываете, может быть решена таким образом, второе поведение звучит так, как будто вы сожгли устройство.

,

Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только для ссылок могут стать недействительными, если страница, на которую дана ссылка, изменится., @sempaiscuba