Аналог в цифру

gogas
Offline
Зарегистрирован: 18.11.2019

Здравствуйте! Необходимо написать скетч, желательно для Ардуино-нано (размеры имеют значение). Необходимо преобразовывать входной аналоговый сигнал от 0 до 8 вольт (с переменного резистора). Шаг измерения 0,1 В. А преобразовать его необходимо в параллельный статичный код на цифровых выходах. Измерения необходимо проводить не больше 5-10 раз в секунду.

Я понимаю, что Ардуино измеряет от 0 до 5 вольт, поэтому необходимо делать делитель напряжения на входе. Например в 2 раза. Тогда входной сигнал будет изменяться от 0 до 4 вольт, следовательно и шаг измерений надо делать уже не 0,1, а 0,05. Аппаратная часть не проблема. Нужна программа и объяснения как она работает, если мне необходимо будет изменить шаг измеряемого напряжения или диапазон.

negavoid
Offline
Зарегистрирован: 09.07.2016
// !!! pseudocode !!!
void setup()
{
  pinMode(A0,INPUT);
}

void loop()
{
  word val = analogRead(A0);
  portd = (low) val;
  portb = (high) val;
}

 

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

С курсовиками - это не сюда. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

negavoid пишет:

// !!! pseudocode !!!
void setup()
{
  pinMode(A0,INPUT);
}

void loop()
{
  word val = analogRead(A0);
  portd = (low) val;
  portb = (high) val;
}

 

Низачёт! Нада в вольтах!

не только, а delay(7300); ???

Green
Offline
Зарегистрирован: 01.10.2015

Тут скорее теоретиЦки. Можно ж ведь добавить перерасчёт, типа adc2v(val) и всё.

gogas
Offline
Зарегистрирован: 18.11.2019

Добрый вечер! Да какие курсовики, я уже давно на пенсии. В силу того, что первым и последним языком программирования в ВУЗе был PL-1 (если не ошибаюсь), то мне трудно написать скетч. Можно было бы сделать мою хотелку на LM3914, но мне не хватает количества выходов.

 

gogas
Offline
Зарегистрирован: 18.11.2019

Может быть не понятно, что я хочу. Постараюсь объяснить. От 0 до 8 вольт - это 80 шагов по 0,1 вольта. 80 в двоичном это 7 разрядов. Вот мне и надо, чтобы 0 это было на цифровых выходах 0000000, 0,1 - 0000001, 0,2 - 0000010 и т.д.

Onkel
Offline
Зарегистрирован: 22.02.2016

Пишите ydom@mail.ru  сделаю. Как пенсионер пенсионеру по льготному курсу...

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

gogas пишет:

Может быть не понятно, что я хочу. Постараюсь объяснить. От 0 до 8 вольт - это 80 шагов по 0,1 вольта. 80 в двоичном это 7 разрядов. Вот мне и надо, чтобы 0 это было на цифровых выходах 0000000, 0,1 - 0000001, 0,2 - 0000010 и т.д.


/* Переносим значение с аналогового входа (возможные значения от 0 до 1023) в 8 бит (0..255) */
void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 80);
}

резистор от цепи 8 вольт на пин А0 3 килоома, резистор с пина А0 на землю 5 килоом

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ua6em пишет:

gogas пишет:

Может быть не понятно, что я хочу. Постараюсь объяснить. От 0 до 8 вольт - это 80 шагов по 0,1 вольта. 80 в двоичном это 7 разрядов. Вот мне и надо, чтобы 0 это было на цифровых выходах 0000000, 0,1 - 0000001, 0,2 - 0000010 и т.д.


/* Переносим значение с аналогового входа (возможные значения от 0 до 1023) в 8 бит (0..255) */
void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 80);
}

резистор от цепи 8 вольт на пин А0 3 килоома, резистор с пина А0 на землю 5 килоом

 

А вывод в двоичном коде на 7 ног где?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ua6em пишет:

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

7-то ног есть. И даже больше. Зачем чего-то терять?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Вот, например.

#define A_INPUT    A0  //пин для измерения напряжения
#define MAX_OUT    80  //Максимально выводимое число в двоичном коде
#define OUT_0      2   //пин с которого начинается вывод двоичных данных (младший разряд)
                       //старшие разряды выводятся на последующие пины т.е OUT_0+1, OUT_0+2 ...
#define N_OUTPINS   7   //Cколько пинов используется для двоичного вывода
#define READING_8V 967  //Используя делитель 10K/1.5K получаем 1.04 В при входных 8 вольтах
                        //что должно дать 967 (1.04*1023/1.1)при чтении АЦП c опорным источником 1.1В

void setup()
{
  //Подключаем внутренний источник опорного напряжения 1.1В

  analogReference(INTERNAL);
  //делаем пару пустых чтений что бы дать опорному напряжению устаканится
  analogRead(A_INPUT);
  analogRead(A_INPUT);
  //настраиваем "двоичные" пины на выход
  for (int i = 0; i < N_OUTPINS; i++)
  {
    pinMode(OUT_0 + i, OUTPUT);
  }
}

#define SAMPLES 16
unsigned int analogReadAverage(byte pin)
{
  unsigned int acc = 0;
  for (int i = 0; i < SAMPLES ; i++)
  {
    acc += analogRead(pin);
  }
  return acc / SAMPLES;
}
void bin_out(byte b)
{
  if (b > MAX_OUT) return;
  for (int i = 0; i < N_OUTPINS; i++)
  {
    if (b & 1) digitalWrite(OUT_0 + i, HIGH);
    else digitalWrite(OUT_0 + i, LOW);
    b >>= 1;
  }
}

void loop()
{
  int val = analogReadAverage(A_INPUT);
  val = map(val, 0, READING_8V , 0, MAX_OUT);
  bin_out(val);
  delay(5000);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не, выводиться будет последовательно, а ТС ведь хотел параллельно

renoshnik
Offline
Зарегистрирован: 11.04.2013

ua6em пишет:

не, выводиться будет последовательно, а ТС ведь хотел параллельно

 

Похоже, что ТС уже ничего не хочет ...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

renoshnik пишет:

ua6em пишет:

не, выводиться будет последовательно, а ТС ведь хотел параллельно

 

Похоже, что ТС уже ничего не хочет ...

в том смысле, что...мне вчера хотелось, а нынче вот ослаб...? )))

gogas
Offline
Зарегистрирован: 18.11.2019

Всем откликнувшимся добрый вечер! Нет ТС не ослаб, ТС был в командировке и только добрался домой. Спасибо за интерес к моей проблеме.

Согласен с asam. Ничего нигде не теряется. Для моей задачи нужен один аналоговый вход (лучше 2) и вот почему.  Делаю другу на юбилей (60 лет) радиоприемник. Планируемых диапазонов 2, т.е УКВ и СВ.Для того, чтобы независимо регулировать два диапазона, необходимо сделать два верньерных устройства как, например, в промышленном приемнике типа Мелодия-102. Сделать можно, но очень сложно сделать достойно. Вот в мою голову и пришла идея заменить механику на электронику.

Поэтому входа надо 2, но шкалу можно одну, т.к при переключении диапазонов один вход можно притягивать к земле.

Почему необходимо 80 уровней? По той простой причине, что шкала имеет в длину 20 см, а реализовать хочу на светодиодных матрицах 1х8, а они имеют длину 2 см. Далее...Может что-то изменится в процессе завершения конструкции (или калибровки шкалы) и придется шкалу делать, например, 22 см. Да и варикапы не обязательно должны работать от 0 до 8 вольт. Скорее всего будет другой диапазон, м.б. от 0,8 В до 9,6 (как вариант). Но я не стал усложнять задачу, поэтому и попросил знающих людей написать пример попроще, но обязательно с пояснениями, чтобы я потом своими кривыми ручками мог поправить.

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

Т.е. по сути нужен масштабируемый вольтметр на Ардуино, только без вывода в последовательный порт. Как вариант можно последовательный порт для отладки.

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Хм, а на СВ, еще что то осталось?

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

А не проще купить за 300р Si4730 и вонзить всё это в приемник?  Там и КВ тогда появится автоматом

https://ru.aliexpress.com/i/32475083439.html

а из верньеров - тока простой энкодер 

gogas
Offline
Зарегистрирован: 18.11.2019

Мы не ищем легких путей! Уже сделано полностью на лампах. Но речь в топике не о выборе схемных решений. Речь о помощи, либо написании за вознаграждение программы.

Green
Offline
Зарегистрирован: 01.10.2015

Так вам не двоичном виде нужно, а в виде "бегающего" светодиода. htpicc@gmail.com

gogas
Offline
Зарегистрирован: 18.11.2019

Двоичный код можно дешифровать

Green
Offline
Зарегистрирован: 01.10.2015

Много проводов. Обычно это делается на сдвиговых регистрах, которые легко наращиваются.

gogas
Offline
Зарегистрирован: 18.11.2019

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

Можно и на адресных светодиодах, но боюсь все это нужно будет экранировать. Поэтому не хочется усугублять изначально.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Можно увидеть предполагамую схему связки ардуино-светодиоды-варикапы итд? Хотябы в упрощенном виде. А то, пока все как-то туманно слишком.

gogas
Offline
Зарегистрирован: 18.11.2019

gogas
Offline
Зарегистрирован: 18.11.2019

Добрый вечер! Это не сложно. Может я и не прав.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

gogas пишет:

Добрый вечер! Это не сложно. Может я и не прав.

Естественно не правы, с разрешениями на DC напутали, на DC1 его вообще нет

gogas
Offline
Зарегистрирован: 18.11.2019

Да вроде ничего не напутал. Я же рисую в общих чертах. Вот подробнее.

gogas
Offline
Зарегистрирован: 18.11.2019

Или так.

gogas
Offline
Зарегистрирован: 18.11.2019

Вот еще вариант. Комплект микросхем ~200 руб.

gogas
Offline
Зарегистрирован: 18.11.2019

Дело не в схемотехнике. У меня другая проблема. Она озвучена в начале моих сообщений.

rkit
Offline
Зарегистрирован: 23.11.2016

Если подключить делитель к переменному резистору, то выход получится искаженный как на делителе, так и на резисторе. А исходя из того, что там уже есть какие-то 8 вольт, то резистор встроен в другую схему, скорее всего. А раз так, то он вполне может плавать относительно шин питания (например, если это усилитель). Короче, ты явно поторопился с "Аппаратная часть не проблема.".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
gogas
Offline
Зарегистрирован: 18.11.2019

Если честно, не очень понял, что Вы хотели сказать. Но делитель легко сделать любой.

gogas
Offline
Зарегистрирован: 18.11.2019

Понял, спасибо. Буду пробовать.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А зачем делать дедитель? Если это простой сдвоенный переменный резистор, то подключить его к 5В Ардуино и н чего делить не надо.

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

gogas пишет:

Да вроде ничего не напутал. Я же рисую в общих чертах. Вот подробнее.

 

Мне кажется, что проще сделать на сдвиговых регистрах типа 74HC595 соединенных каскадом. И зажигать светодиоды, тогда, можно будет не только по одному, но ив любой комбинации.

Green
Offline
Зарегистрирован: 01.10.2015

Регистры уже было, но дядя хочет не шуметь.) А как тут не пошумишь когда стрелку будешь двигать...