Сигнал32
Сб 03 сентября 2016 г. 2:58 утра
Привет,
Я пытаюсь использовать DS1624 с STM32Duino на пользовательской плате, которая имеет STM32F103T8U6.
DS1624 подключен к STM32 через I2C с 10-километровыми резисторами.
Проблема, с которой у меня есть, заключается в том, что чтение температуры не является точным. Датчик реагирует температурой, но температура составляет 0xff 0x80 (255.50 C).
Я попробовал тот же код на Arduino Pro Micro (atmega32u4, в основном Леонардо), и код работает там.
Я думаю, что проблема заключается в инициализации чипа (функция initDs1624).
При отслеживании сигналов я вижу некоторые различия между STM32 и Atmega.
Вот изображение последовательности инициализации на STM32 против Atmega: (Полный размер)
Кто -нибудь знает, почему разница в формах волн I2C и как я смогу это исправить ?
Код:
Я пытаюсь использовать DS1624 с STM32Duino на пользовательской плате, которая имеет STM32F103T8U6.
DS1624 подключен к STM32 через I2C с 10-километровыми резисторами.
Проблема, с которой у меня есть, заключается в том, что чтение температуры не является точным. Датчик реагирует температурой, но температура составляет 0xff 0x80 (255.50 C).
Я попробовал тот же код на Arduino Pro Micro (atmega32u4, в основном Леонардо), и код работает там.
Я думаю, что проблема заключается в инициализации чипа (функция initDs1624).
При отслеживании сигналов я вижу некоторые различия между STM32 и Atmega.
Вот изображение последовательности инициализации на STM32 против Atmega: (Полный размер)
Кто -нибудь знает, почему разница в формах волн I2C и как я смогу это исправить ?
Код:
#include
#include
#define addr 0x4F
// For STM32, Serial1 is the one being used
#if !defined(__INTELLISENSE__) && defined(__STM32F1__)
#define Serial Serial1
#endif
#ifdef __STM32F1__
#define Wire HWire
#define LED PA1
#else
#define LED 15
#endif
#define CONTINUOUS_CONVERSION 0x00
#define CONVERT_T 0xEE
#define READ_T 0xAA
void InitDS1624()
{
Wire.beginTransmission(addr);
Wire.write(0xAC);
Wire.write(CONTINUOUS_CONVERSION); //Put the DS1624 in continuos conversion mode
Wire.endTransmission();
delay(100); //Min time needed to store the previous command is 10ms
Wire.beginTransmission(addr);
Wire.write(CONVERT_T); //Enable the continuos conversion mode
Wire.endTransmission();
}
float getTemp()
{
float temperature = 0;
int tempmsb = 0;
int templsb = 0;
int temp2 = 0;
Wire.beginTransmission(addr);
Wire.write(READ_T);
Wire.requestFrom(addr, 2);
if (Wire.available())
{
tempmsb = Wire.read();
}
if (Wire.available())
{
templsb = Wire.read();
}
temp2 = templsb >> 3;
temperature = (float(tempmsb) + (float(temp2) * 0.03125));
Wire.endTransmission();
return temperature;
}
void setup()
{
pinMode(LED, OUTPUT);
Wire.begin();
InitDS1624();
Serial.begin(9600);
}
void loop()
{
float temp = getTemp();
Serial.println(temp);
if (temp > 20 && temp < 50)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
delay(5);
}
Rogerclark
Сб 03 сентября 2016 г. 9:19
10 тыс. Вытягивающие резисторы
Это звучит слишком высоко для 3.3V Система.
Сигнал32
Сб 03 сентября 2016 г. 10:08
Rogerclark написал:Это звучит слишком высоко для 3.3V Система.
Rogerclark
Сб 03 сентября 2016 г. 10:09
Попробуйте использовать <Проволока.час> а не хардвор
Сигнал32
Сб 03 сентября 2016 г. 10:13
Rogerclark написал:Попробуйте использовать <Проволока.час> а не хардвор
Мадиас
Пн, 05 сентября 2016 12:29
HM, это странно.
Многие пользователи здесь (как и я) использовали программное обеспечение и вариант HW I2C. Вариант HW действительно не был закончен Leaflabs из -за проблем (я думаю, что аппаратная ошибка в ядре STM32F1 или что -то в этом роде) - но::
Как я уже говорил, многие из нас используют I2C без ошибок с более сложными/чувствительными модулями, такими как дисплеи.
К сожалению, я не владею DS1624, поэтому я не могу сравнить его с «обычной» платой STM32Duino, такой как Maple Mini Clone. Лично это будет моим следующим шагом: пытаюсь, если DS1624 работает с клоном Maple Mini (или что -то в этом роде) или пробует любое другое устройство I2C на вашей пользовательской плате. Следующей проблемой может быть использованный код . Похоже, он генерирует дополнительные данные на первом и последнем.
Вот общий пример набережного примеров:
http: // форумы.Leaflabs.com/форумы.лист ... л?ID = 74407
Может быть, старый форум Leaflabs может стать хорошим моментом для исследований I2C -задач.
Редактировать: Вот оригинальные документы Leaflabs о I2C:
http: // docs.Leaflabs.com/static.Leaflab ... я/i2c.HTML
Edit2:
Если вы повторяете последовательность I2C более 5 раз: всегда ли шипы в одном и том же положении?
Многие пользователи здесь (как и я) использовали программное обеспечение и вариант HW I2C. Вариант HW действительно не был закончен Leaflabs из -за проблем (я думаю, что аппаратная ошибка в ядре STM32F1 или что -то в этом роде) - но::
Как я уже говорил, многие из нас используют I2C без ошибок с более сложными/чувствительными модулями, такими как дисплеи.
К сожалению, я не владею DS1624, поэтому я не могу сравнить его с «обычной» платой STM32Duino, такой как Maple Mini Clone. Лично это будет моим следующим шагом: пытаюсь, если DS1624 работает с клоном Maple Mini (или что -то в этом роде) или пробует любое другое устройство I2C на вашей пользовательской плате. Следующей проблемой может быть использованный код . Похоже, он генерирует дополнительные данные на первом и последнем.
Вот общий пример набережного примеров:
http: // форумы.Leaflabs.com/форумы.лист ... л?ID = 74407
Может быть, старый форум Leaflabs может стать хорошим моментом для исследований I2C -задач.
Редактировать: Вот оригинальные документы Leaflabs о I2C:
http: // docs.Leaflabs.com/static.Leaflab ... я/i2c.HTML
Edit2:
Если вы повторяете последовательность I2C более 5 раз: всегда ли шипы в одном и том же положении?
Эдогальдо
Пн сентября 05, 2016, 14:59
@Signal32: какую плату STM вы используете?
Разве это не может быть светодиодный штифт?
В вашем эскизе я вижу:
Разве это не может быть светодиодный штифт?
В вашем эскизе я вижу:
#define LED 15
Мадиас
Пн, 05 сентября 2016 г., 15:49
Эдогальдо написал:@Signal32: какую плату STM вы используете?
Разве это не может быть светодиодный штифт?
В вашем эскизе я вижу:
Разве это не может быть светодиодный штифт?
В вашем эскизе я вижу:
#define LED 15
Эдогальдо
Пн, 05 сентября 2016 г., 15:55
Но, может быть, #ifdef, наверное, не сработает...
Это зависит от вариантов компиляции..
Racemaniac
Пн, 05 сентября 2016 г., 15:59
В своих проектах я также сделал несколько очень мощных вещей, используя аппаратный i2c, так что, по крайней мере, можно использовать и известно, что он работает.
И если это программное обеспечение I2C, которое вы используете, то это не может быть проблемой Maple Mini, так как мы можем быть уверены, что базовые манипуляции с портами работают >_<.
И если это программное обеспечение I2C, которое вы используете, то это не может быть проблемой Maple Mini, так как мы можем быть уверены, что базовые манипуляции с портами работают >_<.
Мадиас
Пн сентября 05, 2016, 16:00
ОК, просто дальнейшее размышление:
Использование «int» в качестве общей переменной (и дополнительного переключения битов, как в этом коде), не лучший способ справиться с AVR и кодом ARM, потому что:
На avr int = int16_t
на руке int = int32_t
Возможно (или наверняка) это не будет проблемой здесь, но я всегда использую строго определенные переменные (например, int16_t), так как я написал код для обеих платформ.
Использование «int» в качестве общей переменной (и дополнительного переключения битов, как в этом коде), не лучший способ справиться с AVR и кодом ARM, потому что:
На avr int = int16_t
на руке int = int32_t
Возможно (или наверняка) это не будет проблемой здесь, но я всегда использую строго определенные переменные (например, int16_t), так как я написал код для обеих платформ.
Сигнал32
Пн, 05 сентября 2016 г., 16:04
Я сделаю клон Maple Mini.
Что касается светодиода, это не проблема. Я уверен, что это #ifdef __stm32f1______ взят (я вставил случайный текст внутри, чтобы увидеть, вызывает ли он ошибки) плюс я попробовал несколько вариантов без светодиодного кода и без последовательного.
Если я сделаю петлю инициатора1624, шипы находятся в одном и том же положении, все последовательно.
Обратите внимание, что первый всплеск возникает до начала i2c.
Я также попробую аппаратный сериал с Maple Mini, чтобы увидеть, работает ли он.
Да, я знал о разнице в размере размера 2/4 байта и не думаю, что это проблема здесь.
Что касается светодиода, это не проблема. Я уверен, что это #ifdef __stm32f1______ взят (я вставил случайный текст внутри, чтобы увидеть, вызывает ли он ошибки) плюс я попробовал несколько вариантов без светодиодного кода и без последовательного.
Если я сделаю петлю инициатора1624, шипы находятся в одном и том же положении, все последовательно.
Обратите внимание, что первый всплеск возникает до начала i2c.
Я также попробую аппаратный сериал с Maple Mini, чтобы увидеть, работает ли он.
Да, я знал о разнице в размере размера 2/4 байта и не думаю, что это проблема здесь.
Эдогальдо
Пн, 05 сентября 2016 г., 16:09
Итак, суммируя это только чтения I2C, которые различаются, правильно?
Можете ли вы опубликовать схемы сравнения чтения?
Можете ли вы опубликовать схемы сравнения чтения?
Мадиас
Пн, 05 сентября 2016 г., 17:46
Ваш #Define Wire Hwire действительно странный. В папке библиотеки I2C есть два примера кода, один для Hwire, и один для Softwire вы должны взглянуть на них.
Сигнал32
Вторник 06 сентября 2016 г. 3:52 утра
Мадиас написал:Ваш #Define Wire Hwire действительно странный. В папке библиотеки I2C есть два примера кода, один для Hwire, и один для Softwire вы должны взглянуть на них.
Эдогальдо
Вторник 06 сентября 2016 г. 6:35 утра
@Signal32,
Ваши температурные чтения FF 80, верно? Если да, исходя из таблицы, это будет означать температуру -0.5с.
Кстати, на основе таблицы, мне кажется, что вы читаете данные в неправильном порядке, должен быть правильный порядок:
1. LSB
2. MSB
Моя ошибка, заказ данных кажется правильным, но число должно быть интерпретировано как целое число комплемента, поэтому FF --1
Лучший, e.
Ваши температурные чтения FF 80, верно? Если да, исходя из таблицы, это будет означать температуру -0.5с.
Кстати, на основе таблицы, мне кажется, что вы читаете данные в неправильном порядке, должен быть правильный порядок:
1. LSB
2. MSB
Моя ошибка, заказ данных кажется правильным, но число должно быть интерпретировано как целое число комплемента, поэтому FF --1
Лучший, e.
Мадиас
Вторник 06 сентября 2016 г., 7:01
Пожалуйста, распечатайте на обеих платформах (AVR и STM32) значения MSB и LSB отдельно. Я подозреваю ошибку здесь.
Стивестронг
Вторник 06 сентября 2016 г., 7:03 утра
Signal32 написал:
Обратите внимание на красные треугольники:
Сигнал32
Вторник 06 сентября 2016 г. 7:05 утра
Мадиас написал:Пожалуйста, распечатайте на обеих платформах (AVR и STM32) значения MSB и LSB отдельно. Я подозреваю ошибку здесь.
Стивестронг
Вторник 06 сентября 2016 г., 7:12 утра
Когда показания идентичны, разница может быть только интерпретациями чтения данных, как сказал Эдогальдо. Эндианесс?
Эдогальдо
Вторник 06 сентября 2016 г., 7:13 утра
Вы проверяли значения регистров конфигурации?
Кстати, вы используете один и тот же чип с обеими платформами, а не с двумя разными чипами, верно?
Кстати, вы используете один и тот же чип с обеими платформами, а не с двумя разными чипами, верно?
Сигнал32
Вторник 06 сентября 2016 г., 7:15 утра
Стивестронг написал:Когда показания идентичны, разница может быть только интерпретациями чтения данных, как сказал Эдогальдо. Эндианесс?
Сигнал32
Сб 10 сентября 2016 г. 8:18 утра
Нашел проблему.
Это была не последовательность инициализации. Кажется, в коде провода есть ошибка ... возможно ?
Следующий код - это тот, который имеет проблему:
Это была не последовательность инициализации. Кажется, в коде провода есть ошибка ... возможно ?
Следующий код - это тот, который имеет проблему:
Wire.beginTransmission(0x4F);
Wire.write(0xAA);
Wire.requestFrom(0x4F, 2);
tempmsb = Wire.read();
templsb = Wire.read();
Wire.endTransmission();
Пито
Сб 10 сентября 2016 г. 10:30 утра
Дважды проверьте, что говорит таблица данных - стр. 11 - Чтение температуры..
Сигнал32
Сб 10 сентября 2016 г. 16:35
Пито написал:Дважды проверьте, что говорит таблица данных - стр. 11 - Чтение температуры..
Пито
Сб 10 сентября 2016 г. 16:44
Мой опыт работы с различными LIBS i2.
В таблице данных говорится:
В таблице данных говорится:
Wire.beginTransmission(0x4F);
Wire.write(0xAA);
// Wire.endTransmission(0x4F); // I need to add a endTransmission and an beginTransmission here
Wire.beginTransmission(); // After this the code will work
Wire.requestFrom(0x4F, 2);
tempmsb = Wire.read();
templsb = Wire.read();
Wire.endTransmission();