Вопросы новичка и подбор комплектующих для первого проЭкта

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Доброго времени суток, господа и господамы!

Не являюсь ни программистом, ни электриком, ни электротехником... короче - гуманитарий я =) Если с программированием немного знаком, то вот с микроконтроллерами - полный нуль. 

- Программирование: 
Есть скромные познания. С/С++ (С++98/03). Точнее мешанина из оных. Да и забылось уж многое. Не быдлокодил серьезно уже с декаду. За эти годы, конечно, приходилось немного вникать в тему программирования пару-тройку раз, но ничего серьезного по факту. 

Посему, мой опыт можно описать примерно так: Гуглинг, Копи, Паст, Компайл, Мольбы =) Ну а если "не прокатило", тогда танцы с бубном и всевозможные ритуалы =)

- Электроника, электротехника:
Крайне низкие (хотя, иногда такие называют "базовыми").

- Микроконтроллеры:
Познания отсутствуют/стремятся к нулю.

 

Не мог выбрать раздел форума, но решил все таки пойти в Общий, т.к., возможно, я попросту не осилю свою хотелку и это дело мною забросится. 

Итак, мне хотелось бы автоматизировать управление нагрузкой (обогрев) с учетом температуры объекта и текущей схемы питания устройства. 

Проще говоря, дана емкость с некоторой жидкостью внутри, температуру которой надо контролировать. Чем точнее - тем лучше. Так же есть подогрев этой жижи. Забегая немного наперед, скажу, что засунуть термопару внутрь не предоставляется возможным. Так же надо учитывать тот факт, что контроллер должен уметь питаться от двух источников питания постоянного напряжения и определять когда и от чего он питается. Может питаться от основного (15-18 Вольт, можно выбрать самому) и от резервных батарей (13.5 Вольт и ниже). Вот и все, пожалуй. 

Из моих наблюдений за напряжением питания от основного источника при переключателе на "15 В" выдает 14.7-14.9 Вольт, в зависимости от того, включен ли подогрев. Если напряжение в сети скачет, то и вольтаж тоже "гуляет", но на "15 В" - стабильнее всего держится. На остальных режимах напряжение скачет довольно сильно, и небольшие скачки напряжения в сети вызывают весьма неслабые скачки на конечном устройстве. Посему и был выбран переключатель на те самые "15 В"

Из "железок" пока еще ничего не взял, т.к. изучаю инфу и хочу понять что вообще мне понадобится для моей затеи. Думал начать с чего-то "простого", и так уж вышло, что наткнулся на один "эмулятор ардуино" (на сайте Тинкеркада), а в нем оказалась ATtiny45. Вот и решил начать с нее. Да, да, понимаю, что мои действия похожи на попытки потискать упругие девичьи сиськи "с помощью эмулятора тискания сисек", но на безрыбье и рак - рыба =) Так что, как только разберусь что покупать - сразу же закуплюсь необходимым.

Собственно, сейчас в Тинкеркаде и играюсь, но возникла загвоздка с измерением температуры. Далее приведу код, а после поясню мою проблему с иземрением температуры.  

#define LED_RED PB0		
#define LED_GREEN PB1	
#define THERMOMETER PB2
#define VOLTMETER PB3
#define RELAY PB4	

#include "Arduino.h"

float INPUT_VOLTAGE = 5.0;	// В

void setup()
{
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  pinMode(RELAY, OUTPUT);
  pinMode(THERMOMETER, INPUT);
  pinMode(VOLTMETER, INPUT);  
  delay(100);	// на стабилизацию параметров
}

void loop()
{  
  float SOURCE_VOLTAGE = (analogRead(VOLTMETER) * (INPUT_VOLTAGE/1023.0))*3.11;	// Вольты на выходе  
  float TempIn_C = analogRead(THERMOMETER);
  TempIn_C = (TempIn_C-500)/10.0;
       
  if(TempIn_C < 30.0 && SOURCE_VOLTAGE > 13.5)	
  {  	
    // питаемся от основного источника, подогрев включать можно
    digitalWrite(LED_RED, LOW);		// дебаг  
    digitalWrite(RELAY, HIGH); 
    digitalWrite(LED_GREEN, HIGH);     
    delay(500);
  }
  else
  {
    //перешли на резерв, выключаем подогрев бачка
    digitalWrite(LED_GREEN, LOW);    
    digitalWrite(RELAY, LOW); 
    digitalWrite(LED_RED, HIGH);	// дебаг
    delay(500);
  }    
}

Вот и весь код. Вольтметр в данном случае - простой делитель напряжения подключенный к порту PB3 и с ним все хорошо, выдает адекватные показания. Светодиоды и реле так же отрабатывают как надо. А вот термометр на PB2 выдает какую-то ересь... 

Я провел несколько тестов с попыткой разобраться что к чему, но только еще больше запутался. Результаты получились такие:

Показания Термометра на разных портах при текущем подключении (должно быть 25):
PB0 - 1.2, PB1 - 1.2, PB2 - -34.7, PB3 - 34.7, PB4 - random.
 
Показания Вольтметра (должно быть 13.6062): 
PB0 - 7.7749, PB1 - 7.7749, PB2 - 7.7749, PB3 - 13.6062,  PB4 - random.
 
Однако, где-то вычитал, что рекомендуется всем неиспользуемым пинам придавать какие-то конкретные значения, т.е. что бы не "плавали".  Один из вариантов - установка всех неиспользуемых пинов как ИНПУТов, и их заземление без "пул-апа" программного.  Собственно, далее отключил все от МК кроме питания и термометра, а оный поочередно подключал к разным пинам с заземлением остальных неиспользуемых, и вот что вышло:
 
Только Термометр (норма 25), все неиспользованные порты как входы, заземлены:
PB0 - 1.2, PB1 - -50, PB2 - -50, PB3 - -34,7, PB4 - random.
 
Так же сделал для Вольтметра (должно быть быть 13.6062), все неиспользованные порты как входы, заземлены:
PB0 - 7.7749, PB1 - 0, PB2 - 0, PB3 - 13.6062,  PB4 - random.
 
В итоге температура правильно не определилась, но с большой погрешностью (почти 10 градусов) было получено значение на пине PB3. На этом же пине правильно отрабатывал вольтметр, однако на остальных пинах тоже выдавал некорректные показания. Что я делаю не так?
 
Так же буду рад услышать рекомендации и/или поправки касательно всего связанного с данной темой.
 
Вот еще пара картинок из этого "эмулятора тискания сисек":
 
 
 
 
 
 
 
 
 
 
 
МК - ATtiny45 (вроде как почти то же самое, что и 85)
Питание - LM7805
Поглядывал еще сюда: http://files.amperka.ru/datasheets/ATtinyX5.pdf
 
Сразу поясню эту белиберду с блоками питания. Изначально планировалась 2 источника, и через свитч мы как бы имитировали отключение основного питания и переход на резервное. Но если к делителю внизу подключить плюс (оранжевый провод), то схема хоть и БУДЕТ работать и правильно измерять напряжение, но по неясной мне причине вся схема начинает нереально тормозить в этот момент. Причем так, что в итоге одна секунда в эмуляторе может длиться 2, 3, 5, а то и больше секунд реального времени. Почему - без понятия. Посему внизу 3 блок питания и был присобачен для ручного переключения напряжений, дабы избежать этого непонятного бага с тормозами. Т.о. в реальности надо просто убрать нижний БП и подключить тот самый свободный плюсовой оранжевый провод.
 
ОФФТОП: В планах, когда выберу и приобрету железки, и возня с регистрами, и отключения камня во время работы АЦП, и вообще всякие интеррапты и режимы сна с целью "мимими-зировать" прожорливость МК до минимума, ну или хотя бы до "приятных" значений. Но все эти темы надо бы еще нормально раскурить... Но не буду спешить пока.
 
Фух. Вроде все важное описал.. Вот такой вот вышел длиннопост вступительный, так что, надеюсь хоть кто-то сие осилит =) 
 
P.S. сейчас пытаюсь понять почему пины хотя и подписаны как ADC0,1, 2, 3, но по факту из них считывать корректное аналоговое значение может только один.
Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

adrift_into_infinity пишет:

Фух. Вроде все важное описал.. Вот такой вот вышел длиннопост вступительный, так что, надеюсь хоть кто-то сие осилит =) 

я не осилил - давай сначала в пяти строках текста.
b707
Offline
Зарегистрирован: 26.05.2017

adrift_into_infini - действительно, написано слишком много и слишком сумбурно. Главное, что я не понял - как и чем меряется температура.

Второе - советую оставить аттини45 и перейти на что-то более простое для новичка, например Ардуино Нано. Дело в том, что в аттини45 очень ограниченные ресурсы, как по памяти, так и по количеству выходов, а программирование для нее несколько отличается от стандартного.

Возьмите Уно или Нано - стандарт в области ардуино - тогда решать проблемы будет на порядок легче. А разница в цене между аттини и Нано менее 100 рублей

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Кхм... Ну, в пять строк не уложусь, но покороче донести попробую. Поехлаи!

Есть сайт https://www.tinkercad.com. На нем есть "эмулятор ардуино". На скринах предоставленых в 1 посте можно увидеть то, как я склепал на виртуальной макетке свое "творение". Так же, в первом посте есть код, который надо скопипастить и запустить в том же эмуляторе на сайте. Проблема в том, что только на одном аналоговом пине мы можем получить корректное значение напряжения, на всех остальных получается какая-то ересь. Так же и с датчиком температуры. Он вообще ни на каком из пинов не пашет корректно. Т.е. при 25 градусах он должен выдавать сигнал равный 750 мВ (он и выдает), но вот МК не измеряет это значение корректно ни на одном пине. Причину пытаюсь найти. Все остальное можно прочесть в 1 посте. 

Не 5 строк, но хотя бы коротко относительно текущей проблемы.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

поток сознания.

1. почему не работает виртуальная микросхема, можно ответить только виртуально.

2. объясни, что ты хотел изобразить в строках 23 и 25, там где формулы. Здается мне, что ты там херню фантастическую написал.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

b707, пардон  =) Решил расписать подробно, дабы не возникало каких-то простых вопросов.

Температура измеряется датчиком. Его показания при 25 градусах по Цельсию равны 750 мВ. Для преобразования мВ в градусы, мы вычитаем 500 из показаний в мВ, и потом полученное значение делим на 10. Т.е. (750-500)/10 = 250/10 = 25 градусам. Никакие ухищрения для других измеренных температур не требуются, ибо датчик линейный. Вот так вот просто =)

Ух... я то совладать не особо могу с МК с 8 ногами, а там и вовсе "рояль" из ног. Чую, там я точно забуксую... Разве не лучше разобраться хотя бы в общих чертах с более "детскими" МК? К тому же, чем меньше излишеств прилеплено к МК, тем меньше он должен кушать энергии. При питании от сети - не страшно, но от резерва - критично. Поэтому, хотелось бы уложиться в 1-2 мА в режиме ожидания/простоя. Ну, мне на данный момент кажется это значение адекватным. Могу ошибаться. Ну и тем лучше я должен буду (по идее) понимать принципы работы с МК. Да и нужна компактность. А цена особо роли не играет. 

Кстати, на оном форуме принято на Ты или на Вы обращаться?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

еще раз: в строке 25 почему ты решил.что в переменной значение в милливольтах?

в строке 23 почему умножение на 3.11?

И прежде, чем ответить,подумай, а зачем я задаю эти вопросы? Заранее повторю - в обеих строках написана полная херня. Но мне интересно. чтобы ты сам дошел до решения.

Если, конечно, тебе нужно решение а не понты.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

1) Справедливо =)

2) 

  float SOURCE_VOLTAGE = (analogRead(VOLTMETER) * (INPUT_VOLTAGE/1023.0))*3.11;	// Вольты на выходе

Тут получаем измеренное и сконвертированное значение в Волтах. Т.е. сначала аналогРидом считываем значение с пина на котором у нас висит делитель напряжения. На входе имеем значение от 0 до 5 Вольт. Далее это значение считывается АЦП и преобразуется в значение от 0 до 1023. Далее мы умножаем это дело на Входное (опорное в данном случае) напряжение (я его указал равным 5.0 Вольт) и делим на 1023. После этого остается домножить полученное значение на коэффициент делителя напряжения, который как раз равен в моем случае 3.11. 

Пример: измеряем напряжение на делителе, получаем 512 с помощью аналогРид. Далее умножим это на наше входое/опорное напряжение, на 5.0 в нашем случае и делим на 1023. Получается 512*5/1023 ~=  2,5024. Но не забываем про коэффициент делителя равный 3.11. На него и домножим полученное значение, и тогда получим ~7,7826 Вольт.

Еще пример: аналогРид выдал 768. 768*5/1023*3.11 ~= 11,6739 Вольт

________________________________

Апдейт, кажется, увидел косяк... сейчас поправлю =)

b707
Offline
Зарегистрирован: 26.05.2017

adrift_into_infinity пишет:

Так же и с датчиком температуры. Он вообще ни на каком из пинов не пашет корректно. Т.е. при 25 градусах он должен выдавать сигнал равный 750 мВ (он и выдает), но вот МК не измеряет это значение корректно ни на одном пине. Причину пытаюсь найти. Все остальное можно прочесть в 1 посте. 

Проблема с температурой, как уже написал Дракула - состоит в том, что Analogread() выдает данные не в милливольтах, а во внутренних единицах ADC,  в милливольты эти данные надо пересчитывать в зависимости от напряжения AREF.

Ну а галавная Ваша проблема - что вы взялись собирать проект, не потрудившись даже вкратце посмотреть доки на контроллер, который используете.  Например, зачем вы пытаетесь подключать термодатчик ко всем подряд пинам, если аналоговые у Аттини45 только пины PB2 PB3 и PB4 ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

не. не фантастическая, уважаемый wdrakula недооценил.  ФЕЕРИЧЕСКАЯ.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

wdrakula пишет:

еще раз: в строке 25 почему ты решил.что в переменной значение в милливольтах?

в строке 23 почему умножение на 3.11?

И прежде, чем ответить,подумай, а зачем я задаю эти вопросы? Заранее повторю - в обеих строках написана полная херня. Но мне интересно. чтобы ты сам дошел до решения.

Если, конечно, тебе нужно решение а не понты.

Так-с, поглядел я в даташит и призадумался. Если коротко - ты прав, попытка получить температуру в переменной в корне некорректна. С переменной со значением напряжения тоже чуток оказалось криво. 

Итак, сначала заглядываем в даташит, там находим формулу: 
ADC = (Vin * 1024)/Vref.
Vin - искомое напряжение на пине. Получаем формулу для него. 
Vin = (ADC * Vref)/1024
По дефолту референсное напряжение равно входному, т.е. 5.0 В. Значит, мы имеем все для вычисления искомой переменной:
  float SOURCE_VOLTAGE = (analogRead(VOLTMETER) * Vref / 1024.0)*3.10526315789474;	// Вольты на выходе

  float TempIn_C = ((((analogRead(THERMOMETER) * Vref) / 1024.0) * 1000.0)-500.0)/10.0;	// домножаем на 1000 для перевода значения из Вольт в миллиВольт
  																			// из миллиВольт вычитаем 500 и результат делим на 10, 
  																			// получаем градусы по Цельсию

Для напряжения питания делим на 1024, а не 1023, т.к. от 0 до 1023 - это лишь значение замеряемое АЦП, а градаций же: 2^10=1024. В конце чуток подправил коэффициент делителя напряжения.

Для температуры, по сути, ничего особого не применяется. Суть та же, только расчет температуры свой. Значение получается гораздо более точное, нежели ранее, что логично, и составляет 24.7070 для 25 градусов.

Можно еще использовать внешнее референсое напряжение на пине PB0 от 0 до Vcc, но нам оно не надо. 

И все это отлично работает только для пина PB3... PB2 и PB4 все так же выдают некорректные значения. То ли косяк эмулятора, то ли некорректная настройка/некорректное использование мною. 

Оффтоп немного: мне и самому интереснее и важнее понять что к чему. И я не против наводящих вопросов. Даже "за"! Где-то что-то подсказать на первых парах - можно. Заставлять решать кого-то за меня - не по мне. В данном топике я лишь пытаюсь навести порядок с данной темой у себя в котелке =)
Решение, конечно же, нужно. Только не понял, при чем тут какие-то понты?
P.S. даташит вообще вчера вечером впервые увидел =) 

sadman41
Offline
Зарегистрирован: 19.10.2016

То, что вы хотите поупражняться - это хорошо, но мне кажется, что проще начать с Mini/Nano/Uno, как вам уже советовали и DS18B20 + DallasTemperature lib.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

С температурой уже разобрался, спасибо. 

На самом деле я как раз таки вкратце оглядел  даташит к данному МК. Зазубрить, конечно же, не успел. Да что там зазубрить... понять бы еще все обозначения, что и как работает... поле непаханое у меня тут =)

На счет термодатчика я, видимо, неверно выразился. Единовременно датчик был подключен только к одному пину, а все остальные неиспользуемые - заземлены. Исключение - PB5, ибо его заземление вызывало ресет контроллера. А то, что подключал дачик помимо портов с ADC к PB0 и PB1 - не из-за академического интереса, а любопытства ради. И врядли бы я вообще решил это проверить, если бы заработали PB2 и PB4 как аналоговые входы. 

Кстати, вот и вопрос: почему реально работает только PB3 как аналоговый вход, а PB2 и PB4 при аналогичных настройках выдают рандомные значения? Есть у меня подозрение, что надо с очередными регистрами разбираться для какой-то хитрой или не очень активации функций портов. Или я что-то еще не вычитал про это и вопрос решается гораздо проще?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. Про  понты было из-за странных вопросов про "ты" и "вы". Как хочешь, так и пиши. Чисто по возрасту - тут почти все постоянные  за 40, мне 47.

2. смотрю начал разбираться. На этом этапе 1023и 1024 - даже голову себе не забивай, там разница мизерная.

3. Приведи полность пример для 4-ой ноги, который не работает на симуляторе. Не на словах - в стиле "все также, но  по другому".а прямо пример и схему, которые не работают. Скорее всего у тебя мелкая ошибка в программе или схеме.

-----

сорри за опечатки... клавукупил а Али резиноввую на кухню ...так она половину кнолпок пропускает.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

wdrakula пишет:

сорри за опечатки... клавукупил а Али резиноввую на кухню ...так она половину кнолпок пропускает.

извените за нерровный почеркккк. целую, навеки Ваша Клава. О_О

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

sadman41 пишет:

То, что вы хотите поупражняться - это хорошо, но мне кажется, что проще начать с Mini/Nano/Uno, как вам уже советовали и DS18B20 + DallasTemperature lib.

Я как раз думаю взять всяких разных (китайских и не очень =) ). А знакомый пообещал предоставить Леонардо оригинальный, когда будет в городе. Так что попробовать разные есть возможность.

P.S. спасибо за инфу, библиотеку покурю, датчик изучу =)

 

wdrakula пишет:

1. Про  понты было из-за странных вопросов про "ты" и "вы". Как хочешь, так и пиши. Чисто по возрасту - тут почти все постоянные  за 40, мне 47.

2. смотрю начал разбираться. На этом этапе 1023и 1024 - даже голову себе не забивай, там разница мизерная.

3. Приведи полность пример для 4-ой ноги, который не работает на симуляторе. Не на словах - в стиле "все также, но  по другому".а прямо пример и схему, которые не работают. Скорее всего у тебя мелкая ошибка в программе или схеме.

-----

сорри за опечатки... клавукупил а Али резиноввую на кухню ...так она половину кнолпок пропускает.

А... на самом деле все просто, и ни разу не понты. Если уж пришел в гости к незнакомым людям, не будешь же всем "тыкать" и в трусах бегать почесывая мохнатое пузо =D Плюс, кому-то некомфортно когда с ним на Ты, а другим это не играет никакой роли. Посему это просто учтивость. Ну и случаи видал, когда на каком-то тематическом форуме только на "Вы" можно было обращаться. Тут в правилах такого ограничения не нашел, но решил все же уточнить. На всякий =)

Касательного 3 пункта чуть попозже напишу. Разрывают на части. 

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Так-с. Привести пример для 4 ноги... тут правильнее сказать не 4 ноги, 4 порта (если я корректно понял терминологию). Т.е. 4 нога на МК это Земля. А порты как раз PB1-PB5. Нас же интересует только 3 порта: PB2 (7 нога), PB3 (2 нога), PB4 (3 нога). Все с возможностью АЦП.

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

#define LED_RED PB0		
#define LED_GREEN PB1	
#define THERMOMETER PB2
#define VOLTMETER PB3
#define RELAY PB4	

#include "Arduino.h"

float Vref = 5.0;	// В

void setup()
{
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  pinMode(RELAY, OUTPUT);
  pinMode(THERMOMETER, INPUT);
  pinMode(VOLTMETER, INPUT);  
  delay(1000);	// на стабилизацию параметров
}

void loop()
{
  float SOURCE_VOLTAGE = (analogRead(VOLTMETER) * Vref / 1024.0)*3.10526315789474;	// Вольты на выходе

  float TempIn_C = ((((analogRead(THERMOMETER) * Vref) / 1024.0) * 1000.0)-500.0)/10.0;	// домножаем на 1000 для перевода значения из Вольт в миллиВольт
  																						// из миллиВольт вычитаем 500 и результат делим на 10, 
  																						// получаем градусы по Цельсию
       
  if(TempIn_C < 30.0 && SOURCE_VOLTAGE > 13.5)	
  {  	
    // питаемся от основного источника, подогрев включать можно
    digitalWrite(LED_RED, LOW);		// дебаг  
    digitalWrite(RELAY, HIGH); 
    digitalWrite(LED_GREEN, HIGH);     
    delay(500);
  }
  else
  {
    // перешли на резерв, выключаем подогрев бачка
    digitalWrite(LED_GREEN, LOW);    
    digitalWrite(RELAY, LOW); 
    digitalWrite(LED_RED, HIGH);	// дебаг
    delay(500);
  }    
}

Далее в коде изменения минимальны, изменяется лишь подключение элементов на плате. Для данного случая меняем местами вольтметр и термометр.

Обычное подключение:

#define THERMOMETER PB2
#define VOLTMETER PB3

Напруга на делителе замерилась ~13,19 // тут верно, изначально 13.20 В  
Температура -50 // тут нет, иногда 0 выдавало... зависимости не углядел.
 
Поменяли местами вольтметр и термометр

#define THERMOMETER PB3
#define VOLTMETER PB2

Температура получилась 27,7070 // тут верно, изначально 25.00
Напруга на делителе 0 // тут нет
 
Вот как-то так получается. Похожая история с портом PB4. Он измеряет и выдает некорректные значения. 
Т.о. порт PB3 - корректно замеряет напряжение поданое на него, а вот остальные 2 АЦПшных PB2 и PB4 этого сделать не в состоянии... почему - не пойму никак.
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

как вы выбираете целевую микросхему в компиляторе?

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Размещаем МК сначала, далее справа сверху тыкаем на Code Editor, после этого во всплывающем окне увидим "блоки". Их смело сносим жмаканием на кнопку BLOCK, что рядом с UPLOAD and RUN. Нам скажут что это дело снесется или как-то так, мы соглашаемся. Теперь у нас есть окошко куда можем записать код скетча. Слева от "UPLOAD and RUN" будет название МК с которым мы работаем в данный момент. Для переключения на другой тыкаем на имя текущего и в появившемся Component Switcher выбираем необходимый нам МК. 

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Господа, подскажите, куда копать/что читать. Не уверен что планирую правильно...

Дано:
- Внешние питание DC 15-18 V (лучше 15, ибо другие режимы дают более сильные скачки напряжения)
- Резервное питание DC 13.4 V
- МК с "обвесом" потребляющий ~150 мА/ч в активном режиме
- тот же МК с "обвесом" потреляющий <1 мА/ч в режиме сна (SLEEP_MODE_PWR_DOWN)

Надо:
- При переходе на резервное питание (<13.4 V) уйти в сон (SLEEP_MODE_PWR_DOWN)
- После возобновления питания от сети (>13.4 V) проснуться и работать как обычно

Полагаю, решить сей вопрос можно как-то просто, но не уверен как правильно. С уходом в сон программно вопросов не возникает, а вот как выйти - вопрос. Есть мысли на счет компаратора и прерываний. Вроде как все просто должно быть.

Для примера рассмотрим LM393.
1) Компаратор запитываем от преобразователя напряжения (пусть будет ровно 5.0 Вольт)
2) На "ВХОД1+" подаем плюс с делителя напряжения от преобразователя на 5.0 Вольт (2.5 Вольт).
3) На "ВХОД1-" подаем плюс с делителя напряжения с коэффициентом 5.361 от сети (~2.4995 Вольт при напряжении питания 13.40 Вольт).
4.1) На "ВЫХОД1" получаем логический нуль, если напряжение на "ВХОД1-" < "ВХОД1+".
4.2) На "ВЫХОД1" получаем логическую единицу, если напряжение на "ВХОД1-" > "ВХОД1+"

Используя делитель с коэффициентом 5.361, уже при напряжении 13.41 В с делителя получим 2.5014 В, что больше 2.5 Вольт с "референсного делителя", следовательно, компаратор выдаст логическую единицу, т.е. 5.0 Вольт. Т.о. выход с компаратора будем использовать на пине с прерыванием.

Допустим, мы работаем от сети, напряжение в норме, на компараторе логическая единица. Вдруг напряжение в сети падает, но мы еще не знаем наверняка, проблема в колебаниях напряжения, или же мы перешли на резервное питание. При этом выход с компаратора может изрядно колбасить. Проверить просто, если напряжение за последние несколько секунд в среднем было 13.4 Вольт и ниже - значит работаем от резерва. Следовательно, выключаем всю переферию и уходим в сон. Во время сна ждем срабатывания прерывания на пине. И вот, вновь появляется питание от сети (15 Вольт), компаратор выдает единицу, а прерывание на пине настроенное на (rising edge) "будит" МК и мы продолжаем работать дальше.

Как никак, а компаратор будет кушать как минимум 0.8 мА. Так же надо не забывать про ток текущий через резисторы на делителях напряжения. Это еще примерно 0.11 и 0.134 мА. Т.о. уже 1.044 мА будет кушаться на нашей "пробуждайке" без учета самого МК. И это я еще не учел потребление самого преобразователя напряжения на 5 Вольт... Даже без его учета, в теории, получается много. 

Вот так вот в данный момент мне кажется должна будет работать моя задумка. Понимаю, что вряд ли это можно назвать "оптимально", но знаний пока что хватает на такой вариант... Прошу подсказать что не так, и как можно сделать получше. Ну и что стоит почитать, дабы лучше разобраться в текущем вопросе. 

P.S. Что-то коротко у меня не получается написать =)

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Всем привет!

Итак, задача частично решена. Я так и не додумался/не нашел особо внятных решений по своей хотелке касательно детектирования источника питания (время свободного маловато, да и по приходу с работы валишься как убитый зачастую, а в таком состоянии что-то изучать - полный атас - "вчера прочел, сегодня уже забыл"). В свете этого было решено сделать так:

1) Мониторим напряжение
2) Если напряжение падает ниже 13.4 В, то начинаем отсчет (10 сек)
3) Если за это время напряжение поднялось выше 13.4 В - сбрасываем счетчик
4) Если напряжение так и не поднялось - значит работаем от батареи
(В этом случае выключаем "нагревайку" и уходим в сон)
5) Периодически просыпаемся с помощью Вотчдога и проверяем напряжение
6) Если напряжение превысило 13.4 - работаем как обычно, иначе опять идем спать

В общем, решение может и не особо удачное, но уж на что хватило меня. Последние пару дней работает нормально.

Ах да, по деталям:
- Датчик использовал DS18B20 по совету товарища sadman41, за что ему спасибо. 
- Вместо ATtiny45 использовал ATtiny85
- Запитано через какой-то степ-даун модуль, не помню точное название, что-то вроде "360-мини" (какой-то ширпотреб китайский, судя по всему)
- Конденсаторы сразу после модуля питания: один керамический (около 470 пикоФарад) и один электролитический (1 микроФарад, 10 Вольт)
- Резисторы 5% использовались. Между делителем напряжения и аналоговым входом "вольтметра" использовал 10 кОм резистор
- Реле на 5 Вольт. Какое именно - без понятия. Какой-то ноунейм. Вскрывать и смотреть потроха не решился, т.к. одно было, да и вряд ли это мне бы что-то дало. Ток при включении реле около 25-27 мА, потом 20-22 мА. На всякий случай на пин управляющий реле добавил резистор на 220 Ом (проверял, все окей, реле щелкает).

Вот, в общем-то, и все. Всем откликнувшимся спасибо =) 

Тему можно закрывать.