Чтение ADS1232 с помощью Arduino
Я новичок и пытаюсь прочитать ADS1232 с помощью Arduino для проекта весов.
Я читаю данные через интерфейс SPI, но не получаю результат.
#include <SPI.h>
#define MISOPIN 50 //ДАННЫЕ
#define SCLKPIN 52 //SCLK
#define PDWN 53 // СС
#define SPEED 5
#define GAIN0 7
#define GAIN1 6
#define CLKIN 10
#define A0 9
#define TEMP 8
uint32_t byte1;
uint32_t byte2;
uint32_t byte3;
uint32_t finaladc = 0;
void setup() {
// поместите сюда свой код установки для однократного запуска:
Serial.begin(9600);
pinMode(PDWN, OUTPUT);
pinMode(MISOPIN, INPUT);
pinMode(SCLKPIN, OUTPUT);
pinMode(SPEED, OUTPUT);
pinMode(GAIN0, OUTPUT);
pinMode(GAIN1, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(TEMP, OUTPUT);
digitalWrite(GAIN0, HIGH);
digitalWrite(GAIN1, HIGH);
digitalWrite(SCLKPIN, LOW);
digitalWrite(A0, LOW);
digitalWrite(TEMP, LOW);
digitalWrite(SPEED, HIGH);//0--> 10СПС, 1 -->80СПС
digitalWrite(PDWN, HIGH); //0--> ВЫКЛЮЧЕНИЕ ПИТАНИЯ (СПИННЫЙ РЕЖИМ - БЕЗ ПРЕОБРАЗОВАНИЯ), 1 --> РАБОЧИЙ РЕЖИМ
reset_adc();
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1);
digitalWrite(SCLKPIN,LOW);
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
if (digitalRead(MISOPIN)== LOW) read_adc();
delay(1000);
}
void reset_adc() {
digitalWrite(SCLKPIN,HIGH);
delayMicroseconds(1400);
}
void read_adc() {
drdy_wait();
uint8_t i;
finaladc = SPI.transfer(0xff);
finaladc |= (uint32_t)SPI.transfer(0xff) << 8;
finaladc |= (uint32_t)SPI.transfer(0xff) << 16;
Serial.print ("ADC_value: ");
Serial.println(finaladc,DEC);
Serial.println();
}
void drdy_wait()
{
delayMicroseconds(30);
}
Кто-нибудь работал с этим? Вы можете помочь мне? Спасибо
@Thanh Van, 👍0
Обсуждение1 ответ
Я выловил код, который написал некоторое время назад, оценивая 1232. SPI — это головная боль из-за необходимости переключать тактовый сигнал, чтобы предотвратить «залипание» последнего бита данных, что приведет к сбою повторных операций чтения при получении последних данных. бит высокий.
Если вам абсолютно необходимо использовать SPI, прекратите читать этот ответ.
Все, что вам нужно знать, находится на страницах 18 и 19 технического описания ADS1232. Обратите внимание, что это исключительно демонстрационный материал, например, он не учитывает время стабилизации при переключении каналов.
int32_t read_adc(const uint16_t wait_millis) {
int32_t data = 0;
// сброс АЦП
digitalWrite(ADS1232_PDWN, LOW);
delayMicroseconds(10);
digitalWrite(ADS1232_PDWN, HIGH);
delayMicroseconds(10);
for (; data < wait_millis && digitalRead(ADS1232_DRDY_DOUT) != LOW;
delay(1),
data++);
if (data == wait_millis) {
// тайм-аут
return -1;
}
// чтение в 24 битах, см. страницу 19 таблицы данных
data = 0;
for (uint8_t i = 0; i < 24; i++) {
digitalWrite(ADS1232_CLK, HIGH); // тактируем следующий бит данных
data <<= 1;
data |= digitalRead(ADS1232_DRDY_DOUT);
digitalWrite(ADS1232_CLK, LOW);
}
// корректируем знак. См. стр. 18 таблицы данных.
if (data & 0x00800000)
data |= 0xFF000000;
// избегаем того, чтобы DRDY/DOUT оставались в состоянии последнего бита
// см. стр. 19 таблицы данных
digitalWrite(ADS1232_CLK, HIGH);
delayMicroseconds(10);
digitalWrite(ADS1232_CLK, LOW);
return data;
}
Спасибо!! Рамблин Роуз!! Я постараюсь ответить вам, @Thanh Van
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Путаница между SPI и I2C для SSD1306 OLED
Добро пожаловать в stackexchange. Не могли бы вы показать свой код, пожалуйста? Без этого трудно распознать проблемы., @smajli
Это здесь [Google](https://drive.google.com/open?id=1v2XJuCeoCvwjLOKwnfEhqoh3d_aJG9dk), @Thanh Van
у ADS1232 нет SPI, @Juraj
Я использовал SPI с ADS1232. У вас много проблем, но первая из них заключается в том, что ваш reset_adc() неправильный, среди прочего сброс осуществляется путем понижения уровня вывода PWDN более чем на 10 мкс. Начните там., @RamblinRose