draco

не работают аналоговые входы

16 сообщений в этой теме

draco    0

помогите, пожалуйста, решить мою проблему:

имеется arduino mega2560 (китайская)

после приобретения я работал только с цифровыми входами

 

сегодня решил сделать dc вольтметр, пришлось задействовать аналоговый вход

в процессе отладки выяснил, что на всех входах (проверял в цикле) постоянно значение 1023 (или 5v в зависимости от интерпретации кода) и при подаче напряжения и без

тестовое напряжение никогда не превышало 5в

 

что с платой, или что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
oldmao    1 468

А ты вход с общим проводом (GND) соедини. Если получишь ноль - значит, вход работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

draco    0

вариантов много...

вот из самого простого, кажется..

int analogPin = A0;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
}
void loop() {
  int rawReading = analogRead(analogPin);
  float volts = rawReading / 204.6;
  Serial.println(volts);
  delay(1000);
}

в экране монитора: 5.0 5.0 ...

подключал с ардуино на A0: 5v, 3.3v, gnd, все равно 5.0 5.0 ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
oldmao    1 468

А измерьте-ка напряжение на AREF. 

И для полноты картины сделайте вывод просто полученных с АЦП данных, без пересчёта в вольты. То есть Serial.println(rawReading);

PS нашёл ошибку в скетче: 
int analogPin = A0; НЕПРАВИЛЬНО!
Правильно: int analogPin = 0;

PPS и хорошим тоном будет использовать для обзывания пина не переменную (памяти в ардуинке и так мало), а #define.

Изменено пользователем oldmao

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
draco    0

со всех входов данные выводил без пересчета в цикле - все постоянно 1023

напряжение в ближайшее время проверю

P.S. мультиметр не со мной еще дней 10 ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    4

на сколько я пробовал аналоговые пины объявлять не нужно (по крайней мере в ардуино), без вот этого pinMode(A0, INPUT); должно работать, сталкивался с подобным, после объявления такая же ситуация была

#define in A0
void setup() {
  Serial.begin(9600);
}
void loop() {
  int rawReading = analogRead(in);
  float volts = rawReading / 204.6;
  Serial.println(volts);
  delay(1000);
}

 

Изменено пользователем 3d_killer

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
draco    0
В 15.12.2017 в 15:18, oldmao сказал:

А измерьте-ка напряжение на AREF. 

 

измерил между AREF и GND - 0v

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
draco    0

и?

11 минуту назад, oldmao сказал:

Вот и причина. 

что это означает, и возможно ли решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
oldmao    1 468

Разумеется! Смотрим, что там висит на AREF, затем читаем даташит на МК, как там включается внутренний образцовый источник или сколько можно подать от внешнего (обычно допускается до напряжения питания).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
draco    0

то есть, предлагаете подать внешнее опорное?

указание в коде параметров analogReference() не дает никакой разницы, ни при считывании analogRead(A0) (всегда 1023), ни при замере напр-я м/д aref / gnd (всегда 0)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
oldmao    1 468

Так приведите решение, чтобы другие на эти же грабли не наступали.

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: AronIIStone
      Добрый день
      Возникла ситуация: имеется ноутбук IBM ThinkPad t20 с запароленым Bios. Пароль никто не помнит, но он зашит в 24rf08. Его можно прочитать програмкой для считывания данной микросхемы, но для этого нужен программатор. Можно ли использовать в качестве такого программатора Ардуино, чтобы он вопринимался этой программой как надо, и если можно, то как нужно подключить их и какой скетч залить в ардуинку? 
      Саму программу выложу чуть позже, если необходимо - с мобильника сижу. 
      Спасибо 
    • Автор: myhhyk
      Всем здравствуйте. Захотелось считать,в целях саморазвития, информацию с чипа DS2430A и заодно освоить способ связи по однопроводной шине. Посмотрел даташит, много гуглил, вроде более менее понял.С чипом можно связаться по интерфейсу 1-wire. И я решил попробовать это провернуть с помощью ардуины. Написал скетч. Пока получается только считать сигнал присутствия ведомого на шине,а считать из памяти ничего не получается,выдаются одни единицы.Пробовал менять РОМ команды,начинать со старшего бита,младшего,всё равно ничего не получается .Нужна хэлпа, подскажите пожалуйста, где мог допустить ошибку в скетче. И еще если можно мб какую нибудь литературу.
      /*Подключить пин Мастера надо через полевой транзистор, чтобы отпускать линию было проще   для прерывания будет использоваться пин №2 на плате(0 по обозначению)   Подключаемся к DS2430A*/ unsigned long save;//переменная для хранения времени byte pinMas = 5;//пин мастера volatile byte pinRead = 6;// пин для чтения линии volatile boolean infa = 1;//пин для хранения состояния линии byte adr[256] = {};//массив для хранения данных int i; /***********************************************************/ void reader() //для записи состояния линии {   infa = digitalRead (pinRead);//  считвываем состояние линии } /***********************************************************/ void pulseReset() {   delayMicroseconds(480);//заряжаем линию, ждём 500 мкс   /*___________________________________________________________________*/   digitalWrite(pinMas, 0); //подаем 0, открываем полевик=опускаем линию на ноль   delayMicroseconds(480);//ждём 480 мкр   digitalWrite (pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию   infa = 1;//чтобы в значение линии не сохранился ноль, когда линию дёргает ведущий   delayMicroseconds (15);//ждём переходный процесс 15 мкр   /*___________________________________________________________________*/   save = micros();   while (micros() - save < 240) {};//Здесь должно сработать прерывание и сохранение значения переменной   Serial.print("Presence = ");//выводим состояние линии, если ведомый опустит линию, то   Serial.println(infa);       //в infa запишется ноль } void comWr0()//передача нуля { digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль   delayMicroseconds(80);//ждём 80 мкc   digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию   delayMicroseconds(20);//ждём переходный процесс 15 мкр } void comWr1()//передача единицы {   digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс   delayMicroseconds(3);//ждём 3 мкc   digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию   delayMicroseconds(90);//ждём переходный процесс 90 мкc } int comRead() {   digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс   delayMicroseconds(2);//ждём 2 мкc   digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию   delayMicroseconds(15);   infa = digitalRead(pinRead);//читаем линию   return infa;//возвращаем значение переменной infa   delayMicroseconds(48);//ждём переходный процесс 48 мкc } void setup() {   Serial.begin(9600);   attachInterrupt(0, reader, FALLING);   pinMode(pinMas, OUTPUT);   pinMode (pinRead, INPUT);   pulseReset();   /*******************************/   //comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0();    comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1();//SKIP ROM CCh с младшего бита   /*******************************/   comWr0(); comWr0(); comWr0(); comWr0(); comWr1(); comWr1(); comWr1(); comWr1();   //comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1();   //comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); //поcылаем AAh с младшего бита   /*******************************/   comWr0(); comWr0();  comWr0();  comWr0(); comWr0(); comWr0(); comWr0();  comWr0(); //посылаем адрес   for ( i = 0; i < 256; i++) //записываем значение состояний линии в массив   { comRead();     adr[i] = comRead();     /* Serial.print("Bit");       Serial.print(i);       Serial.print(" = ");       Serial.println(adr[i]);*/   }   for (i = 0; i < 256; i++) {     Serial.print("Bit");     Serial.print(i);     Serial.print(" = ");     Serial.println(adr[i]);   } } void loop() { }
    • Автор: Kudich
      Всех приветствую!
      Сам я программирую на стандартной среде ардуинки, и в одном проекте потребовалось увеличить частоту ШИМ на портах 5,6,9,10,11,13 Arduino Micro. На этой ардуино стоит Atmega32u4, есть тут знатоки avr? Как повысить частоту на этих пинах?
    • Автор: Kirillius Labutin
      Добрый день.
      Небольшая предыстория: имеется инвертор 12DC -> 220AC с функцией подзарядки АКБ, который обеспечивает питанием оборудование для видеонаблюдения в небольшом магазинчике. Иными словами это некоторое подобие ИБП.
      Планирую сделать модуль для мониторинга инвертора, чтобы удалённо знать о пропадании электропитания и отслеживать степень разряда АКБ.
      Лезть внутрь инвертора не хочу, поэтому наличие внешнего питания я решил определять по силе и направлению тока в кабеле между инвертором и АКБ. Если есть внешнее питание - идёт зарядка и ток, допустим -1,5 Ампер, либо 0 когда АКБ заряжен. Если же внешнее питание пропадает, то инвертор нагружает АКБ и получаем ток +30-35А.
      Вопрос касается измерения такой силы тока, наиболее простым и логичным решением мне показалось использование измерительного шунта и усиление напряжения на нём с помощью операционного усилителя. В интернете нашёл такую схему:
       
      У меня совершенно нет никакого опыта работы с ОУ и я с трудом представляю как они работают. Если я правильно понял, то данная схема на выходе даст либо положительное, либо отрицательное напряжение.
      Поэтому, прошу подсказать каким образом я могу модифицировать данную схему и какие номиналы R и Rш использовать (теоретически максимально возможный ток в цепи 75А), чтобы на выходе получить постоянное напряжение в диапазоне 0-5 Вольт, при этом сам микроконтроллер и ОУ питаются от той же цепи, где производится измерение.
      P.S. Высокая точность не важна. Важно только знать ток разрядки АКБ.
      В общем виде схема примерно такая: