kramann.info
© Guido Kramann

Login: Passwort:










Robuste Systemintegration
1 Grundlagen
..1.1 Newton
....1.1.1 LinearSchwinger
....1.1.2 Daempfung
....1.1.4 ODE
....1.1.5 Saaluebung
..1.2 NewtonEuler
....1.2.1 Traegheitsmomente
....1.2.2 Modellgleichungen
....1.2.3 Einfachpendel
..1.3 Scilab
....1.3.1 Erste_Schritte
....1.3.2 Skripte
....1.3.3 Funktionen
..1.4 Laplace
....1.4.1 Eigenwerte
....1.4.2 PT1
..1.5 Regleroptimierung
....1.5.1 Guetefunktion
....1.5.2 Heuristiken
....1.5.3 Scilab
..1.6 Einstellregeln
....1.6.1 Totzeit
....1.6.2 Methode1
....1.6.3 Methode2
....1.6.4 Scilab
..1.7 Zustandsregler
..1.8 Polvorgabe
..1.8 Polvorgabe_alt
..1.9 Beobachter
....1.9.1 Haengependel
..1.10 Daempfungsgrad
..1.11 Processing
....1.11.1 Installation
....1.11.2 Erste_Schritte
....1.11.3 Mechatronik
....1.11.4 Bibliotheken
....1.11.5 Uebung
....1.11.6 Snippets
......1.11.6.1 Dateioperationen
......1.11.6.2 Bilder
......1.11.6.3 GUI
......1.11.6.4 Text
......1.11.6.5 PDF
......1.11.6.8 Maus
......1.11.6.10 Zeit
......1.11.6.13 Animation
......1.11.6.15 Simulation
....1.11.7 Referenzen
..1.12 Breakout
2 Beispiel
3 Beispielloesung
4 Praxis
5 javasci
6 Fehlertoleranz1
7 Reglerentwurf
..7.1 Sprungantwort
..7.2 Messdaten
..7.3 Systemidentifikation
..7.4 Polvorgabe
..7.5 Beobachter
..7.6 Robuster_Entwurf
..7.7 SIL
8 Systementwicklung
9 Arduino
..9.1 Lauflicht
..9.2 Taster
..9.3 Sensor
..9.12 Motor_PWM1
..9.13 Motor_PWM2_seriell
..9.14 Motor_PWM3_analogWrite
..9.15 Scheduler
..9.20 AV
..9.21 Mikrofon
..9.22 Universal
....9.22.1 Laborplatine
....9.22.2 LED_Leiste
....9.22.3 Motortreiber
....9.22.4 Sensoreingaenge
....9.22.5 Taster
....9.22.6 Tests
....9.22.7 Mikrofon
....9.22.8 Lautsprecher
....9.22.9 Fahrgestell
..9.23 Zauberkiste
..9.24 OOP
....9.24.1 Uebungen
..9.25 AVneu
....9.25.1 Tests
..9.26 DA_Wandler
..9.27 CompBoard
....9.27.1 Tastenmatrix
....9.27.2 ASCIIDisplay
..9.28 CTC
..9.29 Tonerzeugung
10 EvoFuzzy
..10.1 Fuzzy
....10.1.1 Fuzzylogik
....10.1.2 FuzzyRegler
....10.1.3 Uebung9
....10.1.5 Softwareentwicklung
......10.1.5.1 AgileSoftwareentwicklung
......10.1.5.2 FuzzyRegler
......10.1.5.3 Uebung
....10.1.6 Umsetzung
......10.1.6.1 FuzzyRegler
......10.1.6.2 Simulation
......10.1.6.3 Optimierung
......10.1.6.4 Uebung
....10.1.7 Haengependel
......10.1.7.1 Haengependel
......10.1.7.2 Simulation
......10.1.7.3 FuzzyRegler
......10.1.7.4 Optimierer
......10.1.7.5 Genetisch
....10.1.8 Information
....10.1.9 Energie
..10.2 Optimierung
....10.2.1 Gradientenverfahren
....10.2.2 Heuristiken
....10.2.3 ModifizierteG
....10.2.4 optim
..10.3 Genalgorithmus
..10.4 NeuronaleNetze
....10.4.1 Neuron
....10.4.2 Backpropagation
....10.4.3 Umsetzung
....10.4.4 Winkelerkennung
..10.5 RiccatiRegler
11 Agentensysteme
12 Simulation
20 Massnahmen
21 Kalmanfilter
..21.1 Vorarbeit
..21.2 Minimalversion
..21.3 Beispiel
30 Dreirad
31 Gleiter
..31.1 Fehlertoleranz
80 Vorlesung_2014_10_01
81 Vorlesung_2014_10_08
82 Vorlesung_2014_10_15
83 Vorlesung_2014_10_22
84 Vorlesung_2014_10_29

9.28 Tonerzeugung über Toggle-Ausgängen im CTC-Mode

9.28 (EN google-translate)

9.28 (PL google-translate)

Ausgangspunkt: Scheduler (s.o.). Ergänzung:

  //Toggle auf OC1A:
  TCCR1A &= ~(1<<COM1A1);
  TCCR1A |=  (1<<COM1A0);
  pinMode(9,OUTPUT);  

Code 9.28-1: Ergänzende Codezeilen, um auf dem digitalen Ausgang 9 (OC1A) die gleiche Frequenz zu haben, wie auf Pin 12 (über Interrupt-Funktion).

Programm insgesamt:

#include<avr/interrupt.h>


volatile bool AN=false;
volatile bool ZUSTAND=false;


//SIGNAL(SIG_OUTPUT_COMPARE1)
//ISR(SIG_OUTPUT_COMPARE1)
//ISR(TIMER1_COMP_vect)
ISR(TIMER1_COMPA_vect)
{
    digitalWrite(12,ZUSTAND);
    ZUSTAND=!ZUSTAND;        
}

void setup() 
{

//  TCCR1B |= (1<<WGM13); //Mode 12
  TCCR1B &= ~(1<<WGM13); //Mode 4
  TCCR1B |= (1<<WGM12);
  TCCR1A &= ~(1<<WGM11);
  TCCR1A &= ~(1<<WGM10);
    
  //Vorteilung 1: 16000000Hz
  TCCR1B &= ~(1<<CS12);
  TCCR1B &= ~(1<<CS11);
  TCCR1B |= (1<<CS10);
    
  //f = fclk/(2*N*(OCR1A+1))
  //OCR1A = (fclk/(f*2*N))-1
  //OCR1A = 8000000/440 - 1 ==  18181
  OCR1A=18181;  
  
  TIMSK1 |= (1<<OCIE1A); //Mode 4
  sei();
  
  //Toggle auf OC1A:
  TCCR1A &= ~(1<<COM1A1);
  TCCR1A |=  (1<<COM1A0);
  pinMode(9,OUTPUT);  
     
  //durch Interrupt gesteuert:
  pinMode(12,OUTPUT);  
}

void loop() 
{       
}

Code 9.28-2: CTC mit Timer 1 auf digitalem Ausgang 9.

int zustand = 0;
//A0 = D18
//A1 = D19
//A2 = D20
//A3 = D21
//A4 = D22
//A5 = D23
//A6 = D24
//A7 = D25
//A8 = D26
//A9 = D27
//A10 = D28
//A11 = D29
void setup() 
{
  pinMode(18,OUTPUT);  
  pinMode(19,OUTPUT);  
  //pinMode(3,OUTPUT);  
  //tone(3,710);
  
  
}

void loop() 
{
  digitalWrite(18,1);    
  digitalWrite(19,1);    
  delay(800);
  digitalWrite(18,0);    
  digitalWrite(19,0);    
  delay(800);
}

Code 9.28-3: Testweise Pin A0 und A1 als digitale Ausgänge verwenden.

Basisprogramm - alles inaktiv, LED D13 blinkt

int zustand = 0;
//A0 = D18
//A1 = D19
//A2 = D20
//A3 = D21
//A4 = D22
//A5 = D23
//A6 = D24
//A7 = D25
//A8 = D26
//A9 = D27
//A10 = D28
//A11 = D29
void setup() 
{
  pinMode(18,INPUT);  //A0
  pinMode(19,INPUT);  //A1  
  pinMode(20,INPUT);  //A2  
  pinMode(21,INPUT);  //A3  
  pinMode(22,INPUT);  //A4  
  pinMode(23,INPUT);  //A5

  pinMode(2,INPUT);  //D2
  pinMode(3,INPUT);  //D3
  pinMode(4,INPUT);  //D4
  pinMode(5,INPUT);  //D5
  pinMode(6,INPUT);  //D6
  pinMode(7,INPUT);  //D7
  pinMode(8,INPUT);  //D8
  pinMode(9,INPUT);  //D9
  
  pinMode(13,OUTPUT); //LED  
}

void loop() 
{
  digitalWrite(13,1);    
  delay(500);
  digitalWrite(13,0);    
  delay(500);
}

Code 9.28-4: Basisprogramm - alles inaktiv, LED D13 blinkt

Analoge Werte lesen und auf die serielle Schnittstelle schreiben

int sensorwert=0;
//A0 = D18
//A1 = D19
//A2 = D20
//A3 = D21
//A4 = D22
//A5 = D23
//A6 = D24
//A7 = D25
//A8 = D26
//A9 = D27
//A10 = D28
//A11 = D29
void setup() 
{
  pinMode(18,INPUT);  //A0
  pinMode(19,INPUT);  //A1  
  pinMode(20,INPUT);  //A2  
  pinMode(21,INPUT);  //A3  
  pinMode(22,INPUT);  //A4  
  pinMode(23,INPUT);  //A5

  pinMode(2,INPUT);  //D2
  pinMode(3,INPUT);  //D3
  pinMode(4,INPUT);  //D4
  pinMode(5,INPUT);  //D5
  pinMode(6,INPUT);  //D6
  pinMode(7,INPUT);  //D7
  pinMode(8,INPUT);  //D8
  pinMode(9,INPUT);  //D9
  
  pinMode(13,OUTPUT); //LED 
 
  Serial.begin(9600);   

  //LINKER MOTOR:
  
}

void loop() 
{
  sensorwert = analogRead(11);
 
  Serial.write(48+(sensorwert/1000)%10);
  Serial.write(48+(sensorwert/100)%10);
  Serial.write(48+(sensorwert/10)%10);
  Serial.write(48+(sensorwert/1)%10);
  Serial.write('
');
  Serial.write('
');
  
  digitalWrite(13,1);    
  delay(250);
  digitalWrite(13,0);    
  delay(250);
}

Code 9.28-5: Analoge Werte lesen und auf die serielle Schnittstelle schreiben

Vorwärtsfahrt-Test

int sensorwert=0;
//A0 = D18
//A1 = D19
//A2 = D20
//A3 = D21
//A4 = D22
//A5 = D23
//A6 = D24
//A7 = D25
//A8 = D26
//A9 = D27
//A10 = D28
//A11 = D29
void setup() 
{
  pinMode(18,INPUT);  //A0
  pinMode(19,INPUT);  //A1  
  pinMode(20,INPUT);  //A2  
  pinMode(21,INPUT);  //A3  
  pinMode(22,INPUT);  //A4  
  pinMode(23,INPUT);  //A5

  pinMode(2,INPUT);  //D2
  pinMode(3,INPUT);  //D3
  pinMode(4,INPUT);  //D4
  pinMode(5,INPUT);  //D5
  pinMode(6,INPUT);  //D6
  pinMode(7,INPUT);  //D7
  pinMode(8,INPUT);  //D8
  pinMode(9,INPUT);  //D9
  
  pinMode(13,OUTPUT); //LED 
 
  Serial.begin(9600);   

  //Rechte Motorseite:
  pinMode(10,OUTPUT);  //Enable 1, L293_PIN1
  pinMode(8,OUTPUT);   //Input 2, L293_PIN7
  pinMode(3,OUTPUT);   //Input 1, L293_PIN2
  
  digitalWrite(3,1);    
  digitalWrite(8,0);    
  analogWrite(10,0);
  
  //Linke Motorseite:
  pinMode(13,OUTPUT);  //Enable 2, L293_PIN9
  pinMode(19,OUTPUT);   //A1 Input 3, L293_PIN15
  pinMode(11,OUTPUT);   //Input 4, L293_PIN10
  
  digitalWrite(19,1);    
  digitalWrite(11,0);    
  analogWrite(13,0);
  
}

void loop() 
{
  sensorwert = analogRead(11);
 
  Serial.write(48+(sensorwert/1000)%10);
  Serial.write(48+(sensorwert/100)%10);
  Serial.write(48+(sensorwert/10)%10);
  Serial.write(48+(sensorwert/1)%10);
  Serial.write('
');
  Serial.write('
');
  
  digitalWrite(13,1);    
  analogWrite(10,0);
  analogWrite(13,255);
  delay(250);
  digitalWrite(13,0);    
  analogWrite(10,255);
  analogWrite(13,0);  
  delay(250);
}

Code 9.28-6: Vorwärtsfahrt-Test

An einer Wand entlang fahren

int sensorwert=0;
int regler=0;
//A0 = D18
//A1 = D19
//A2 = D20
//A3 = D21
//A4 = D22
//A5 = D23
//A6 = D24
//A7 = D25
//A8 = D26
//A9 = D27
//A10 = D28
//A11 = D29
void setup() 
{
  pinMode(18,INPUT);  //A0
  pinMode(19,INPUT);  //A1  
  pinMode(20,INPUT);  //A2  
  pinMode(21,INPUT);  //A3  
  pinMode(22,INPUT);  //A4  
  pinMode(23,INPUT);  //A5

  pinMode(2,INPUT);  //D2
  pinMode(3,INPUT);  //D3
  pinMode(4,INPUT);  //D4
  pinMode(5,INPUT);  //D5
  pinMode(6,INPUT);  //D6
  pinMode(7,INPUT);  //D7
  pinMode(8,INPUT);  //D8
  pinMode(9,INPUT);  //D9
  
  pinMode(13,OUTPUT); //LED 
 
//  Serial.begin(9600);   

  //Rechte Motorseite:
  pinMode(10,OUTPUT);  //Enable 1, L293_PIN1
  pinMode(8,OUTPUT);   //Input 2, L293_PIN7
  pinMode(3,OUTPUT);   //Input 1, L293_PIN2
  
  digitalWrite(3,1);    
  digitalWrite(8,0);    
  analogWrite(10,0);
  
  //Linke Motorseite:
  pinMode(13,OUTPUT);  //Enable 2, L293_PIN9
  pinMode(19,OUTPUT);   //A1 Input 3, L293_PIN15
  pinMode(11,OUTPUT);   //Input 4, L293_PIN10
  
  digitalWrite(19,1);    
  digitalWrite(11,0);    
  analogWrite(13,0);
  
}

void loop() 
{
  sensorwert = analogRead(11);
 
  regler = 250-sensorwert;

  if(regler>100)
      regler=100;
  else if(regler<-100)    
      regler=-100;
  regler/=32;  
  /*
  Serial.write(48+(sensorwert/1000)%10);
  Serial.write(48+(sensorwert/100)%10);
  Serial.write(48+(sensorwert/10)%10);
  Serial.write(48+(sensorwert/1)%10);
  Serial.write('
');
  Serial.write('
');
  */
  //digitalWrite(13,1);    
  analogWrite(13,255-regler);
  
  //digitalWrite(13,0);    
  analogWrite(10,255+regler);
  
  delay(10);
  
}

Code 9.28-7: An einer Wand entlang fahren

void setup() 
{
  TCCR1B &= ~(1<<WGM13); //Mode 4
  TCCR1B |= (1<<WGM12);
  TCCR1A &= ~(1<<WGM11);
  TCCR1A &= ~(1<<WGM10);
    
  //Vorteilung 1: 16000000Hz
  TCCR1B &= ~(1<<CS12);
  TCCR1B &= ~(1<<CS11);
  TCCR1B |= (1<<CS10);
    
  //f = fclk/(2*N*(OCR1A+1))
  //OCR1A = (fclk/(f*2*N))-1
  //OCR1A = 8000000/440 - 1 ==  18181
  OCR1A=18181;  //0,5Hz == 4 Schläge!
  
  //Toggle auf OC1A:
  TCCR1A &= ~(1<<COM1A1);
  TCCR1A |=  (1<<COM1A0);
  pinMode(9,OUTPUT);    
}

void loop() 
{       
}

Code 9.28-8: Nur CTC-Toggle ohne Interrupt.

void setup() 
{

//  TCCR1B |= (1<<WGM13); //Mode 12
  TCCR3B &= ~(1<<WGM33); //Mode 4
  TCCR3B |= (1<<WGM32);
  TCCR3A &= ~(1<<WGM31);
  TCCR3A &= ~(1<<WGM30);
    
  //Vorteilung 1: 16000000Hz
  TCCR3B &= ~(1<<CS32);
  TCCR3B &= ~(1<<CS31);
  TCCR3B |= (1<<CS30);
    
  //f = fclk/(2*N*(OCR1A+1))
  //OCR1A = (fclk/(f*2*N))-1
  //OCR1A = 8000000/440 - 1 ==  18181
  OCR3A=18181;  //0,5Hz == 4 Schläge!
  
  //Toggle auf OC1A:
  TCCR3A &= ~(1<<COM3A1);
  TCCR3A |=  (1<<COM3A0);
  pinMode(5,OUTPUT);    //OC3A
}

void loop() 
{       
}

Code 9.28-9: Das Gleiche für Timer 3 (ebenfalls 16Bit).

void setup() 
{
  //Vorteilung 8: 2000000Hz
  TCCR4B &= ~(1<<CS43);
  TCCR4B |=  (1<<CS42);
  TCCR4B &= ~(1<<CS41);
  TCCR4B &= ~(1<<CS40);
    
  //f = fclk/(2*N*(OCR1A+1))
  //OCR1A = (fclk/(f*2*N))-1
  //OCR1A = 1000000/1760 - 1 ==  568
  OCR4A=568; 
  
  //Toggle auf OC1A:
  TCCR4A &= ~(1<<COM4A1);
  TCCR4A |=  (1<<COM4A0);
  pinMode(13,OUTPUT);    //OC4A
}

void loop() 
{       
}

Code 9.28-10: Das Gleiche für Timer 4 (allerdings 10 Bit, darum höhere Frequenz ausgewählt, da unempfindlicher bzgl. kleinerer Abweichungen.)