Подключение NTC-термисторов на шину 1Wire как и DS18B20
Dry Gin
Профессор
Котобург
12.2K 2K
Отв.60 26 Окт. 23, 19:32
Я помню времена, не так давно, кстати, когда в массовых смартфонах были матрицы 2-4 мегапикселя. А когда Nokia предложила 50 Mpx, все говорили, мол это голимый маркетинг. А сегодня очень смешно и грустно смотреть на фотки с тех старых смартфонов.
Volume
Доктор наук
Уфа
516 287
Отв.61 27 Окт. 23, 15:16
50 Mpx, все говорили, мол это голимый маркетинг. А сегодня очень смешно и грустно смотреть на фотки с тех старых смартфоновDry Gin, 26 Окт. 23, 19:32ключевое тут "смотреть". На красивые 5тизначные циферки или график, болтающийся туда-сюда в несколько соток, но болтающийся ПЛАВНО, с градацией в тысячные - можно смотреть бесконечно, как на огонь чужую работу текущую воду )
А для автоматики тысячные бессмыслены - в силу дрейфа/нестабильности Т на объекте измерения в единицы сотых, даже если не заморачиваться на шум/дрейф датчика, наводки на схему измерения и собственную погрешность/дрейф схемы измерения. Мимо колонны пройдешь - Т на сотку прыгает, не говоря уж если окно открыть в помещении
Ну чтоб совсем уж не оффтоп.
Делал конструкцию этой ветки, прикольно. Но нормально работало только с программным "мастером" 1w, на ардуинке 328p. С аппаратным драйвером DS2482 не срослось, не видит 1wire устройств на шине
serjrv
Кандидат наук
Камышин
382 204
Отв.62 27 Окт. 23, 21:45
Делал конструкцию этой ветки, прикольно. Но нормально работало только с программным "мастером" 1w, на ардуинке 328p. С аппаратным драйвером DS2482 не срослось, не видит 1wire устройств на шинеVolume, 27 Окт. 23, 15:16C DS2482 проблема в следующем, в ее библиотеке (или связанных с ней) использована двойная инициализация DS`ок (какого то хрена ее автор решил что при первой инициализации надо кол-во датчиков посчитать, а потом уже при второй инициализации их серийники запомнить, глупо, но так реализовано), из за этого возникает глюк в либе OneWireHUB, которая собственно и поднимает программный 1-Wire. На 100% разбираться с библиотекой OneWireHUB мне было влом (только критичные глюки подправил), а вот библиотеку под DS2482 я правил немного поболее, но правда уже не шибко помню что менял. Переделывал ее под DS2484 (и не фак что она заработает теперь с DS2482), ну и заодно под OneWireHUB подправил.
Проще говоря, библиотека OneWireHUB не понимает более одной команды на поиск датчиков - Search ROM (0xF0), ну и более быстрый - Alarm Search (0xEC) в этой либе тоже не реализован к сожалению.
Volume
Доктор наук
Уфа
516 287
Отв.63 28 Окт. 23, 14:28
C DS2482 проблема в следующем, в ее библиотеке (или связанных с ней) использована двойная инициализация DS`ок (какого то хрена ее автор решилserjrv, 27 Окт. 23, 21:45нет, там что-то с таймингами не срастается, чип после 1-Wire Reset не взводит бит PPD "presence pulse detected", т.е. устройства на линии не "подергали" шину в ответ на сброс. Копать не стал, особой надобности не было
Сторонней библиотеки нет, драйвер 2482 самописный
serjrv
Кандидат наук
Камышин
382 204
Отв.64 28 Окт. 23, 19:54
чип после 1-Wire Reset не взводит бит PPD "presence pulse detected", т.е. устройства на линии не "подергали" шину в ответ на сброс.Volume, 28 Окт. 23, 14:28Ок. Если время свободное появится, проверю с отладкой на эту тему. Сниффер 1-Wire правда еще придется скидать (нам же "железяка DS248x" уже все транслирует), дабы сразу весь анализ на комп вывести, но это не проблема.
Добавлено через 39дн. 17ч. 50мин.:
Volume, В общем ты прав на счет Reset в либе OneWireHUB. В Ардуиновских поделках как то работает, а вот в серьезных проектах уже хренушки, особенно если оптимизация в компиляторе включена. Была необходимость перетащить эту либу на дешманский STM32F030, и как раз столкнулся с этой проблемой.
В итоге практически переписал ее, с привязкой всех критических интервалов отсчетов на таймер. Но реализовал все жестко под конкретный контроллер, нет к сожалению времени на полную переделку либы в "культурный" вариант. Но если кто то возьмется добить эту либу, то вот небольшая наводка где правил:
Скрытый текст
в platform.h жестко прописал пин отвечающий за 1Wire, хотя по уму надо обрабатывать маски регистров выбранного порта#include "stm32f030x6.h"
#define DIRECT_READ(base, pin) (GPIOA->IDR & 0x00000100) // RA8
#define DIRECT_WRITE_LOW(base, pin) (GPIOA->BSRR |= 0x01000000) // RA8
#define DIRECT_WRITE_HIGH(base, pin) (GPIOA->BSRR |= 0x00000100) // RA8
#define DIRECT_MODE_INPUT(base, pin) (GPIOA->MODER &= ~0x00010000) // RA8
#define DIRECT_MODE_OUTPUT(base, pin) (GPIOA->MODER |= 0x00010000) // RA8
using io_reg_t = uint32_t; // define special datatype for register-access
constexpr uint8_t VALUE_IPL {1};
в OneWireHub.cpp правок относительно много, но вот основные две:
// 1 - подпрограмма отлавливающая сигнал Reset на шине
bool OneWireHub::checkReset(void) {
DIRECT_MODE_INPUT(pin_baseReg, pin_bitMask);
if (!DIRECT_READ(pin_baseReg, pin_bitMask)) {
if (TIM3->CNT > 960) _error = Error::VERY_LONG_RESET;
return true;
}
else {
if (TIM3->CNT > 360 && TIM3->CNT < 960) {
if (_error == Error::RESET_IN_PROGRESS) _error = Error::NO_ERROR;
return false;
}
TIM3->EGR |= TIM_EGR_UG; TIM3->CNT = 0;
}
return true;
}
// 2 - отсчет задержек на шине
timeOW_t OneWireHub::waitLoopsWhilePinIs(volatile timeOW_t retries, const bool pin_value) const {
retries /= microsecondsToClockCycles(1); // возвращаем псевдо число задержки в нормальные микросекунды
TIM3->EGR |= TIM_EGR_UG; TIM3->CNT = 0;
while ((DIRECT_READ(pin_baseReg, pin_bitMask) == pin_value) && (TIM3->CNT < retries));
if (retries > TIM3->CNT) return (retries - TIM3->CNT);
return 0;
}
p.s. Еще чуть не забыл, в функции bool OneWireHub::showPresence(void) ищем строку:
wait(ONEWIRE_TIME_PRESENCE_MIN[od_mode]);
и меняем ее на это:
waitLoopsWhilePinIs(ONEWIRE_TIME_PRESENCE_MIN[od_mode], false);
p.p.s. TIM3 заведен на отсчет в микросекундах в основном коде программы (хотя это опять же надо в либу интегрировать с учетом выбранного контроллера):
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = 47; // 1 мкСек
TIM3->CR1 |= TIM_CR1_CEN; // включили таймер
Volume
Доктор наук
Уфа
516 287
Отв.65 15 Февр. 24, 19:23
еще раз про совместимость с DS2482
Взял OneWireHub версии 2.2.3 с гитхаба, ничего не менял. Сваял 2канальный конвертер АЦП в температуру на атмега328р - на базе примера из библиотеки
Подключил к автоматике с DS2482.
1. подключен только эмулятор. Все отлично
2. подключил параллельно шлейфу из 4х реальных ds-ок.
Реальные ds читаются, эмулированных нет, при чтении возвращают FF во всех ячейках. Понаставил в коде отладочных сообщений, после каждой 1w команды. И вдруг па-бам! эмулированные начали читаться. Сбои раз на 20..40 чтений. Убираю отладку - на каждом чтении сбой.
Т.е., попросту не успевает софт эмулятора. Возможно, на более быстрых процах проблем и не будет
Взял OneWireHub версии 2.2.3 с гитхаба, ничего не менял. Сваял 2канальный конвертер АЦП в температуру на атмега328р - на базе примера из библиотеки
Подключил к автоматике с DS2482.
1. подключен только эмулятор. Все отлично
2. подключил параллельно шлейфу из 4х реальных ds-ок.
Реальные ds читаются, эмулированных нет, при чтении возвращают FF во всех ячейках. Понаставил в коде отладочных сообщений, после каждой 1w команды. И вдруг па-бам! эмулированные начали читаться. Сбои раз на 20..40 чтений. Убираю отладку - на каждом чтении сбой.
Т.е., попросту не успевает софт эмулятора. Возможно, на более быстрых процах проблем и не будет
serjrv
Кандидат наук
Камышин
382 204
Отв.66 16 Февр. 24, 10:29
Volume, не выйдет на столь кривой либе, без глобальных изменений, что то путнее выжать. Когда перетаскивал ее на STM, в первозданном виде хоть 1 раз из 10 удавалось опросить 1 - 2 датчика, да и то при определенном уровне включенной оптимизации при компиляции. Когда все временные интервалы в либе завязал на таймер (а не эмпирически подогнанные программные задержки), все чудесным образом заработало и с любым количеством параллельно подключенных DS`ок, и с любым выбранным методом оптимизации компилятора, и прекрасно себя чувствует с SD2484 (SD2482 собственно мало чем отличается).
Dry Gin
Профессор
Котобург
12.2K 2K
Отв.67 07 Июня 24, 09:10
можно потрахаться и подобрать коэффициенты стейнхарта. И заставить датчик показывать НУЖНУЮ температуру. И козырять ей.А в чём сомнения по качеству датчика? Я ж тебе говорю, попробуй NTC 100к, глядишь и сомнения развеятся.
Только качество датчика остаётся под сомнением.Виктрыч, 06 Июня 24, 20:22
Добавлено через 2мин.:
если мы обосрались с абсолютным отображением NTC на высоких температурах ввиду его логарифмической зависимости, уводящей в поле вариантов, остаётся, уповать на его динамическую чувствительность. Тут он точно проигрывает 18В20. Разрядность АЦП только вылавливает блох на температурах около 100 Цельсия.Виктрыч, 06 Июня 24, 20:22Есть конкретных пример блох?