Skocz do zawartości

Błąd w programie - maksymalna wartość na wyświetlaczu


SebaSaper

Pomocna odpowiedź

Witam forumowiczów.

dodam,że dopiero się uczę więc proszę o wyrozumiałość.

Mam problem dotyczący programu otóż jestem w trakcie budowy modułu watomierza .

Problem dotyczy tego,że cały czas mam wyświetlane maxymalne napięcie na ekranie podpowie ktoś co napisałem żle .

  int odczytanaWartosc = 0;//Odczytana wartość z ADC
  float napiecie = 0;//Wartość przeliczona na napięcie w V
  float Moc = 0;
#include <openGLCD.h>

#define ANALOG_PORT 5 //A0
#define ANALOG_PORT 4 //A0
 
//http://forum.arduino.cc/index.php?topic=45042.0
float fmap(float x, float in_min, float in_max, float out_min, float out_max){
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
 
float a0ToCurrent_mA(float a0){
  //float _r = 99.3 / (1715 * 0.0015)
  float _r = 38.6005;
  float _a0ref   = a0-0.0392;
  float _current = _a0ref * _r;
  return _current;
   
}
void setup()
{
   analogReference( INTERNAL );
  // Initialize the GLCD 
  GLCD.Init();

 // Select the font for the default text area
  GLCD.SelectFont(System5x7);
  GLCD.CursorTo(5, 1);
  GLCD.print("AMPEROMIERZ"); 
}

void loop()
{
  odczytanaWartosc = analogRead(A4);//Odczytujemy wartość napięcia
  napiecie = odczytanaWartosc * (21.5/1024.0);
  
 int _a0 = analogRead(A5);
  float _atov = fmap(_a0, 0, 1023, 0.0, 1.1);
  
  Moc = napiecie * a0ToCurrent_mA(_atov);
  
  // (note: line 1 is the second row, since counting begins with 0):
  GLCD.CursorTo(0, 2);
  GLCD.print( "Volt op: " );
  GLCD.CursorTo(8, 2);
  GLCD.println( _atov, 4 );
  GLCD.CursorTo(0, 3);
  GLCD.print( "Current: ");
  GLCD.CursorTo(8, 3);
  GLCD.println( a0ToCurrent_mA(_atov));
  GLCD.CursorTo(0, 4);
  GLCD.print( "NAPIECIE:");
  GLCD.CursorTo(9, 4);
  GLCD.println(napiecie);
  GLCD.CursorTo(0, 5);
  GLCD.print( "Moc:");
  GLCD.CursorTo(9, 5);
  GLCD.println(Moc);
  delay( 700 );
}

Z góry dziękuję za każdą podpowiedz .

Link do komentarza
Share on other sites

@SebaSaper trochę ciężko analizować program, jeśli nie wiemy czym on dokładnie jest (nie wiemy nic o sprzęcie). Upewniłeś się jednak, że informacja na wejściu układu faktycznie się zmienia? Mierzyłeś miernikiem napięcie na wejściach A4 i A5?

Link do komentarza
Share on other sites

Projekt to miernik panelowy do zasilacz warsztatowego 5-19.5v, 40A

 

Oparty jest ma arduino uno boczniku i wzmaczniczu operacyjnym do pomiaru prądu i dzielniku napięcia do pomiaru napięcia wszystko jest ok dzielnik działa poprawnie , napięcie z dzielnika doprowadzam do pinu A4 arduino problem w tym, gdy zasilacz jest wyłączony wyświetlane napięcie jest poprawne 0.00v a gdy włączę zasilacz bez znaczenia jakie ustawie napięcie na lcd nam wyświetlane ciągle 19,5v

Link do komentarza
Share on other sites

Aktualnie na zasilaczu ustawiłem dokładnie 5v a na LCD wyswietla się 21.48v wydaje mi się że gdzieś w programie jest błąd lub jakiś konflikt 

Volt op to odczyt z A4 z szyny pomiaru napięcia  służy tylko do wyskalowania amperomierza  

Na podstawie napięcia i prądu jest wyliczana moc  działa poprawnie , nie bierz pod uwagę wachań prądu i mocy na zdjęciu to przez nie stabilne napięcie z wzmacniacza operacyjnego  z bocznika pomiaru prądu

IMG_20191227_193837.jpg

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Przede wszystkim:

Wrzuć gdzieś (najlepiej za odczytem z A5) coś w stylu:

Serial.print(odczytanawartosc);
Serial.print(" ");
Serial.println(_a0);

i sprawdź, co wyświetla monitor. Zobaczysz, czy to kwestia programu czy elektryki.

A naukę zacznij od lekcji pierwszej: zawsze rozwiązujesz jeden problem, nigdy dwa na raz.

 

Przy okazji: wyjaśnij, co znaczą te linie:
 

#define ANALOG_PORT 5 //A0
#define ANALOG_PORT 4 //A0

 

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Te linijki są nie istotne były do własnych celów teraz kod wygląda tak

  int odczytanaWartosc = 0;//Odczytana wartość z ADC
  float napiecie = 0;//Wartość przeliczona na napięcie w V
  float Moc = 0;
#include <openGLCD.h>


 
//http://forum.arduino.cc/index.php?topic=45042.0
float fmap(float x, float in_min, float in_max, float out_min, float out_max){
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
 
float a0ToCurrent_mA(float a0){
  //float _r = 99.3 / (1715 * 0.0015)
  float _r = 38.6005;
  float _a0ref   = a0-0.0392;
  float _current = _a0ref * _r;
  return _current;
   
}
void setup()
{
    Serial.begin(9600);
   analogReference( INTERNAL );
  // Initialize the GLCD 
  GLCD.Init();

 // Select the font for the default text area
  GLCD.SelectFont(System5x7);
  GLCD.CursorTo(5, 1);
  GLCD.print("AMPEROMIERZ"); 
}

void loop()
{
  odczytanaWartosc = analogRead(A4);//Odczytujemy wartość napięcia
  napiecie = odczytanaWartosc * (21.5/1024.0);
  
 int _a0 = analogRead(A5);
  float _atov = fmap(_a0, 0, 1023, 0.0, 1.1);
  
Serial.print("odczytanaWartosc;");
Serial.print(odczytanaWartosc);
Serial.print("a0;");
Serial.println(_a0);
  
  Moc = napiecie * a0ToCurrent_mA(_atov);
  
  // (note: line 1 is the second row, since counting begins with 0):
  GLCD.CursorTo(0, 2);
  GLCD.print( "Volt op: " );
  GLCD.CursorTo(8, 2);
  GLCD.println( _atov, 4 );
  GLCD.CursorTo(0, 3);
  GLCD.print( "Current: ");
  GLCD.CursorTo(8, 3);
  GLCD.println( a0ToCurrent_mA(_atov));
  GLCD.CursorTo(0, 4);
  GLCD.print( "NAPIECIE:");
  GLCD.CursorTo(9, 4);
  GLCD.println(napiecie);
  GLCD.CursorTo(0, 5);
  GLCD.print( "Moc:");
  GLCD.CursorTo(9, 5);
  GLCD.println(Moc);
  delay( 700 );
}

Na porcie szeregowym mamy taki odczyt  15774903109431313806316.thumb.jpg.53444cf718b74e7f8f9bbb561675f6d4.jpg

Właśnie odczyt z pierwszej pozycji trochę mnie martwię bo najpierw A4 jest podpięte do masy i mam ładne zero a po podaniu na A4 3.3v z Arduino  mam 1023

Edytowano przez SebaSaper
Podanie dodatkowych informacji
Link do komentarza
Share on other sites

Hm... zastanówmy się chwilę.

Przetwornik ma 10 bitów, czyli zakres od 0 do 1023.

Zakres napięcia mierzonego przez przetwornik to od 0 do 1.1V.

Po podaniu zera na wejście przetwornika mamy na wyjściu zero.

Po podaniu 3.3V na wejście... no, ile będzie?

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.