So ich habe jetzt das Programm umgebaut, so dass ich die automatisch die drei Strom-Messungen mache.
Hier mal das Programm. Es ist noch ein bischen konfuss, weil ich mache Speicherlöschungen mehrfach, also an mehreren Stellen durchführe. Bis das Resultat passt. Da muss ich noch ein bischen nacharbeiten. Aber im Moment habe ich keine Lust. Es macht das was ich will, an den feinheiten arbeite ich noch nach.
Code: Alles auswählen
/* Programm zum Servostrom messen
So kann man die max. Stromanforderung eines Servos rausfinden
Der Servo sollte eine eigene, genügend starke Spannungsversorgung haben,
dass er auch wirklich den Strom ziehen kann, den er benötigt.
Die Neustart Taste setzt slle Werte zurück,
und die Messung startet neu.
*/
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <MobaTools.h>
MoToServo meinServo;
byte servo_pos0 = 0;
byte servo_pos1 = 180;
const byte ANALOG_PIN = A0; // Hier wird der Name vom Messeingang festgelegt
const byte PosControll = A1; // Server Positions Rückmeldung. Wenn vorhanden
const int servoPin = 4; // Anschluß für den Servo
const byte Neustart = 9; // Taster um Messung neu zu starten oder ab
const byte auf = 8; // Richtung Steuern
const byte Prog1 = 10; // noch frei
const byte Prog2 = 11; // noch frei
byte Neustartstatus = 1;
byte Neustartstatus2 = 1;
byte Programmstatus = 0; // Programmauswahl Merker
byte ProgrammstatusAlt = 3; // Programmauswahl Merker alt
byte Prog1auswahl = 0;
byte Prog2auswahl = 0;
// ---------------------Einstellungen für Programm 2 ---------------------------------
byte Stufe = 0; // Schrittzähler 0 - 25 für Programm 2
const byte StufePWM = 10; // PWM Wert je Stufe für Programm 2
const int Stopzeit = 1000; // Delay Zeit zwischen den Stufen
byte Richtung = 0; // Stufen Richtung
unsigned long Sekundenablauf02 = 0; // Pause zwischen den Schritten
const unsigned long Pausezeit02 = 1000;
// ----------------------Einstellungen für Programm 1 --------------------------------
//----------------------------max. Messung--------------------------------------------
byte PWM0_1 = 1; // Servo Drehrichtung 0 oder 1
float max1 = 0; // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
byte maxaktuell = 0;
float max2 = 0; // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float max2alt = 0; // Vergleichspeicher ob es neue Max-Werte gibt
float max3 = 0; // Anzeigewert
byte zaehler = 0;
//-----------------------------allgemein----------------------------------------------
byte Steuerung = 1; // Den Ablauf der Messungen steuern
//-----------------------------min. Messung-------------------------------------------
byte minPWM0_1 = 1; // Servo Drehrichtung 0 oder 1
float min1 = 0; // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
byte minaktuell = 0;
float min2 = 0; // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float min2alt = 0; // Vergleichspeicher ob es neue Max-Werte gibt
float min3 = 0; // Anzeigewert
byte minzaehler = 0;
const unsigned long Brueckenzeit = 100;
unsigned long Sekundenablauf03 = 0; // Messzeit Pausieren
unsigned long Pausezeit03 = 1000;
const unsigned long Messzeit = 600;
unsigned long Sekundenablauf04 = 0; // Messzeit min. Strom
unsigned long Pausezeit04 = 1000;
unsigned long startzeit = 0;
unsigned long endzeit = 0;
unsigned long milliablaufzeit = 0;
//------------------------------------------------------------------------------------
unsigned long Sekundenablauf01 = 0; // Servo-Drehrichtung nach 1,5 Sek. ändern
unsigned long Pausezeit01 = 1000;
byte Durchgaenge = 0;
//====================================================================================
void setup(void)
{
Serial.begin(115200);
lcd.begin();
lcd.backlight();
lcd.clear();
lcd.setCursor (0, 2);
lcd.print (F("Amp="));
lcd.setCursor (0, 1);
lcd.print (F("===================="));
lcd.setCursor (0, 0);
lcd.print (F("Ausgew. Prog. = "));
lcd.setCursor (0, 3);
lcd.print (F("Stufe ="));
pinMode(Neustart, INPUT_PULLUP);
pinMode(auf, INPUT_PULLUP);
pinMode(Prog1, INPUT_PULLUP);
pinMode(Prog2, INPUT_PULLUP);
meinServo.attach(servoPin); //Servo an Pin 4
meinServo.setSpeed( 0 ); // Verfahrgeschwindigkeit einstellen
}
//===================================================================================
void loop(void) {
milliablaufzeit = millis();
//-------------------------- Programmschalter prüfen-----------------------------------------------------
Prog1auswahl = digitalRead(Prog1); // Programmauswahl Schalter auf 1 ?
Prog2auswahl = digitalRead(Prog2); // Programmauswahl Schalter auf 2 ?
if (Prog1auswahl == 0) // Ist Programm 1 ausgewählt?
{
Programmstatus = 1;
}
if (Prog2auswahl == 0) // Ist Programm 2 ausgewählt?
{
Programmstatus = 2;
}
if ((Prog1auswahl == 1) && (Prog2auswahl == 1)) // Ist kein ausgewählt?
{
Programmstatus = 0;
}
if ((Programmstatus > ProgrammstatusAlt) || (Programmstatus < ProgrammstatusAlt))
{
lcd.setCursor (16, 0);
lcd.print (F(" "));
lcd.setCursor (16, 0);
lcd.print (Programmstatus);
ProgrammstatusAlt = Programmstatus;
}
//---------------------------------------------------------------------------------------------------------
//--------------------------------- Programm 0 ------------------------------------------------------------
if (Programmstatus == 0)
{
// Noch keine Idee. :-))
}
//-----------------------------Ende Programm 0 ------------------------------------------------------------
//--------------------------------- Programm 1 -----------------------------------------------------------
if (Programmstatus == 1)
{
//-------------------------------Messungen Koordinieren--------------------------------------------------
//-----------------------Strom erster Teil---------------------------------------------------------------
if (Steuerung == 1)
{
if (Durchgaenge == 0)
{
Pausezeit01 = 200;
}
if (Durchgaenge == 30)
{
lcd.setCursor (4, 2);
lcd.print (F(" "));
lcd.setCursor (4, 2);
lcd.print (max3);
Steuerung = 2;
Durchgaenge = 0;
max1 = 0;
max2 = 0;
max2alt = 0;
max3 = 0;
zaehler = 0;
}
}
//-----------------------Strom zweiter Teil-------------------------------------------------------------
if (Steuerung == 2)
{
if (Durchgaenge == 0)
{
Pausezeit01 = 1500;
}
if (Durchgaenge == 10)
{
lcd.setCursor (8, 2);
lcd.print (F(" = "));
lcd.setCursor (10, 2);
lcd.print (max3);
Durchgaenge = 0;
max1 = 0;
max2 = 0;
max2alt = 0;
max3 = 0;
min1 = 0;
min2 = 0;
min2alt = 0;
min3 = 0;
zaehler = 0;
Steuerung = 3;
}
}
//-----------------------Strom dritter Teil------------------------------------------------------------
if (Steuerung == 3)
{
if (Durchgaenge == 0)
{
Pausezeit01 = 1500;
zaehler = 0;
min1 = 0;
min2 = 0;
min2alt = 0;
min3 = 0;
}
if (Durchgaenge == 5)
{
lcd.setCursor (14, 2);
lcd.print (F(" = "));
lcd.setCursor (16, 2);
lcd.print (min3);
Steuerung = 4;
Durchgaenge = 0;
max1 = 0;
max2 = 0;
max2alt = 0;
max3 = 0;
min1 = 0;
min2 = 0;
min2alt = 0;
min3 = 0;
zaehler = 0;
}
}
//---------------------------------Koordination Ende-----------------------------------------------------
// ----------------------------Neustart prüfen-----------------------------------------------------------
Neustartstatus = digitalRead(Neustart); // Neistarttaste gedrückt?
if (Neustartstatus == 0) // Wenn ja, alle Messwerte auf Null
{
max1 = 0;
max2 = 0;
max2alt = 0;
max3 = 0;
zaehler = 0;
Neustartstatus = 1;
Steuerung = 1;
Durchgaenge = 0;
min1 = 0;
min2 = 0;
min2alt = 0;
min3 = 0;
lcd.setCursor (3, 2);
lcd.print (F(" "));
delay(20);
}
//---------------------------------- Messung -----------------------------------------------------------
if ((Steuerung == 1) || (Steuerung == 2))
{
max1 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
zaehler = zaehler + 1;
max2 = max2 + max1;
if (zaehler == 50)
{
max2 = max2 / 50;
max2 = max2 - 520.50;
if (max2 > max2alt)
{
max3 = max2 * 0.05;
max2alt = max2;
}
zaehler = 0;
max2 = 0;
}
}
//-------------------------------------minimal Messung--------------------------------------------------
if (Steuerung == 3)
{
if (milliablaufzeit - Sekundenablauf03 >= Brueckenzeit)
{
if (milliablaufzeit - Sekundenablauf04 < Messzeit)
{
min1 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
zaehler = zaehler + 1;
min2 = min2 + min1;
if (zaehler == 50)
{
min2 = min2 / 50;
min2 = min2 - 520.50;
if (min2 > min2alt)
{
min3 = min2 * 0.05;
min2alt = min2;
}
zaehler = 0;
min2 = 0;
}
}
}
}
//--------------------------Nach einer Sekunde PWM Wert ändern-----------------------------------------
if (Steuerung < 4)
{
if (millis() - Sekundenablauf01 >= Pausezeit01)
{
Sekundenablauf04 = millis();
if (PWM0_1 == 1)
{
meinServo.write(servo_pos1);
Durchgaenge = Durchgaenge + 1;
if (Steuerung == 3)
{
Sekundenablauf03 = millis();
Sekundenablauf04 = millis();
}
}
if (PWM0_1 == 0)
{
meinServo.write(servo_pos0);
Durchgaenge = Durchgaenge + 1;
if (Steuerung == 3)
{
Sekundenablauf03 = millis();
Sekundenablauf04 = millis();
}
}
PWM0_1 = !PWM0_1;
Sekundenablauf01 = millis();
}
}
//----------------------------------PWM Wert Ändern Ende------------------------------------------------
}
// ---------------------------------- Programm 1 Ende ----------------------------------------------------
// -------------------------------------- Programm 2 -------------------------------------------------------
if (Programmstatus == 2)
{
Neustartstatus = digitalRead(Neustart); // Neistarttaste unten gedrückt?
if (Neustartstatus == 0) // Wenn ja, auf Stufe 0 und Richtung 0 Zurück
{
Stufe = 0;
Richtung = 0;
}
Neustartstatus2 = digitalRead(auf); // Neustart oben gedrückt?
if (Neustartstatus2 == 0) // Wenn ja, auf Stufe 18 und Richtung 1 Zurück
{
Stufe = 18;
Richtung = 1;
}
if (millis() - Sekundenablauf02 >= Pausezeit02)
{
lcd.setCursor (9, 3);
lcd.print (F(" "));
lcd.setCursor (9, 3);
lcd.print (Stufe);
lcd.print (F(" "));
lcd.print (Stufe * StufePWM);
lcd.print (F(" PWM"));
meinServo.write(Stufe * StufePWM);
// delay(Stopzeit);
if ((Richtung == 0) && (Stufe <= 18))
{
Stufe = Stufe + 1;
}
if ((Richtung == 0) && (Stufe == 19))
{
Stufe = Stufe - 1;
Richtung = 1;
}
if ((Richtung == 1) && (Stufe > 0))
{
Stufe = Stufe - 1;
}
if ((Richtung == 1) && (Stufe == 0))
{
Richtung = 0;
}
Sekundenablauf02 = millis();
}
}
// -----------------------------------Programm 2 Ende ---------------------------------------------------
}
Ein Bild vom Ergebnis bringen ich noch nach, nen Video wahrscheinlich auch noch, dass man den neuen Ablauf sieht.
![Super :(V):](./images/smilies/smileys-0008.gif)
.
![Stromessung_Servo_01.jpg](./download/file.php?id=305&sid=4cc554b7bcfd9d14a1a43ce67105ae73)
- Stromessung_Servo_01.jpg (182.15 KiB) 2137 mal betrachtet
Hier hat sich jetzt die dritte Zeile geändert. Das "A" für Ampere, der erste Wert ist der max Strom wofür der Servos schnell hin und her bewegt wird, ohne Stopps dazwischen. Der zweite Wert ist wieder ein max Strom bei dem das Anfahren dess Servos nach Stillstand gemessen wird. Der dritte Wert zeigt einen min-Strom Wert an, den der Servo nach dem anfahren braucht. Dafür lasse ich den Servo anfahren, warte aber mit der Messung 100ms, und messe dann für 800ms. Die 100ms Wartezeit ohne Messung, sorgen dafür, dass der Anfahrstrom nicht mitgemessen wird.
In der vierten Zeile hat sich nichts geändert. Da werden wieder die 18 Schritte in zehner PWM Stufen abgezeigt und der Servo entsprechend bewegt.
Was mich jetzt etwas wundert, ich hatte mit dem alten Programm einen deutlicheren Unterschied im Strom, zwischen der ersten und der zweiten Anfahr - Methode. Da bekam ich bei schnellen Richtungswechel aus voller Fahrt etwa 3 Ampere Anfahrstom, und bei einer Pause zwischen den Richtungen nur so 2,4 bis 2,5 Ampere. Jetzt bekomme ich den hohen Strom gar nicht mehr, auch wenn ich wieder da alte Programm reinlade. Als logische Erklärung habe ich nur, dass sich das Verhalten des Servos geändert hat. Ich bekomme bei der Messung mit dem alten Programm etwa 2,65 Amper max und bei der Messung mit dem Neuen Programm auch. Das neue hat ja wie im oberen Bild zu sehen, Strom max. = 2.66 Ampere, Strom Anfahren mit Pause, 2.59 Ampere, min. Strom nach dem anfahren 0,35 Ampere. Also die beiden max.-Strom Werte, sind ziehmlich gleich.
Mein kleinster Servo, der SG90 hat folgende Werte. Max. Strom 1,0 Ampere, schonend anfahren 0,79 Ampere, nach der Anfahrt 0,07 Ampere, also 70mA.
Bei einem zweiten Durchgang waren es 0,96 / 0,59 / 0,11 Ampere.
Ein dritter Durchgang war dann 0,92 / 0,87 / 0,10 Ampere.
Die abweichenden Ergebnisse haben wohl ein bischen mit der Motor-Themperatur zu tun.