Почему датчик работает нерегулярно?
Я пытаюсь подключить цифровой датчик 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 из регистров.
@rur2641, 👍6
Обсуждение2 ответа
Судя по вашему сообщению, похоже, что вы не подключили никаких оснований. Рассмотрите возможность подключения аналоговых и цифровых заземлений.
Вот выдержки из таблицы
Спасибо. Я забыл упомянуть, что я подключил землю. Но я не сделал этого ВССИО. Кто-то также предположил, что это связано с тем, что датчик работает на 3,3 В, а Arduino - на 5., @rur2641
Независимо от 3,3 В или 5 В GND равен 0 В. DGND и AGND внутренне изолированы. Таким образом, неустойчивое поведение можно объяснить плохим заземлением. Желаю удачи. Кстати, не задавайте перекрестных вопросов., @Mahendra Gunawardena
Это также может быть вызвано недостаточным или нерегулируемым электропитанием., @SDsolar
@Mahendra Gunawardena 6 VSSIO привязан к VSS через контактный разъем P1 6, @rur2641
Подключение небольшого керамического или электролитического конденсатора к силовой шине / может / помочь устранить проблему., @Avamander
Это плохой продукт, посмотрите на это: это точно описывает проблемы, с которыми вы (и я) сталкиваетесь. Поправьте меня, если вы уже нашли какие-либо решения.
Редактировать
Попробуйте посмотреть описание regster 0x2f в техническом описании и ответить на этот вопрос.
Я думаю, что первая проблема, которую вы описываете, может быть решена таким образом, второе поведение звучит так, как будто вы сожгли устройство.
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только для ссылок могут стать недействительными, если страница, на которую дана ссылка, изменится., @sempaiscuba
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- SRF04 Ультразвуковой датчик - неточные показания
Не могли бы вы показать некоторые результаты, которые вы получаете?, @Gerben
@Gerben Я обновил сообщение с выводами., @rur2641
Попробуйте добавить небольшую задержку после установки низкого значения контакта ChipSelect., @Gerben
@Gerben Это не сработало, выходные данные равны 0., @rur2641