Arduino Nano проблемы с АЦП

maroder
Offline
Зарегистрирован: 17.06.2018

Есть Arduino Nano,  считывал значения с АЦП (использовал обычную батарейку, там было около 1,25 В), однако после нескольких экспериментов значения на АЦП стали рандомные. Так произошло с 2 платами Можно ли как то определить, действительно ли сгорел АЦП или это что-то другое?

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

На плате есть и 5 Вольт  и 3.3 Вольта .
Что показывает при их подаче на вход АЦП?
1023 и 675 ?

Гарантия что вы не сможете попутать полярность 100%  ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Куда смотрел мину батарейки?

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

maroder
Offline
Зарегистрирован: 17.06.2018

Подсоединил пины 5V и 3.3V к аналоговому входу. Попробовал считать, при 5В выдает плавную ниспадающую линию от 2 до 1,7 В. При подключении 3,3В вобще рандомные значения в виде пилы.

На счет гарантии не знаю, но как-то давно на этом обжогся, поэтому с тех пор контролирую это.

Можно ли с помощью мультиметра замерять напряжение на этих пинах? Куда тогда подключать тот конткат, что должен идти на землю? На GND ардуино?

maroder
Offline
Зарегистрирован: 17.06.2018

#include <MsTimer2.h>
#define MEASURE_PERIOD 1  // время периода измерения


int buttonState = 0;         // переменна¤ дл¤ хранени¤ состо¤ни¤ кнопки
const int buttonPin = 2;     // номер входа, подключенный к кнопке
const int ledPin =  13; 
char clk[10],timeop[10],buffer[100], startbit;
int inputCod,clk_int=0, val=0;           // код входного напряжения
 
int DATA[500], incomingByte;
int i=0,j=0,flag=0, work=0;
long previousMillis,n=0;

void (* resetFunc) (void) = 0;
            
void setup() {
  Serial.begin(9600);  // инициализируем порт, скорость 9600
 
  pinMode(A3, INPUT);
   // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);     
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT); 
   digitalWrite(buttonPin,HIGH);  
    
}

void loop() {



 if (work==0) { 
          if(Serial.available()){
            delay(100);
      
     //загон¤ем прочитанное в буфер
     while( Serial.available() && i< 99) {
        buffer[i++] = Serial.read();
     }
     //закрываем массив
     buffer[i++]='\0';
  }

//если буфер наполнен
  
  
  
  
  if(i>0){  
   
    //разбераем его на части отделенные зап¤той
   sscanf(buffer, "%[^','],%[^','],%s", &startbit, &timeop, & clk);
 // Serial.print(startbit);
 // Serial.print(clk);
 //  Serial.print(timeop);
   

do
{  
buttonState = digitalRead(buttonPin);
 if(buttonState== LOW) 
{
 if (millis() - previousMillis >2)   
       {
          previousMillis = millis();    
          val++;
       } 
}
else 
     { 
       val=0; 
     }   
} while (buttonState == HIGH && val<6);
  
  if (startbit== '!') {
    int clk_int = atoi(clk);
    int timeop_int = atoi(timeop); 
    n = timeop_int / clk_int;
   
  
 
   MsTimer2::set(clk_int,Timer2_action);                 // прерывания по таймеру, период 500 мкс
   MsTimer2::start(); 
   work=1;
     
  }  
     
        } //i>0

 }//work
if (flag==1) {
  
  for (int i=0; i<n; i++){

     char   LOWBYTE  =  (byte)(DATA[i] & 0xff);  // младший байт 
     char   HIGHBYTE =  (byte)(DATA[i] >> 8);     // старший байт = 0
//Serial.print(DATA[i]);
  Serial.print(LOWBYTE);
    Serial.flush();
   Serial.print(HIGHBYTE);
  Serial.flush();
  
 //Serial.print("\n");
 
}//for
 flag=0; 
 resetFunc();
  }//if    
  
  } //loop 

//void  timerInterupt() 
void Timer2_action()
{
   inputCod= analogRead(A3); // чтение напряжения на входе A3 //123 микросекунд   
   DATA[j]= inputCod;                                         //4 такта
   j++;
  
   if (j==n) {
   
      MsTimer2::stop();
     flag=1;
     
     
    }
   }
  
  

 

maroder
Offline
Зарегистрирован: 17.06.2018

У меня программа связана с MATLAB, там используется графический интерфейс. Просто за последний день сгорели две платы (АЦП), хотя все делал также как и ранее... Еще такой вопрос, могут ли быть проблемы, если я использую другой шнур USB-miniUSB? 

maroder
Offline
Зарегистрирован: 17.06.2018

Вот такое выдает если подкинуть на вход 3.3. Это уже пересчет значений в напряжение, но там все расчитывается и передается правильно. Я так понял, если наблюдается подобное это точно сгорел АЦП...

Bront
Offline
Зарегистрирован: 05.04.2016

Сгорело не после нажиманий на кнопку?

У вас пин кнопки устанавливается в HIGH в строке 025

   digitalWrite(buttonPin,HIGH);

Я не знаю как реализована функция digitalWrite, но мне кажется, что перед записью

порт настраивается на вывод. тогда скорее всего мк сгорел.

maroder
Offline
Зарегистрирован: 17.06.2018

С этим как раз проблем никогда не было, такая реализация кнопки работала четко и неоднократно. Видел где-то в гайдах подобное.

Bront
Offline
Зарегистрирован: 05.04.2016

Тогда чота в программе.

Было бы неплохо для начала просто подключить к входу ацп +5 и потом +3,3 в с контактов же ардуинки.

И прочитать значения. Без программы вашей.

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

Bront пишет:

   digitalWrite(buttonPin,HIGH);

Я не знаю как реализована функция digitalWrite, но мне кажется, что перед записью

порт настраивается на вывод. тогда скорее всего мк сгорел.

Если порт в Input, то установка его в High включает подтяжку. Т.е. две строки эквивалентны одной инициализации в режиме Input_Pullup

Bront
Offline
Зарегистрирован: 05.04.2016

sadman41 пишет:

Bront пишет:

   digitalWrite(buttonPin,HIGH);

Я не знаю как реализована функция digitalWrite, но мне кажется, что перед записью

порт настраивается на вывод. тогда скорее всего мк сгорел.

Если порт в Input, то установка его в High включает подтяжку. Т.е. две строки эквивалентны одной инициализации в режиме Input_Pullup

Да, это так. я уже прочитал описание функции :)

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

maroder пишет:

С этим как раз проблем никогда не было, такая реализация кнопки работала четко и неоднократно. Видел где-то в гайдах подобное.

такое вы могли увидеть только в неграмотных гайдах. Правильное подключение кнопки - через резистор в 500-1000 Ом. У нас на форуме есть обучающая тема про кнопки - почитайте, там это есть.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

maroder пишет:

Подсоединил пины 5V и 3.3V к аналоговому входу. Попробовал считать, при 5В выдает плавную ниспадающую линию от 2 до 1,7 В. При подключении 3,3В вобще рандомные значения в виде пилы.

На счет гарантии не знаю, но как-то давно на этом обжогся, поэтому с тех пор контролирую это.

Можно ли с помощью мультиметра замерять напряжение на этих пинах? Куда тогда подключать тот конткат, что должен идти на землю? На GND ардуино?


1. Я не знаю какую линию выдаёт ваш АЦП.
Мой выдаёт числа от 0 до 1023.
2. Судя по вашему вопросу про землю мультиметра
я на 99 процентов уверен что вы попробовали с батарейкой:
а если наоборот плюс-минус.
И так два раза.
Сознайтесь ! Да?