Arduino Nano проблемы с АЦП
- Войдите на сайт для отправки комментариев
Вс, 17/06/2018 - 15:45
Есть Arduino Nano, считывал значения с АЦП (использовал обычную батарейку, там было около 1,25 В), однако после нескольких экспериментов значения на АЦП стали рандомные. Так произошло с 2 платами Можно ли как то определить, действительно ли сгорел АЦП или это что-то другое?
И от чего могло такое произойти, полярность батарейку четко перед подключением каждый раз проверяд. Еще используется вход D3, которые применяется для сухого контакта.
На плате есть и 5 Вольт и 3.3 Вольта .
Что показывает при их подаче на вход АЦП?
1023 и 675 ?
Гарантия что вы не сможете попутать полярность 100% ;)
Куда смотрел мину батарейки?
Вообще, давайте схему, скетч и копипасту печати в монитор порта. Без них рахговор в пользу бедных.
Подсоединил пины 5V и 3.3V к аналоговому входу. Попробовал считать, при 5В выдает плавную ниспадающую линию от 2 до 1,7 В. При подключении 3,3В вобще рандомные значения в виде пилы.
На счет гарантии не знаю, но как-то давно на этом обжогся, поэтому с тех пор контролирую это.
Можно ли с помощью мультиметра замерять напряжение на этих пинах? Куда тогда подключать тот конткат, что должен идти на землю? На GND ардуино?
#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; } }У меня программа связана с MATLAB, там используется графический интерфейс. Просто за последний день сгорели две платы (АЦП), хотя все делал также как и ранее... Еще такой вопрос, могут ли быть проблемы, если я использую другой шнур USB-miniUSB?
Вот такое выдает если подкинуть на вход 3.3. Это уже пересчет значений в напряжение, но там все расчитывается и передается правильно. Я так понял, если наблюдается подобное это точно сгорел АЦП...
Сгорело не после нажиманий на кнопку?
У вас пин кнопки устанавливается в HIGH в строке 025
digitalWrite(buttonPin,HIGH);Я не знаю как реализована функция digitalWrite, но мне кажется, что перед записьюпорт настраивается на вывод. тогда скорее всего мк сгорел.С этим как раз проблем никогда не было, такая реализация кнопки работала четко и неоднократно. Видел где-то в гайдах подобное.
Тогда чота в программе.
Было бы неплохо для начала просто подключить к входу ацп +5 и потом +3,3 в с контактов же ардуинки.
И прочитать значения. Без программы вашей.
digitalWrite(buttonPin,HIGH);Я не знаю как реализована функция digitalWrite, но мне кажется, что перед записьюпорт настраивается на вывод. тогда скорее всего мк сгорел.Если порт в Input, то установка его в High включает подтяжку. Т.е. две строки эквивалентны одной инициализации в режиме Input_Pullup
digitalWrite(buttonPin,HIGH);Я не знаю как реализована функция digitalWrite, но мне кажется, что перед записьюпорт настраивается на вывод. тогда скорее всего мк сгорел.Если порт в Input, то установка его в High включает подтяжку. Т.е. две строки эквивалентны одной инициализации в режиме Input_Pullup
Да, это так. я уже прочитал описание функции :)
С этим как раз проблем никогда не было, такая реализация кнопки работала четко и неоднократно. Видел где-то в гайдах подобное.
такое вы могли увидеть только в неграмотных гайдах. Правильное подключение кнопки - через резистор в 500-1000 Ом. У нас на форуме есть обучающая тема про кнопки - почитайте, там это есть.
Подсоединил пины 5V и 3.3V к аналоговому входу. Попробовал считать, при 5В выдает плавную ниспадающую линию от 2 до 1,7 В. При подключении 3,3В вобще рандомные значения в виде пилы.
На счет гарантии не знаю, но как-то давно на этом обжогся, поэтому с тех пор контролирую это.
Можно ли с помощью мультиметра замерять напряжение на этих пинах? Куда тогда подключать тот конткат, что должен идти на землю? На GND ардуино?
1. Я не знаю какую линию выдаёт ваш АЦП.
Мой выдаёт числа от 0 до 1023.
2. Судя по вашему вопросу про землю мультиметра
я на 99 процентов уверен что вы попробовали с батарейкой:
а если наоборот плюс-минус.
И так два раза.
Сознайтесь ! Да?