stm32 ds18b20
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
stm32 ds18b20
У меня вопрос.По ds18b20.Есть примеры с AVR .И у меня возникло желание переделать на stm32.И по иней примеры есть.Но тут неувязочка.На AVR
Если шину отпускает контроллер то настраивается регистр DDR на вход лог.0.А в stm32 там пример по другому ?. Почему так?.По USARt мне не интересно.Вот по порту GPIO .
Добавлено after 1 hour 46 minutes 33 seconds:
Ау где же вы коты?
Если шину отпускает контроллер то настраивается регистр DDR на вход лог.0.А в stm32 там пример по другому ?. Почему так?.По USARt мне не интересно.Вот по порту GPIO .
Добавлено after 1 hour 46 minutes 33 seconds:
Ау где же вы коты?
Re: stm32 ds18b20
Извращенец. Современный МК- это в первую очередь периферия. Вместо того, чтобы осваивать её, ты по-стариковски дёргаешь ногами GPIO. Купи за 100 рублей DS2480B и работай с 1-Wire по-человечески.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
DS2480B-это переходник на 1-wire?.Вот сколько у вас рейтинг сообщений такой мой возраст.Это 3 входа RX TX POL/.Это похоже на USART?
Re: stm32 ds18b20
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242762#p4242762"]DS2480B-это переходник на 1-wire?.Вот сколько у вас рейтинг сообщений такой мой возраст.Это 3 входа RX TX POL/.Это похоже на USART?[/uquote]
А чё, даташит на DS2480B прочитать слабО? Оттуда узнал бы, что это преобразователь протокола UART в 1W, да ещё и с аналоговой обвязкой для формирования правильной формы импульсов. Заметь, протокола, а не уровня сигналов.
Для особо ленивых предлагаю схему. Надеюсь, сформировать 5В сумеешь.
А чё, даташит на DS2480B прочитать слабО? Оттуда узнал бы, что это преобразователь протокола UART в 1W, да ещё и с аналоговой обвязкой для формирования правильной формы импульсов. Заметь, протокола, а не уровня сигналов.
Для особо ленивых предлагаю схему. Надеюсь, сформировать 5В сумеешь.
- Вложения
-
- Screenshot_404.jpg
- (45.2 КБ) 165 скачиваний
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 ds18b20
Вот тебе готовое для работы с DS18/DHT11. Используется таймер с DMA.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 ds18b20
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242728#p4242728"]И у меня возникло желание переделать на stm32.[/uquote]
Есть готовые варианты как на UART + DMA, так и на GPIO. Сам даже баловался с написанием подобного драйвера, но в итоге портировал другой с расширенной логикой работы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242728#p4242728"]На AVR Если шину отпускает контроллер то настраивается регистр DDR на вход лог.0.А в stm32 там пример по другому ?[/uquote]
На STM32 точно так же, когда контроллер отпускает шину, он так же переводит порт на вход. Естественно, это будет по другому, т.к. STM32 это НЕ AVR.
Но перевод порта в другой режим осуществляется в общем-то так же.
STM32F10x:
STM32F4xx / F2 / F0 / L0 / L1...
В первой версии чипов GPIO периферия была не очень удачной. Регистр настроек режима работы был совмещён с дополнительными функциями. А потом их разделили и настройка порта стала значительно удобнее.
И если уж хочется подёргать ножками - озаботьтесь наличием точного таймера, чтобы можно было отмерять микросекундные интервалы для определения ответа датчика.
Это на UART'е просто. Настроить скорость передачи таким образом, чтобы 1 байт перекрывал всю возможную длительность ответа датчика (~60мкс), но при этом стартовый бит не был слишкомд линным (< 15мкс). Соответственно, пишем в датчик 0xFF (в итоге в ноль дёргается только стартовый бит), и читаем результат (TX + RX соединены). Если читается 0xFF - на шине "1", если 0xFE / 0xFC / 0xF8 - на шине "0". Повторить до получения всех битов ответа. Отправка команды - точно так же. Хотя посылать можно и более длинные значения.

Напомнило
Есть готовые варианты как на UART + DMA, так и на GPIO. Сам даже баловался с написанием подобного драйвера, но в итоге портировал другой с расширенной логикой работы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242728#p4242728"]На AVR Если шину отпускает контроллер то настраивается регистр DDR на вход лог.0.А в stm32 там пример по другому ?[/uquote]
На STM32 точно так же, когда контроллер отпускает шину, он так же переводит порт на вход. Естественно, это будет по другому, т.к. STM32 это НЕ AVR.
Но перевод порта в другой режим осуществляется в общем-то так же.
STM32F10x:
Код: Выделить всё
// Порт на вход
GPIOB->CRL &= 0x0FFFFFFF; // GPIOB7 -> Analog Input [CNF = 00, MODE = 00]
GPIOB->CRL |= 0x40000000; // GPIO7 -> Input Floating [CNF = 01, MODE = 00]
// Порт на выход
GPIOB->CRL &= 0x0FFFFFFF; // GPIOB7 -> Analog Input [CNF = 00, MODE = 00]
GPIOB->CRL |= 0x30000000; // GPIO7 -> GPIO output [CNF = 00, MODE = 11], SPEED: 50MHz
Код: Выделить всё
// На вход
GPIOC->MODER &= 0xFFFFCFFF; // GPIOC6 -> INPUT [MODER = 00]
// На выход
GPIOC->MODER |= 0x00001000; // GPIOC6 -> GPIO [MODER = 01]
И если уж хочется подёргать ножками - озаботьтесь наличием точного таймера, чтобы можно было отмерять микросекундные интервалы для определения ответа датчика.
Это на UART'е просто. Настроить скорость передачи таким образом, чтобы 1 байт перекрывал всю возможную длительность ответа датчика (~60мкс), но при этом стартовый бит не был слишкомд линным (< 15мкс). Соответственно, пишем в датчик 0xFF (в итоге в ноль дёргается только стартовый бит), и читаем результат (TX + RX соединены). Если читается 0xFF - на шине "1", если 0xFE / 0xFC / 0xF8 - на шине "0". Повторить до получения всех битов ответа. Отправка команды - точно так же. Хотя посылать можно и более длинные значения.

Напомнило
Re: stm32 ds18b20
А про какой пример речь? Мы не видим этот пример.А в stm32 там пример по другому ?. Почему так?.
В целом, надо просто понять суть работы 1-wire: кто когда и куда тянет линию связи.

И микроконтроллер, и устройство для передачи бита могут только прижимать линию к 0 и освобождать её. В 1 линия подтягивается резистором на 4,7 кОм к VDD.
Помеченное на рисунках красным цветом ("мастер удерживает низкое напряжение" - это когда ножка настроена на ВЫХОД в режиме OpenDrain (OD) и на выходе лог.0.
Помеченное зеленым цветом ("резистор подтягивает напряжение") - это когда ножка настроена на ВХОД, и считывается состояние входа, равное лог.1.
Помеченное синим цветом ("устройство удерживает низкое напряяжеие") - ножка настроена тоже на ВХОД, считывается состояние входа, равное лог.0.
Сине-красный цвет - ножка настроена на ВЫХОД в режиме OD. Удерживается низкий уровень.
Вот теперь исходя из этих комбинаций и напишите.
Если делать через UART, то ножка конфигурируется на выход альтернативной функции в режиме OD.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
Я понял но примеров на STM32 есть но они неправильно показаны.Нужно переделывать.А по USART нужно переходную микросхему.ЗА информацию спасибо.А NAROD STREAM я на этом сайте смотрел.С AVR вопросов меньше.А вот с STM32 вот такой вопрос возник.Я почему спрашиваю вы спецы.У вас опыт больше.А там придётся программу пересматривать и сопоставлять тайминги и функции ну и эксперементировать.И через USART немного программа другая.Но это ньюансы.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 ds18b20
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]Я понял но примеров на STM32 есть но они неправильно показаны.Нужно переделывать.[/uquote]
Вы уверены, что смотрите на правильные примеры? Или переделывать в том плане, что не те пины? Ну тут да, нужно слегка изменить код под свои потребности.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]А по USART нужно переходную микросхему.[/uquote]
Нет. Прекрасно работает от питания контроллера и на UART'е контроллера.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]А там придётся программу пересматривать и сопоставлять тайминги и функции ну и эксперементировать.[/uquote]
Тайминги-то зачем менять? Их обычно не нужно трогать.
Разве что если хардкодить под конкретно один чип, который будет всегда молотить на одной частоте. А это уже написание костылей вместо функций.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]И через USART немного программа другая.Но это ньюансы.[/uquote]
Спорное утверждение. "Программа", конечно, другая будет. Но эту фразу можно притянуть даже к двум сборкам одной и той же программы (с изменениями всего в одной строке кода). А логика работы одна и та же: Отправить команду датчику, дождаться её завершения (либо какое-то время заниматься своими делами), запросить ответ. Усё.
Опять же, в плоскости UART'а: Используем DMA + USART, предварительно разбиваем команду на байты, которые будут отправлены в виде тайм-слотов (картинка выше), ждём пока DMA завершит передачу, разбираем ответ. Всё.
Помнится, в одном проекте я использовал вот такую схему включения датчика: STM32F030F4P6 (TSSOP-20), PA3+PA4 - USART_TX + USART_RX соединены по схеме "Проволочное И", используют внутреннюю подтяжку к питанию (3.3В) и Mosfet транзистор по схеме смещения уровней 3.3В <-> 5В. И это работает.
Вы уверены, что смотрите на правильные примеры? Или переделывать в том плане, что не те пины? Ну тут да, нужно слегка изменить код под свои потребности.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]А по USART нужно переходную микросхему.[/uquote]
Нет. Прекрасно работает от питания контроллера и на UART'е контроллера.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]А там придётся программу пересматривать и сопоставлять тайминги и функции ну и эксперементировать.[/uquote]
Тайминги-то зачем менять? Их обычно не нужно трогать.
Разве что если хардкодить под конкретно один чип, который будет всегда молотить на одной частоте. А это уже написание костылей вместо функций.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4242989#p4242989"]И через USART немного программа другая.Но это ньюансы.[/uquote]
Спорное утверждение. "Программа", конечно, другая будет. Но эту фразу можно притянуть даже к двум сборкам одной и той же программы (с изменениями всего в одной строке кода). А логика работы одна и та же: Отправить команду датчику, дождаться её завершения (либо какое-то время заниматься своими делами), запросить ответ. Усё.
Опять же, в плоскости UART'а: Используем DMA + USART, предварительно разбиваем команду на байты, которые будут отправлены в виде тайм-слотов (картинка выше), ждём пока DMA завершит передачу, разбираем ответ. Всё.
Помнится, в одном проекте я использовал вот такую схему включения датчика: STM32F030F4P6 (TSSOP-20), PA3+PA4 - USART_TX + USART_RX соединены по схеме "Проволочное И", используют внутреннюю подтяжку к питанию (3.3В) и Mosfet транзистор по схеме смещения уровней 3.3В <-> 5В. И это работает.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
А как же тот переходник с USART -1-Wire?DS2480B
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 ds18b20
Не нужно их соединять! Можно USART в однопроводной схеме использовать, в режиме полудуплекса.USART_TX + USART_RX соединены по схеме "Проволочное И"
Ну, кому как проще. Мне лично проще на таймере. Но все зависит от конкретной схемы: есть незанятый USART — пожалуйста, есть незанятый таймер с режимом захвата — можно на нем. В принципе, можно вообще на макросах универсальный код нарисовать, который будет либо на каком-нибудь USART'е, либо на таймере работать. Но я сомневаюсь, что кому-то это нужно. Я и сам-то с 1-wire чисто интереса ради занимался, потому что нет вообще никаких вменяемых датчиков для этой шины: у температурных погрешности огромные, а у датчиков влажности так вообще "плюс-минус лапоть"!
Нафиг-нафиг! Есть вменяемые датчики для I2C или SPI, лучше с ними работать. А измерить температуру в теплице или контуре охлаждения (где даже ±1℃ выше крыши) можно и обычной копеечной NTC/PTC. У меня вот на таких система охлаждения домашней файлопомойки работает (там четыре точки измерения и три вентилятора, МК принимает решение, какие вентиляторы включать и с какой скоростью; правда, хоть там круглосуточно торренты крутятся, процессор "кубитрака" греется совсем слабо, один вентилятор я вообще выкинул, когда добавил туда "бесперебойник" на 18650, остальные два уж и не помню, когда включались).
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
А какие датчики температуры и влажности лучше?Назховите хоть пару?
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 ds18b20
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4243213#p4243213"]Я и сам-то с 1-wire чисто интереса ради занимался, потому что нет вообще никаких вменяемых датчиков для этой шины: у температурных погрешности огромные, а у датчиков влажности так вообще "плюс-минус лапоть"!
Нафиг-нафиг! Есть вменяемые датчики для I2C или SPI, лучше с ними работать.[/uquote]
Поддерживаю =)
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4243221#p4243221"]А какие датчики температуры и влажности лучше?Назховите хоть пару?[/uquote]
AHT10 (AHT15)? BME280/BMP280?
И это из того, что я могу достать, не заказывая компонентов из другого города. Прямо готовые модули для Arduino.
AHT10 уже раскурил. Он работает. Экономный датчик. Во сне потребляет менее 1мкА (контроллер удаётся отправить в сон с током в ~18мкА, зато выходит без перезапуска). Разрешающая способность 0.01 градуса и 0.01% влажности. Насчёт реальности показаний - спорно, но сравнивая с данными DHT22, значения были близкими. Температуру оба датчика показывали одинаковую (+/- 0.1 градуса), влажность - DHT22 показывал на 4% выше. Стабильно.
DHT22, кстати, не рекомендую. Упоротый протокол передачи. "Вы дёргаете пин, переводите пин в режим приёма, и измеряете интервалы, которые генерирует датчик". А если не успели - повторите через 2 секунды. :\
Нафиг-нафиг! Есть вменяемые датчики для I2C или SPI, лучше с ними работать.[/uquote]
Поддерживаю =)
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4243221#p4243221"]А какие датчики температуры и влажности лучше?Назховите хоть пару?[/uquote]
AHT10 (AHT15)? BME280/BMP280?
И это из того, что я могу достать, не заказывая компонентов из другого города. Прямо готовые модули для Arduino.
AHT10 уже раскурил. Он работает. Экономный датчик. Во сне потребляет менее 1мкА (контроллер удаётся отправить в сон с током в ~18мкА, зато выходит без перезапуска). Разрешающая способность 0.01 градуса и 0.01% влажности. Насчёт реальности показаний - спорно, но сравнивая с данными DHT22, значения были близкими. Температуру оба датчика показывали одинаковую (+/- 0.1 градуса), влажность - DHT22 показывал на 4% выше. Стабильно.
DHT22, кстати, не рекомендую. Упоротый протокол передачи. "Вы дёргаете пин, переводите пин в режим приёма, и измеряете интервалы, которые генерирует датчик". А если не успели - повторите через 2 секунды. :\
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 ds18b20
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4243221#p4243221"]Назовите хоть пару?[/uquote]
Термомониторинг главного зеркала БТА я делал на TSYS01 - после калибровки во всем диапазоне возможных температур зеркала (-10÷+15℃) они давали точность не хуже 0.05℃. Но сейчас и более дешевые существуют, надо погуглить. Правда, цены повысились значительно: боюсь, дешевле полутора-двух тысяч рублей за штучку уже и не найти. Но можно и на платиновых терморезисторах с внешним АЦП измерять: те после калибровки вообще сотые способны давать, а цена на них вряд ли сильно подскочила: как были 500-1000р за штучку, так и остались.
Если же температуру надо измерять с точностью хуже 0.1℃, действительно, есть всякие дешевые BMP/BME. BMP180 не советую: дерьмо. Можно попробовать откалибровать BME280.
В любом случае, без калибровки точность лучше ±0.1℃ "из коробки" можно достичь лишь за очень большие деньги (которые по сути отдашь за то, что за тебя кто-то на заводе датчик откалибровал).
Термомониторинг главного зеркала БТА я делал на TSYS01 - после калибровки во всем диапазоне возможных температур зеркала (-10÷+15℃) они давали точность не хуже 0.05℃. Но сейчас и более дешевые существуют, надо погуглить. Правда, цены повысились значительно: боюсь, дешевле полутора-двух тысяч рублей за штучку уже и не найти. Но можно и на платиновых терморезисторах с внешним АЦП измерять: те после калибровки вообще сотые способны давать, а цена на них вряд ли сильно подскочила: как были 500-1000р за штучку, так и остались.
Если же температуру надо измерять с точностью хуже 0.1℃, действительно, есть всякие дешевые BMP/BME. BMP180 не советую: дерьмо. Можно попробовать откалибровать BME280.
В любом случае, без калибровки точность лучше ±0.1℃ "из коробки" можно достичь лишь за очень большие деньги (которые по сути отдашь за то, что за тебя кто-то на заводе датчик откалибровал).
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
Вот есть задача .Датчик стоит за 20 метров.BME280 у меня есть но он по месту.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 ds18b20
Какая точность нужна?
И какой бюджет?
И какой бюджет?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
У меня что есть .BME280 DS18b20(в изолированном виде) DTH22 .Два приёмапередатчика NRF24 .Может есть что то лучше для выполнению данной задачи.Аналоговые датчики?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 ds18b20
Еще раз задаю вопрос: какая нужна точность и каков бюджет?
Или нужно расшибиться, но реализовать на подножном корму?
Или нужно расшибиться, но реализовать на подножном корму?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 ds18b20
Градусы точность 0.5 градуса .А бюджет подороже можно.
Re: stm32 ds18b20
Термометр на термопаре и дифференциальном 24-битном АЦП - и тогда можно снять и построить тарировочную характеристику и получить супер-пупер точность. Только оное реально вот нужно?