PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AutomatisierterSonnesucher



Dennis Fa
12.03.2014, 11:11
Hallo,

ich bin gerade an meinem Abschlussprojekt und weiß nicht mehr weiter.
Das Projekt besteht aus zwei Servomotoren, einem Solarpanel und einem Atmega168 mit LCD

Ich habe alles angeschlossen und wollte meinen Code testen, aber er macht nix :D

Also kurz zu meinem Code,
Der Servo soll zu Startposition fahren(smin),anschließend soll er während er zum anderen Anschlag fährt(smax) die Werte des AD-Wandlers auslesen und den höchten Speichern(hier wird dann auch die Position des höchsten Wertes gespeichert.
Ist er mit der Fahrt fertig soll er zur Position mit dem Maximalwert fahren und dort stehen bleiben.

ICH WEISS DAS DER CODE SEHR EINFACH GEHALTEN IST!

Ich würde mich wirklich über Hilfe freuen.
Im Anhang habe ich einen Code angehängt

sast
12.03.2014, 11:41
Ohne mich jetzt mit dem Zeitverhalten und der Servoansteuerung auseinanderzusetzen, dafür müsstest du alle verwendeten Funktionen zeigen, kann ich zumindest auf den ersten Blick sagen, dass du
if (aktuell > alterwert) //aktueller Wert kleiner als Alterwert

{
maximum = aktuell; // Das Maximum ist dann der Aktuelle Wert
postion_hell = t_on; // Hellste Postion ist dann t_on
}

nie wahr werden lässt, da du vorher alterwert = aktuell; setzt. Du meinst bestimmt aktuell > maximum.

Was heißt macht nix?
Soweit ich weiß, ist das Timing bei einer Servoansteuerung recht wichtig. Eventuell solltest du die über einen Timer machen.

sast

Dennis Fa
12.03.2014, 11:50
Die Servosteuerung ins in der t_on zeit(impulsrate) versteckt
Ja der AD Wandler zeigt was auf demLCD An aber der Servo beginnt nicht sich zur Startposition zu bewegen und loszufahren

sast
12.03.2014, 12:01
Die Servosteuerung ins in der t_on zeit(impulsrate) versteckt

Dann kann dir aber auch keiner helfen. Verstecken ist ganz schlecht wenn man Hilfe benötigt.

Hast du denn eine Servoansteuerung schon einmal am Laufen gehabt? Wenn nicht, dann versuch das mal als erstes. Im RN Wissen gibts zu den Servos zB das hier
http://www.rn-wissen.de/index.php/Servos

Da hast du dann auch gleich ein C Beispiel dabei.

sast

Dennis Fa
12.03.2014, 12:09
Also
#define smin 300 //Impulsdauer min 0,6ms (Endstellung links)
#define smax 1350 //Impulsdauer max 2,5ms (Endstellung rechts)

und dann wird t_on = smin
und solange smax nicht erreicht wird zählt er zu t_on 1 dazu

Der servo soll also erst zu smin fahren und von dort immer 1 dazu in richtung Endstellung

HeXPloreR
12.03.2014, 15:39
Was man hier besonders gerne sieht sind Doppelpost...und noch besser sind Dreifachposts ;) Bitte nächstes Mal nur einmal posten.
Bin zwar kein Admin, aber ich sag das jetzt mal so.

Frage bitte einen Admin ob er Deinen Post hier in den C-Bereich verschiebt. Und Deine anderen beiden ggf löscht - bevor jemand darauf schreibt.

Poste Doch bitte den Code direkt hier rein. Ich z.B lade ungern einfach solche Daten runter.

Dennis Fa
12.03.2014, 15:43
Ok, ja ich wusste nicht ob mein post übernommen wurde :D
Lösche die anderen gleich also hier kommt der Code:

#include <avr/io.h> // Headerdatei des Controllers
#include <zeit.h> // Headerdatei für Zeitverzögerungen
#include <adc.h> // Headerdatei des Analog-Digital-Wandlers
#include <myLcd.h> // Headerdatei des LC-Displays

unsigned int t_on; // Variablen für die Dauer des t_on - Anteils
unsigned int t_off = 15; // Variable für die Dauer des t_off - Anteils


unsigned int aktuell;
unsigned int alterwert ;
unsigned int postion_hell;
unsigned int maximum;


unsigned int adcwert; // Variable für den gewandelten Analogwert

#define smin 300 //Impulsdauer min 0,6ms (Endstellung links)
#define smax 1350 //Impulsdauer max 2,5ms (Endstellung rechts)


int main(void)
{
DDRB |= 0b00000010; // Port B Pin 1 als Ausgang festlegen

adc_initialisieren (); // AD-Wandler vorbereiten
lcd_initialisieren ();

t_on = smin; // t_on wird zu smin



while(1)
{


if (t_on < smax) // wenn Maximalwert noch nicht überschritten
{
t_on++; // Timer-Vergleichwert vergrößern

aktuell = adc_lesen(5); // aktuell ist der aktuelle AdcWert

lcd_zahl(1,0,aktuell,5);

alterwert = aktuell;

PORTB |= (1<<PB1);
zeit(t_on);

PORTB &= ~(1<<PB1);
zeit(t_off);

if (aktuell > alterwert) //aktueller Wert größer als Alterwert

{
maximum = aktuell; // Das Maximum ist dann der Aktuelle Wert
postion_hell = t_on; // Hellste Postion ist dann t_on
}


}

if (t_on >= smax) // Wenn T_on größer/gleich smax ist starte
{
while(1)
{
PORTB |= (1<<PB1);
zeit(postion_hell);
PORTB &= ~(1<<PB1);
zeit(t_off);
}
}





}
}

Besserwessi
12.03.2014, 16:10
Wenn es geht solle man das Servosignal per Timer Erzeugen. Für 2 Kanäle kann man bei den meisten µCs einfach Hardware PWM von timer 1 nutzen. So ist da Servosignal vom Rest des Programms unabhängig.

Dennis Fa
12.03.2014, 16:12
Da ich nur Grundlagen beherrsche und ich überhaupt noch nicht mit Timern gearbeitet habe und am Montag Abgabe ist wird das schwierig :D

sast
12.03.2014, 16:15
Dafür, dass du Montag Abgabe hast, hast du noch nicht einmal meinen Tipp von oben im Code berücksichtigt.
Und der Link zum RN Wissen liefert dir doch schon ein fertiges Beispiel für die Verwendung des Timers.

sast

HeXPloreR
12.03.2014, 16:15
Interessant das Du den Weg hierher doch schon so früh gefunden hast. Das erklärt auch die Doppelposts.

Heute ist ja immerhin erst Mittwoch... dann mal los

Dennis Fa
12.03.2014, 16:19
Ja ich habe das Programmieren echt unterschätzt :(

fredred
12.03.2014, 16:21
Hallo,
möchte im Forum gerne helfen. Habe mich aber schon oft ein „Ei“ gelegt, da ich nicht weis, welche Hartware verwendet wird. Hast du ein „Arduino“ und schriebst dein Projekt vielleicht noch mit „Scratch“ kann ich nur empfehlen wende dich an diese Experten.

Findest diese im Forum.

Mit freundlichen Grüßen
fredred

Dennis Fa
12.03.2014, 17:47
Nein ich habe ein Atmega168 und Atmel 6.1