Easyelectronics.ru

Электроника для всех
Текущее время: 22 июн 2018, 12:23

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
 Заголовок сообщения: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 12:20 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
Здравствуйте.
Подключил датчик к STM32.
Регистры записывает/читает все хорошо.

Но когда считываю температуру то показания какие то странные.
При нагревании датчика значение температуры падают.
Просто считываю значения из ячейки температуры (без деления на коэффициенты и тд)

Так и должно быть ? Или он вообще не показывает температуру, а это некое значение для термостабилизированных показаний давления ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 14:18 
Только пришел

Зарегистрирован: 06 июн 2018, 14:12
Сообщения: 6
Может дело в дополнении до двух.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 14:50 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
T_shift?
Note: Must be set to '1' when the oversampling rate is >8 times

я пробовал и с rate меньше 8. тоже самое

Или Вы о чем то другом ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 15:15 
Только пришел

Зарегистрирован: 06 июн 2018, 14:12
Сообщения: 6
https://en.wikipedia.org/wiki/Two%27s_complement


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 15:17 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
И причем тут этот датчик и то что Вы прислали ?
в даташите на датчик не сказано дополнить полученные данные


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 15:26 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 661
r0cket писал(а):
И причем тут этот датчик и то что Вы прислали ?
в даташите на датчик не сказано дополнить полученные данные

Да ладно? А может кто-то не читал даташит. Черным по белому написано:
Цитата:
The Temperature Data registers contain the 24 bit (3 bytes) 2's complement temperature measurement value ( unless the FIFO is enabled, please see FIFO operation ) and will not be cleared after the read.


PS: А еще там сказано, что надо регистры коэф. поправки читать и применять поправку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 15:31 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
Извиняюсь. Первый раз вижу такое "2's complement".
Да. Про поправки читал.

Спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 15:38 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 661
Как-то так:
Код:
#define C 0b10000000

int8_t b1;
b1 = (C ^ readReg()) + C;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 06 июн 2018, 16:16 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
Это не решило моего вопроса.

Traw = getTemperature(); // 24bit two's complement value out of reg 3-5
if (Traw > 8388607u) // convert to signed int (Traw > (pow(2, 23) - 1))
{
Traw = Traw - 16777216u; //Traw - pow(2, 24)
} такая логика преобразования в примере

Я считываю значение меньше 8388607. Значит это уже правильное значение температуры.
И когда я нагреваю датчик, это значение еще и падает.

Или ноль это 2 в 24 ? и все что меньше идет в плюс, а все что больше в минус ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 14:45 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
NStorm писал(а):
Как-то так:
Код:
#define C 0b10000000

int8_t b1;
b1 = (C ^ readReg()) + C;


Сделал так. Все равно при нагреве показания датчика уменьшаются


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 15:35 
Только пришел

Зарегистрирован: 06 июн 2018, 14:12
Сообщения: 6
А конкретнее? "Чистые" трехбайтные значения разных температур для примера есть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 16:23 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
force_major писал(а):
А конкретнее? "Чистые" трехбайтные значения разных температур для примера есть?


делаю так
Код:
spi_send(0x0C);
sendData = spi_send( 0x09); //ресет

spi_send(0x07); // настройка регистра температуры
sendData = spi_send( 0x00);

spi_send(0x08); // MEAS_CFG
sendData = spi_send( 0x00);

spi_send(0x09); // CFG_REG
sendData = spi_send( 0x00);

spi_send(0x08); //преобразовать температуру
sendData = spi_send( 0x02);

while (1)
{
spi_send(0x88); //ждем TMP_RDY (COEF_RDY и SENSOR_RDY к этому моменту равны 1)
sendData = spi_send( 0xaa);
}

         spi_send(0x83); //читаем 3 регистра
         register0 = spi_send( 0xaa);
         spi_send(0x84);
         register1 = spi_send( 0xaa);
         spi_send(0x85);
         register2 = spi_send( 0xaa);

         test_p=(uint32_t)(register0<<16 | register1<<8 | register2);
         b1 = (C ^ test_p) + C;

         Traw_sc = (float)test_p / 524288;
         Traw_sc1 = (float)b1 / 524288;




в итоге чистые данные в регистрах получаются

register0 = 1 всегда
register1 = ~200 всегда
register2 = ~200 при комнатной температуре и падает если держаться за него рукой

Грел датчик феном - тогда уменьшается и register1 тоже


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 16:56 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 661
Для 3 байт #define C 0x800000

EDIT:
Цитата:
register0 = 1 всегда
register1 = ~200 всегда
register2 = ~200 при комнатной температуре и падает если держаться за него рукой

Что-то вы не то читаете видимо, раз MSB (register0) не меняется при нагреве. Проверьте адреса регистров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 17:20 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
The highest byte of the three bytes measured temperature value.
TMP_B2 Address: 03H
для чтения 7 бит ставлю 1 и получаю 83 84 85 это я читаю 3 4 и 5 регистры

spi_send(0x83); //читаем 3 регистра
register0 = spi_send( 0xaa);
spi_send(0x84);
register1 = spi_send( 0xaa);
spi_send(0x85);
register2 = spi_send( 0xaa);

С сразу исправил для 3 байт до такого вида
#define C 0b100000000000000000000000


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 17:38 
Только пришел

Зарегистрирован: 06 июн 2018, 14:12
Сообщения: 6
Я конечно не силен но
spi_send(0x08); //преобразовать температуру
sendData = spi_send( 0x02);
это вроде по запросу(один раз),а
110 - Continous temperature measurement
это вроде само.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 18:02 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 661
Да вроде адреса правильные. Может в функции spi_send() дело?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 07 июн 2018, 18:19 
Только пришел

Зарегистрирован: 06 июн 2018, 14:12
Сообщения: 6
Всмысле вроде правильнее
spi_send(0x08); //преобразовать температуру
sendData = spi_send( 0x06);

Command Mode
- One temperature or pressure measurement is performed according to the selected precision.
- The sensor will return to Standby Mode when the measurement is finished, and the measurement result
will be available in the data registers.
Background Mode
- Pressure and/or temperature measurements are performed continuously according to the selected
measurement precision and rate. The temperature measurement is performed immediately aȇer the
pressure measurement.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 08 июн 2018, 11:25 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
spi send вроде стандартная
Код:
uint8_t spi_send (uint8_t data)
{
  while (!(SPI1->SR & SPI_SR_TXE));     
  SPI1->DR = data;                     
  while (!(SPI1->SR & SPI_SR_RXNE));   
  return (SPI1->DR);               
}



а температуру я преобразовываю по запросу. потом жду флага завершения преобразования. и потом уже считываю данные


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 08 июн 2018, 14:08 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 661
r0cket писал(а):
b1 = (C ^ test_p) + C;

Так не получится кстати. Потому что переменная 32-битная, а значение 24-битное. Не произойдет переполнения, чтобы получать отрицательные значения.
Надо вот так тогда делать:
Код:
    int32_t test_p;
...
    if(test_p & ((uint32_t)1 << 23))
    {
        test_p -= (uint32_t)1 << 24;
    }


Но всё-равно надо еще читать коэф. и по формуле дальше считать видимо. Т.к. в 24-битном 2's максимальное положительное значение - 0x7FFFFF (127,255,255 по байтам). Это будет 16, если разделить на коэф. 524288, явно не максимально допустимая температура.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 08 июн 2018, 14:29 
Старожил

Зарегистрирован: 28 ноя 2013, 14:12
Сообщения: 231
В примере так сделано.

Код:
Traw = getTemperature();   // 24bit two's complement value out of reg 3-5
if (Traw > 8388607u)   // convert to signed int (Traw > (pow(2, 23) - 1))
{
Traw = Traw - 16777216u;   //Traw - pow(2, 24)
}


А дальше по формуле с коэффициентами полученные значения для регистров всегда в числителе.
Так что непонятно как уменьшая значения в регистрах будет увеличиваться реальная температура.

Какой то засадный датчик


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 09 июн 2018, 00:49 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 661
Тоже самое, что я написал.
А коэф. какие считываются всё-таки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: dps310 датчик давления и температуры
СообщениеДобавлено: 09 июн 2018, 12:18 
Только пришел

Зарегистрирован: 06 июн 2018, 14:12
Сообщения: 6
id правильно читается? что записано в TMP_COEF_SRCE(7)?
И правильно ли spi send дрыгает ногой CS?
Я языков и реализаций не знаю, но смущает
spi_send(0x83(b10000011)); //читаем 3 регистра
register0 = spi_send( 0xaa(b10101010));


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB