Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: DS18B20 в паре с STM32F103C8

Вт июн 02, 2020 15:20:00

Мурик писал(а):USART занят под другие нужды.
В F103C8 3 USART. Все заняты?

Re: DS18B20 в паре с STM32F103C8

Вт июн 02, 2020 15:44:10

на 100 датчиков понадобится 100 преобразователей CAN<->интерфейс датчика. Получится слишком дорого и громоздко.

Если датчики так далеко, что для связи придется CAN-шину использовать, то 1-wire здесь однозначно сядет в лужу! Либо вам придется активировать не одну, а две ноги МК для 1-wire: одну на прием, а вторую — через более-менее мощный транзистор — на передачу. Абы DS18 смогли подтяжку в сотню Ом пересилить… Но как бороться с шумами на километровой шине 1-wire, я вообще не представляю!
Добавлено after 1 minute 21 second:
USART занят под другие нужды. Ну и да, вопрос не об этом.

Таймер + DMA, понадобится задействовать лишь одну ногу, один канал DMA да один таймер с compare/capture.

Re: DS18B20 в паре с STM32F103C8

Вт июн 02, 2020 16:27:57

Eddy_Em писал(а):Если датчики так далеко, что для связи придется CAN-шину использовать, то 1-wire здесь однозначно сядет в лужу!
Не поверите, 1Wire нормально работает.

Eddy_Em писал(а):Либо вам придется активировать не одну, а две ноги МК для 1-wire: одну на прием, а вторую — через более-менее мощный транзистор — на передачу.
Ясень пень линия 1Wire подключена не на прямую к МК (это ненадежно при длинной линии), а через спец. адаптер.

Re: DS18B20 в паре с STM32F103C8

Вт июн 02, 2020 17:22:45

через спец. адаптер.

И каждый датчик — через спец. адаптер. Круто.
Кроме того, я не встречал DS18 в нормальном формфакторе — чтобы его можно было на что-то наклеить. Т.е. он годится лишь чтобы его в гильзу запихнуть и с точностью +=слон измерять температуру газа (ну или с чуть лучшей точностью — температуру жидкости).

Что ж за задачи такие могут возникнуть, чтобы с точностью ±2°C нужно было измерять в сотне точек температуру воздуха, либо с точностью ±0.5°C — температуру жидкости? Бред какой-то.

Кстати, если такие задачи и возникнут вдруг, то можно взять 10-рублевый китайский МК (что у них там сейчас популярно — ch552?), к нему 5-рублевый преобразователь уровней для RS-485, обвязки еще на 5 рублей и рублевый терморезистор. Еще рублей 10 будет стоить печатная плата. Пайка - ну, рублей 20.
В общем, получается, что за стоимость идиотского DS18 мы получили вменяемый термодатчик с такой же паршивой точностью, но более удобным формфактором датчика + работающий на RS-485!!!

Re: DS18B20 в паре с STM32F103C8

Вт июн 02, 2020 19:54:24

Eddy_Em писал(а):И каждый датчик — через спец. адаптер.
Где я такое написал? Он общий для всех датчиков.

Eddy_Em писал(а):Что ж за задачи такие могут возникнуть, чтобы с точностью ±2°C нужно было измерять в сотне точек температуру воздуха, либо с точностью ±0.5°C — температуру жидкости?
Контроль за выходом температуры за допустимые пределы.

Eddy_Em писал(а):Кстати, если такие задачи и возникнут вдруг, то можно взять 10-рублевый китайский МК (что у них там сейчас популярно — ch552?), к нему 5-рублевый преобразователь уровней для RS-485, обвязки еще на 5 рублей и рублевый терморезистор. Еще рублей 10 будет стоить печатная плата. Пайка - ну, рублей 20.
У вас так дешево. :shock: Может придете в нашу фирму и будете выполнять работу по такой цене? :))) Думаю вам рублей 500 на все компоненты в месяц даже много будет. :))) Да чуть не забыл, нужны не ширпотребные детальки, а качественные, т. е. заказ на Али не проконает :facepalm: потому что в случае сбоя из-за некачественного железа, разработчик должен оплатить за свой счет ремонт и стоимость простоя оборудования. :dont_know:
Ну что согласны работать дешево и качественно с гарантией стабильной работы оборудования? :)

Eddy_Em писал(а):В общем, получается, что за стоимость идиотского DS18 мы получили вменяемый термодатчик
Который нужно калибровать и учитывать нелинейность измерения температуры терморезистором, причем каждый датчик в отдельности. :facepalm: Нет уж, сами пользуйтесь. :)))

Re: DS18B20 в паре с STM32F103C8

Вт июн 02, 2020 21:39:17

Раньше, между прочим, эти датчики были в госреестре средств измерений... сейчас не в курсе.

Re: DS18B20 в паре с STM32F103C8

Ср апр 21, 2021 21:16:33

Да чего вы кинулись код то кидать?

Eddy_Em писал(а):VladislavS, так ведь и подход абсолютно разный: на аврке нет DMA, там реализовать 1-wire можно только двумя способами: таймер+прерывание или UART. А на STM32 можно таймер с DMA, можно USART с DMA…



А кто-нибудь может выложить код для STM32 где реализован 1-wire способом: таймер+прерывание?
А то сижу изобретаю велосипед.
USART не хочу использовать, к тому же не хочу подключать несколько DS18B20 на одну линию, хочу каждый датчики на отдельную ногу STM32, тут ни каких USART не хватит.
Пытался сам переписать свой старый код от AVR с delay() на использование таймера, но не пойму как в STM32 таймер работает, можно ли внутри прерывания таймера поменять значение перезагрузки (TIM_Period)?
Т.е. я хотел в начале слота сначала выдать на 1-wire 0, настроить таймер на 1мкс, запустить таймер, потом внутри прерывания таймера например, выдать на 1-wire 1 и перенастроить таймер например на 60мкс (окончание слота). Вот у меня такое впечатление, что внутри прерывания не перенастраивается таймер, может я вообще как-то неправильно таймер настроил. Может кто подскажет, что как то по другому нужно делать 1-wire на таймере.
Вот кусок моего кода работы с таймером (только не смейтесь, микроконтроллерами не занимаюсь, так только, разовую самоделку нужно сделать):

void TIM3_Set_Period(uint32_t a_us)
{

TIM_TimeBaseInitTypeDef TIMER_InitStructure;

TIM_TimeBaseStructInit(&TIMER_InitStructure);
TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIMER_InitStructure.TIM_Prescaler = 71; //1 мкс
TIMER_InitStructure.TIM_Period = a_us;
TIM_TimeBaseInit(TIM3, &TIMER_InitStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
// TIM_Cmd(TIM3, ENABLE);

}

void TIM3_init(void)
{
// TIMER3
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM3_Set_Period(2); // по умолчанию прерывание через 2 мкс

/* NVIC Configuration */
/* Enable the TIM4_IRQn Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{

/* Даём знать, что обработали прерывание */
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

TIM_Cmd(TIM3, DISABLE);

switch(OneWire_step)
{
case Read_init:

OneWire_writePinHIGH();
TIM3_Set_Period(200); // здесь должно быть <15 мкс, а тут хоть 200 ставлю все равно температуру считывает, будь то и не меняет TIM_Period
OneWire_step = Read_Bit;

break;

case Read_Bit:

// - Read bit
OneWire_Bit = OneWire_readPin();

TIM3_Set_Period(60); // временной слот минимум 60 мкс
OneWire_step = End_slot;

break;


case End_slot:
OneWire_step = 0;
OneWire_done = 1;
break;
}; // end switch

if ( !OneWire_done ) {
TIM_SetCounter(TIM3, 0);
TIM_Cmd(TIM3, ENABLE);
}


}
}

uint8_t OneWire_readBit(void){

OneWire_done = 0;

// - Drop line
OneWire_writePinLOW();

TIM3_Set_Period(1); // низкий уровень не менее 1us
OneWire_step = Read_init;

TIM_SetCounter(TIM3, 0);
TIM_Cmd(TIM3, ENABLE);


delay_us( 100 ); // чтоб работало пока пришлось такой костыль подставить, пока не разобрался с настройкой таймера в прерывании

uint8_t Bit = OneWire_Bit;
return Bit;
}

Re: DS18B20 в паре с STM32F103C8

Ср апр 21, 2021 21:47:39

У меня на гитхабе. Как раз таймер + DMA. Таймер + прерывание не нужно: сильно напрягает ядро. Но я и такое делал (для STM8S, т.к. у них нет DMA).
UPD: прочитал, хотелки. Как-то это через одно место получается. Но можно и так: повесить 16 датчиков на все ноги одного порта (скажем, PORTB). Порты настроить на выход с открытым стоком. Избранным таймером при помощи DMA запинывать в порт по UEV данные в ODR, а по CC1 читать данные из IDR. Как раз подобным образом (только в одну сторону) я сейчас работаю с RGB светодиодной панелью.

Re: DS18B20 в паре с STM32F103C8

Пт апр 23, 2021 21:36:14

зачем Вы разным объектам даете такие схожие имена, от "OneWire" в глазах рябит ;))
вот имена ваших двух функций "OneWire_readPin", "OneWire_readBit" - в листинге вы их быстро отличаете?

"... не пойму как в STM32 таймер работает, можно ли внутри прерывания таймера поменять значение ..."
таймер - периферия, ему фиолетово откуда вы к нему обращаетесь - с основного цикла или с обработчика прерывания.
Просто поменять то, что вы называете " значение перезагрузки" - это всего лишь:
TIM3->ARR = 60-1;
как видите для этого не нужны ни библиотеки ни оформление отдельной функции, но вот чтобы происходило то, зачем это делается надо немного подтянуть матчасть.
На примере -
TIM3->ARR = 60-1;
TIM3->EGR = TIM_EGR_UG;
TIM3->CR1 |= ( TIM_CR1_OPM|TIM_CR1_CEN );
(таймер остановлен), в ARR новое значение, EGR_UG - "проталкивание" значений регистров (в том числе ARR) в так называемые теневые, бит OPM - это если надо, чтоб таймер сам остановился после одного цикла, CEN - разрешить тактирование таймера (снятие бита- блокировать тактирование) !только тактирование - ни сброса значений, ни обновления регистров при этом не происходит.
Смениться значение периода и на идущем таймере (только по первой строчке, две последующие не нужны), но надо понимать влияние бита ARPE в регистре TIMx_CR1. все есть в RM0008 в картинках.

эти словеса не в качестве альтернативы к предыдущему сообщению, а просто как ответ на вопрос. :beer:
Ответить