main.c-Dateireferenz


Ausführliche Beschreibung

Funktionsweise: programm zum testen der UART kommunication

Version:
V--- - 26.03.2007 - Olaf Petersen
Created

Definiert in Datei main.c.

#include <avr/io.h>
#include <stdint.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "../nbot_lib/uart.h"
#include "../nbot_lib/timer.h"
#include "../nbot_lib/encoder.h"
#include "../nbot_lib/motor.h"
#include "pcc.h"

Include-Abhängigkeitsdiagramm für main.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define ki   2
 Integrationszeitkonstante.
#define kd   0
 Differenzierungszeitkonstante.
#define kp   2
 Verstärkung.

Funktionen

void regelung (uint8_t motor)
 Regelung der Motoren.
int main (void)

Variablen

uint32_t zeit = 0
int16_t sollwert [] = {0,0}
int16_t istwert [] = {0,0}
int16_t fehler [] = {0,0}
int16_t fehler_alt [] = {0,0}
int16_t integrator [] = {0,0}
int16_t differenzierer [] = {0,0}
int16_t stellwert [] = {0,0}
pcc_t pcc_daten


Makro-Dokumentation

#define kd   0

Differenzierungszeitkonstante.

Definiert in Zeile 27 der Datei main.c.

Wird benutzt von regelung().

#define ki   2

Integrationszeitkonstante.

Definiert in Zeile 26 der Datei main.c.

Wird benutzt von regelung().

#define kp   2

Verstärkung.

Definiert in Zeile 28 der Datei main.c.

Wird benutzt von regelung().


Dokumentation der Funktionen

int main ( void   ) 

Definiert in Zeile 47 der Datei main.c.

Benutzt pcc_t::encoder, pcc_t::istwert, istwert, LEFT, pcc(), pcc_daten, pcc_init(), pcc_rx(), regelung(), RIGHT, sollwert, pcc_t::sollwert, pcc_t::time und zeit.

00048 {
00049   uart_init();
00050   timer2_init();
00051   encoder_init();
00052   motor_init();
00053   pcc_init(&pcc_daten);
00054   
00055   uint8_t buf;
00056   
00057     
00058   pcc_daten.time = &zeit;
00059   pcc_daten.encoder[LEFT] = &istwert[LEFT];
00060   pcc_daten.istwert[LEFT] = &istwert[LEFT];
00061   pcc_daten.sollwert[LEFT] = &sollwert[LEFT];
00062   pcc_daten.encoder[RIGHT] = &istwert[RIGHT];
00063   pcc_daten.istwert[RIGHT] = &istwert[RIGHT];
00064   pcc_daten.sollwert[RIGHT] = &sollwert[RIGHT];
00065   
00066   DDRB |= (1<<PB0) | (1<<PB1);
00067   PORTB |= (1<<PB0) | (1<<PB1);
00068   sei();
00069   for(;;)
00070   {
00071     if (Gettime() >= (zeit + 100))    // alle 100ms
00072     { 
00073       zeit = Gettime();
00074       
00075       // *************  Motorregelung ***************
00076       regelung(LEFT);     // linken Motor regeln
00077       regelung(RIGHT);    // rechten Motor regeln   
00078 
00079       if(uart_getc(&buf) == 1)
00080         pcc_rx(buf);    // PC Kommunikation
00081       pcc();
00082     
00083     }
00084   }
00085   return 0;
00086 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void regelung ( uint8_t  motor  ) 

Regelung der Motoren.

Funktionsweise:
die Funktion liest die Drehzahlwerte ein und erzeugt daraus einen neuen Motorstellwert.
Parameter:
[in] motor Motor auswahl: LEFT, RIGHT

Definiert in Zeile 100 der Datei main.c.

Benutzt differenzierer, fehler, fehler_alt, integrator, istwert, kd, ki, kp, LEFT, RIGHT, sollwert und stellwert.

Wird benutzt von main().

00101 {
00102       // alle werte zurücksetzten wenn Motor still stehen soll
00103       if(sollwert[motor] == 0){
00104         fehler[motor]=0;
00105         fehler_alt[motor]=0;
00106         integrator[motor]=0;
00107         differenzierer[motor]=0;
00108         stellwert[motor]=0;
00109         motor_speed(0, 0);      
00110         return;
00111       }
00112       
00113       istwert[motor] = encoderGet(motor);
00114       
00115       
00116       //****** linke Regelung ************************************************ 
00117       
00118       fehler[motor] = sollwert[motor] - istwert[motor];           // Sollwertabweichung
00119       
00120       integrator[motor] += fehler[motor];                       // Integrator
00121       // Integrator begrenzen
00122       if(integrator[motor] > 1023)
00123         integrator[motor] = 1023;
00124       if(integrator[motor] < (-1023))
00125         integrator[motor] = (-1023);      
00126       
00127       differenzierer[motor] = fehler[motor] - fehler_alt[motor];  // Differenzierer
00128       
00129       stellwert[motor]  = integrator[motor]/ki;                 // Stellgröße
00130       stellwert[motor] += kd * differenzierer[motor];
00131       stellwert[motor] += kp * fehler[motor];
00132       
00133       // Stellwertbegrenzung
00134       if(stellwert[motor]>255)
00135         stellwert[motor] = 255;
00136       if(stellwert[motor]< (-255))
00137         stellwert[motor] = (-255);
00138         
00139       fehler_alt[motor] = fehler[motor];                          // Sollwertabweichung merken
00140     
00141       switch (motor)
00142       {
00143         case LEFT:
00144           // Motordrehrichtung
00145           if(stellwert[motor]>0)
00146             motor_dir(FWD,FREE);
00147           if(stellwert[motor]<0){
00148             stellwert[motor] = -stellwert[motor];
00149             motor_dir(RWD,FREE);
00150           }
00151           break;
00152         case RIGHT:
00153           // Motordrehrichtung
00154           if(stellwert[motor]>0)
00155             motor_dir(FREE,FWD);
00156           if(stellwert[motor]<0){
00157             stellwert[motor] = -stellwert[motor];
00158             motor_dir(FREE,RWD);
00159           }
00160           break;
00161       }
00162       
00163       // Motorspeed setzen 
00164       motor_speed(stellwert[LEFT], stellwert[RIGHT]);
00165 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:


Variablen-Dokumentation

int16_t differenzierer[] = {0,0}

Definiert in Zeile 37 der Datei main.c.

Wird benutzt von regelung().

int16_t fehler[] = {0,0}

Definiert in Zeile 34 der Datei main.c.

Wird benutzt von regelung().

int16_t fehler_alt[] = {0,0}

Definiert in Zeile 35 der Datei main.c.

Wird benutzt von regelung().

int16_t integrator[] = {0,0}

Definiert in Zeile 36 der Datei main.c.

Wird benutzt von regelung().

int16_t istwert[] = {0,0}

Definiert in Zeile 33 der Datei main.c.

Wird benutzt von main() und regelung().

pcc_t pcc_daten

Definiert in Zeile 39 der Datei main.c.

Wird benutzt von main().

int16_t sollwert[] = {0,0}

Definiert in Zeile 32 der Datei main.c.

Wird benutzt von main() und regelung().

int16_t stellwert[] = {0,0}

Definiert in Zeile 38 der Datei main.c.

Wird benutzt von regelung().

uint32_t zeit = 0

Definiert in Zeile 31 der Datei main.c.

Wird benutzt von main().


Erzeugt am Sun Apr 22 20:00:39 2007 für nBot von  doxygen 1.5.1-p1