PID-Algorithmus auf Atmega128 programmieren!?

OP #2420674
Lesenswert?

Hallo,

ich möchte einen PID-Algorithmus auf meinen Atmega128 programmieren um 
ein Peltier-Element zu steuern/regeln... Wer hat hier Erfahrung? Bzw. 
kann mir helfen? Im Anhang habe ich den Algorithmus als Formel....

Schon einmal Danke!

MfG
Angehängte Dateien:
Persönliche Seite #2420695
Lesenswert?

Ohne den Link gelesen zu haben vermute ich mal das du noch die ein oder 
andere Info geben solltes damit man überhaupt weiß WO man dir helfen 
soll.
Eine Aufgabenstellung und die Frage ob dir jemand helfen kann ist 
ungefähr so als wenn du zu nem Autoverkäufer sagst : Du, sag mal ... 
verkaufst du auch Autos ?
Helfen werden dir hier einige können, aber du musst schon sagen wo dein 
Problem ist, was du nicht verstanden hast. Und viel wichtiger ist : Du 
mußt zeigen das du dich damit auseinandersetzt und Eigeninitiative 
zeigst. Also nicht erwarten das dir jemand das Teil auf dem 
Silbertablett präsentiert.
Das funktioniert nicht.

Ein Autohändler würd dir ja auch nicht einfach so nen Auto schenken, 
nech ?
#2420704
Lesenswert?

J. R. schrieb:
> Okay! Das Problem ist, dass ich zwar mit dem Freescale Prozessoren schon
> etwas programmiert habe... aber noch nicht so viel mit Atmel.... da war
> ich mehr Zuschauer... deshalb bräuchte ich da ein wenig eine helfende
> Hand... ;-)

ALso liegt dein Problem gar nicht beim PID, sondern bei der 
Programmierung von AVR-Prozessoren?

Berechnungen und damit das Umsetzen von Formeln ist in C überall gleich. 
Und den Zugriff auf Peripherie findest du hier
AVR-GCC-Tutorial
#2420707
Lesenswert?

J. R. schrieb:
> Okay! Das Problem ist, dass ich zwar mit dem Freescale Prozessoren schon
> etwas programmiert habe... aber noch nicht so viel mit Atmel.... da war
> ich mehr Zuschauer... deshalb bräuchte ich da ein wenig eine helfende
> Hand... ;-)
Dann fang an.
Suchst du ein fertiges Programm, dann geh hier oder in einem Robotik 
Forum in die Code Sammlung.
Benutze die Such Funktion
Ansonsten lass erst mal ein paar LEDs blinken.

Programmieren heisst nicht copy and paste, das geht nur bei Jura 
Dissertationen
Persönliche Seite #2420719
Lesenswert?

@J.R.

Wie Karl Heinz schon bemerkt hat : C ist überall gleich. Und wenn du 
schonmal nen Freescale programmiert hast ist ein AVR mit etwas 
Einarbeitungszeit recht schnell zu handeln. Hab auch erst mit einem 
MSP430 angefangen und bin nachher bei Atmel gelandet. Hat bei mir länger 
gedauert da es nur Hobby-mäßig war und ich erstmal die feinen 
Unterschiede (Architektur Harvard vs von-Neumann, Fusebits, 
Programmierinterface) lernen musste. Aber da hat mir das Forum hier viel 
weitergeholfen.
Wenn du den Algorithmus verstanden hast sollte die Umsetzung nciht das 
Problem sein. Ansonsten erstmal mit dem AVR "laufen" lernen. Das ist 
wirklich nicht schwer (vor allem wenn man mit uC's schon gearbeitet 
hat).
Und dann ran an den Speck ... ähm PID-Regler.
OP #2420721
Lesenswert?

Udo Schmitt schrieb:
> J. R. schrieb:
>> Okay! Das Problem ist, dass ich zwar mit dem Freescale Prozessoren schon
>> etwas programmiert habe... aber noch nicht so viel mit Atmel.... da war
>> ich mehr Zuschauer... deshalb bräuchte ich da ein wenig eine helfende
>> Hand... ;-)
> Dann fang an.
> Suchst du ein fertiges Programm, dann geh hier oder in einem Robotik
> Forum in die Code Sammlung.
> Benutze die Such Funktion
> Ansonsten lass erst mal ein paar LEDs blinken.
>
> Programmieren heisst nicht copy and paste, das geht nur bei Jura
> Dissertationen

Ja das schon klar ;-) Ja gibt es hier auch Codebsp? Lichter habe ich 
schon blinken lassen :p
#2420723
Lesenswert?

hier in zeitdiskreter, iterativer form..
1
void PIDController::run(){
2
  // move deviationns n-1
3
  systemDeviation[2] = systemDeviation[1];
4
  systemDeviation[1] = systemDeviation[0];
5
  systemDeviation[0] = (commandVar-feedbackVar);
6

7
  // move actuating vars
8
  actuatingVar[1] = actuatingVar[0];
9

10
  // PID algorithm - time discrete, iterative Z form
11
  actuatingVar[0] = actuatingVar[1] +(Kp+Kp*t_sampling/Ti + Td*Kp/t_sampling) * systemDeviation[0]+(-Kp-2*Kp*Td/t_sampling) * systemDeviation[1] + (Kp*Td/t_sampling) * systemDeviation[2];
12

13
  // limits - anti wind up
14
  if (actuatingVar[0]>upperLimit){
15
    actuatingVar[0] = upperLimit;
16
  }
17

18
  if (actuatingVar[0]<lowerLimit){
19
    actuatingVar[0] = lowerLimit;
20
  }
21
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren