Перейти к содержанию

Управление Несколькими Реле В Зависимости От Сопротивления Датчика


max1287

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Как вариант

07fb065bbff1.gif

Остаётся только скважность замерить в точке.

Но в этом случае без МК не обойтись,или огород городить придётся.

Но можно сделать и кривее,на вЫход подцепить RC цепочку,далее получившееся напряжение

подать на подобную схему(только придётся мазохистски подобрать диодики в делителе индикатора)

751064c79e1b.jpg

ну а вместо светодиодов подцепить реле.

Ну и ещё немного логики добавить,в общем фигня выйдет.

Изменено пользователем alend
Ссылка на комментарий
Поделиться на другие сайты

croc19 Я не имею ничего против AVR.

alend Ваш вариант мне очень понравился, чем скважность замерять, какую МК взять, и как реле выставлять? Не будет ли одинаковая скважность при замыкании ключей одинакового сопротивления на разных блоках?

Ссылка на комментарий
Поделиться на другие сайты

Если мк применять, то не нужно что то добавлять. На мк взять два канала с ацп.

Подключить их к точкам А и В. Вывод А переключаешь на выход, на В меряешь

напряжение. Затем наоборот. В зависимости от нажатой кнопки, управляешь

реле. Или мудрить что то на жеской логике. Я бы предпочел МК.

Ссылка на комментарий
Поделиться на другие сайты

<p>т.е. Как и писал khal, взять ардуину?</p>

Других вариантов, что бы и компактно и то что нужно нет?

Изменено пользователем max1287
Ссылка на комментарий
Поделиться на другие сайты

взять ардуину

Так ардуина на AVR и собрана.

Нужно определиться на чем вы можете писать программу.

На том и нужно собирать.

LM3914 тоже вариант.

Ну и много непонятностей, что вы хотите получить.

Ссылка на комментарий
Поделиться на другие сайты

Григорий Т.

Есть вариант использовать LM3914.

Можете пояснить каким образом?

croc19

Так ардуина на AVR и собрана.

Я знаю, поэтому и написал.

Нужно определиться на чем вы можете писать программу.

Для меня не проблема писать на C++, как и на любом другом ЯП.

Ну и много непонятностей, что вы хотите получить.

Что вам не понятно? Готов ответить на все вопросы.

Ссылка на комментарий
Поделиться на другие сайты

Ну тогда не проблема.

Если нужно просто включать 10 реле 10 кнопками, берете протеус, среду програмирования

АВРок, рисуете схему в протеусе, например на атмеге 8. Пишите программу.

Отлаживаете в протеусе. Изготавливаете вживую. Если удобнее на ардуине,

то пишите программу на ее языке.

Нарисовал в протеусе схему. Нажатие кнопок с резисторами 1,6к и 4,3к не отличаются.

Проверьте еще раз резисторы без кнопок. Номиналы и так ли подключены.

Еще по подключению клавиатуры к блоку. Просто два провода или они в экране.

На схеме я пририсовал два сопротивления. Логичнее было бы если ваши резисторы

без кнопок сидели на земле.(на заземленном экране) Тогда кнопки легко определялись

бы по напряжению.

А мною пририсованные были бы не нужны.

Ссылка на комментарий
Поделиться на другие сайты

Если использовать ШИМ на 555 таймере и ко всему измерять напряжение на выходе RC цепочки,то вероятно придётся строить 10 каналов отрабатывающих на конкретное напряжение,-которое получается на выходе RC цепочки!

Можно образовать канал следующим способом, берём сдвоенный ОУ например LM358, строим из них два компаратора настроенные на определённый порог срабатывания +/- от уровня напряжения (при замыкании одной из 10 кнопок),затем выходы этих компараторов подключаем к элементу 2И,-выход которого подключаем к ключу-транзистору управляющему реле канала.

И того при использовании сдвоенного ОУ в одном корпусе и 4 элементов 2И в одном корпусе,получается что,-на 10 каналов уйдёт 10 штук LM358 или (5 штук IL324 счетверённый ОУ) и 3 микросхемы с четырьмя элементами 2И или 2И-НЕ, ну и 10 транзисторов!-не забываем про 20 подстроечных резисторов в каналах с компараторами.

Если умудриться пристроить LM3914 в режиме "бегущей точки", то компараторы и логику можно откинуть,но как настраивать отработку каждой "точки" на конкретное напряжение Х.З.

Ссылка на комментарий
Поделиться на другие сайты

Однозначно. По другому, куча проблем вылезет, типа дребезг контактов...

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Запустил в протеусе с 10ком и 1ком на землю. Получилось такое распределение

напряжений. 4.62в - 3.79 - 2.95 - 2.10 - 1.25

Можно при обработке данных от ацп сузить диапозоны напряжений для

кнопок. Тогда возможно получится отфильтровывать нажатия двух

кнопок.

А дополнительные резисторы скорее всего для определения подключена

клава или нет.

Изменено пользователем croc19
Ссылка на комментарий
Поделиться на другие сайты

Поставил на выходы PB0-PB7 и на PD0-PD2 светодиоды с резисторами на землю. Проверил, светодиоды загораются когда отправляешь на порт "1". Но как не пытался подключить кнопки к АЦП-шным входам так ничего и не получилось снять. Может подскажете, как подключить эти кнопки к ATMEGA8?

Ссылка на комментарий
Поделиться на другие сайты

К сожалению я не пишу на Си. Я пишу на Алгоритм Билдере.

На Си много примеров в нете. И много хороших описаний АЦП.

У атмег АЦП одинаковое. Можно не только атмега 8 смотреть.

Можно и 16,32 и 128.

Ссылка на нашем сайте.

http://forum.cxem.ne...howtopic=114147

Выкладывайте проект протеуса и программу.

Будем делать.

Изменено пользователем croc19
Ссылка на комментарий
Поделиться на другие сайты

Вроде что-то нарисовал. Вот ссылка на проект протеуса: http://1drv.ms/1cr3mWl . Посмотрите пожалуйста, что то я совсем не уверен. При демонстрации как-то медленно переключается полярность...

Вот отдельно схема:

66d914cfcef2.png

И исходный код программы:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void ADC_init()
{
//воспользуемся значениями регистров, определенными ранее
	 ADMUX = 0x00;
	 ADCSRA = 0x8D;
}
//функция получает в качестве аргумента номер канала и возвращает значение на входе
unsigned int ADC_result(unsigned char adc_input)
{
	 ADMUX=adc_input|(ADMUX & 0xF0);
//задержка для стабилизации входного напряжения
	 _delay_us(10);
//начинаем преобразование (ADSC = 1)
	 ADCSRA|= 0x40;
	 while((ADCSRA & 0x10)==0); //ждем, пока АЦП закончит преобразование (ADIF = 0)
    ADCSRA|=0x10;//устанавливаем ADIF
    return ADCW;//ADCW - содержит ADCH и ADCL как нам нужно
}
int main (void)
{
   DDRB=0xFF;
DDRD=0b11000000;
DDRC=0b00110000;
 double U;
 ADC_init();
while (1)
{
 PORTD=0b10000000;
 U=0.0049*ADC_result(0);
 if ((U>=3.1)&&(U<=3.4)) {PORTB=0b00000001;}
 else{
  if ((U>=0.8)&&(U<=0.9)) {PORTB=0b00000010;}
  else{
   if ((U>=2.6)&&(U<=2.7)) {PORTB=0b00000100;}
   else{
 if ((U>=2.0)&&(U<=2.1)) {PORTB=0b00001000;}
 else{
  if ((U>=1.4)&&(U<=1.5)) {PORTB=0b00010000;}
  else{ PORTB=0;}}}}}
 PORTD=0b01000000;
 U=0.0049*ADC_result(1);
 if ((U>=3.1)&&(U<=3.4)) {PORTB=0b00100000;}
 else{
  if ((U>=0.8)&&(U<=0.9)) {PORTB=0b01000000;}
  else{
   if ((U>=2.6)&&(U<=2.7)) {PORTB=0b10000000;}
   else{
 if ((U>=2.0)&&(U<=2.1)) {PORTC |= _BV(PC4);}
 else{
  if ((U>=1.4)&&(U<=1.5)) {PORTC |= _BV(PC5);}
  else{ PORTB=0; PORTC &= ~_BV(PC4); PORTC &= ~_BV(PC5); }}}}}
}
 return 0;
}

Ссылка на комментарий
Поделиться на другие сайты

Чем так включать транзисторы, лучше обойтись вообще без них. Там максимальный ток всего 5 мА.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Прекрасно.

Уберите резисторы у светодиодов. Они не нужны. Протеус и так

смоделирует. А время на расчет резисторов тратить не будет.

Щелкаешь правой кнопкой на светодиоде. В открывшемся меню

нажимаешь ЕДИТ ПРОПЕРТИЕС. В строчке МОДЕЛ ТЕЙП пееереключаешь

АНАЛОГ на ДИГИТАЛ. Соответственно программа не будет обсчитывать

ток светодиода и будет моделировать быстрее. Делаешь так с каждым

светодиодом.

Убираешь транзисторы.

Алгоритм такой. Выставляешь РС0 на выход. Выдаешь в него единицу.

АЦП настраеваешь на РС1. Считываешь. Получаешь значение для левой

половины кнопок.

Затем меняешь наоборот. РС1 на выход - в единицу. С РС0 считываешь

напряжение правой половины.

Изменено пользователем croc19
Ссылка на комментарий
Поделиться на другие сайты

Вот немного поправил:

490fc3613157.png

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

Вот код:

#include <avr/io.h>
#include <util/delay.h>
#define Rac 1000; //сопротивление на землю
#define Aud -8543.553; //коэффициенты ВАХ BAS21(приближенно)
#define Bud 76.35;  //коэффициенты ВАХ BAS21(приближенно)
#define Cud 0.132;  //коэффициенты ВАХ BAS21(приближенно)
void ADC_init()
{
//воспользуемся значениями регистров, определенными ранее
	 ADMUX = 0x00;
	 ADCSRA = 0x8D;
}
//функция получает в качестве аргумента номер канала и возвращает значение на входе
unsigned int ADC_result(unsigned char adc_input)
{
	 ADMUX=adc_input|(ADMUX & 0xF0);
//задержка для стабилизации входного напряжения
	 _delay_us(10);
//начинаем преобразование (ADSC = 1)
	 ADCSRA|= 0x40;
	 while((ADCSRA & 0x10)==0); //ждем, пока АЦП закончит преобразование (ADIF = 0)
    ADCSRA|=0x10;//устанавливаем ADIF
    return ADCW;//ADCW - содержит ADCH и ADCL как нам нужно
}
int main (void)
{
   DDRB=0xFF;//порты на выход
DDRC=0b00110000;//еще 2 порта на выход
double U,Uref,R,I,R0;//измеряемое напряжение, опорное напряжение, сопротивление включенного резистора, сила тока, сопротивление всей ветки
ADC_init();
while (1)
{
 Uref=0.0049*ADC_result(2);    //считываем опорное напряжение
 DDRC|=1<<1;	    //устанавливаем первый порт на вывод
 PORTC |= _BV(PC1);	  //устанавливаем в первом порту 1
 DDRC&=~(1<<0);	   //устанавливаем нулевой порт на чтение
 PORTC&=~(1<<0);	   //обнуляем порт
 U=0.0049*ADC_result(0);	 //считываем напряжение
 I=U/Rac;	    //находим силу тока
 Uref=Uref-I*I*Aud;	  //
 Uref=Uref-I*Bud;	  //корректируем опорное напряжение падением напряжения на диоде, согласно ВАХ
 Uref=Uref-Cud;	   //
 R0 = (Uref-U)/U*Rac;	 //находим общее сопротивление
 R = R0/(10000-R0)*10000;    //находим сопротивление кнопки
 if ((R>=60)&&(R<=150)) {PORTB=0b00000001;}//сравниваем
 else{
  if ((R>=730)&&(R<=780)) {PORTB=0b00000010;}
  else{
   if ((R>=310)&&(R<=360)) {PORTB=0b00000100;}
   else{
 if ((R>=4200)&&(R<=4400)) {PORTB=0b00001000;}
 else{
  if ((R>=1500)&&(R<=1700)) {PORTB=0b00010000;}
  else{ PORTB=0;}}}}}  //если не одна не подходит, сбросить все

 Uref=0.0049*ADC_result(2);    //считываем опорное напряжение
 DDRC|=1<<0;	    //устанавливаем нулевой порт на вывод
 PORTC |= _BV(PC0);	  //устанавливаем в нулевом порту 1
 DDRC&=~(1<<1);	   //устанавливаем первый порт на чтение
 PORTC&=~(1<<1);	   //обнуляем порт
 U=0.0049*ADC_result(1);	 //считываем напряжение
 I=U/Rac;	    //находим силу тока
 Uref=Uref-I*I*Aud;	  //
 Uref=Uref-I*Bud;	  //корректируем опорное напряжение падением напряжения на диоде, согласно ВАХ
 Uref=Uref-Cud;	   //
 R0 = (Uref-U)/U*Rac;	 //находим общее сопротивление
 R = R0/(10000-R0)*10000;    //находим сопротивление кнопки
 if ((R>=60)&&(R<=150)) {PORTB=0b00100000;}//сравниваем
 else{
  if ((R>=730)&&(R<=780)) {PORTB=0b10000000;}
  else{
   if ((R>=310)&&(R<=360)) {PORTB=0b01000000;}
   else{
 if ((R>=4200)&&(R<=4400)) {PORTC |= _BV(PC4);}
 else{
  if ((R>=1500)&&(R<=1700)) {PORTC |= _BV(PC5);}
  else{ PORTB=0;PORTC &= ~_BV(PC4); PORTC &= ~_BV(PC5);}}}}}//если не одна не подходит, сбросить все
}
 return 0;
}

Проект протеуса: http://1drv.ms/1jPzTVK

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...