Christoph2
12.03.2013, 16:04
Hi,
ich will auf einem ATmega128 einen digitalen Tiefpass 4. Ordnung realisieren.
Er dient als Sanftanlauf für einen Radnabenmotor. Ich weiß, das kann man auch mit einer Rampe machen - ich würde aber gerne probieren, ob ich mit einem Tiefpass bessere Ergebnisse bekomme.
Ich habe es bis jetzt leider nur geschafft, einen Tiefpass 1. Ordnung nach dieser Formel zu bauen:
http://de.wikipedia.org/wiki/PT1-Glied#Zeitdiskretes_PT1-Glied
Nun habe ich in Matlab vier davon hintereinandergeschalten - hier der Code falls jemand Matlab hat:
t=1:48;
x=[0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
y=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
y2=y;
y3=y;
y4=y;
K=1;
T=4;
dt=1;
for n=2:48; y(n)=(1/(T/dt+1))*(K*x(n)-y(n-1))+y(n-1); end
for n=2:48; y2(n)=(1/(T/dt+1))*(K*y(n)-y2(n-1))+y2(n-1); end
for n=2:48; y3(n)=(1/(T/dt+1))*(K*y2(n)-y3(n-1))+y3(n-1); end
for n=2:48; y4(n)=(1/(T/dt+1))*(K*y3(n)-y4(n-1))+y4(n-1); end
plot(t,y4);
Das funktioniert gut - auf dem PC.
Für den uC ist es aber etwas rechenaufwendig.
Gibt es da eine einfachere Methode, mit der er in einem Durchgang auf die letzten 4 Ausgangswerte + den aktuellen Eingangswert zugreift, und mir ein Ergebnis liefert?
Ein guter Link würde mir schon reichen... Ich hab heut den ganzen Tag gegoogled, aber leider nichts gefunden was ich auch verstanden habe.
lg
Christoph
ich will auf einem ATmega128 einen digitalen Tiefpass 4. Ordnung realisieren.
Er dient als Sanftanlauf für einen Radnabenmotor. Ich weiß, das kann man auch mit einer Rampe machen - ich würde aber gerne probieren, ob ich mit einem Tiefpass bessere Ergebnisse bekomme.
Ich habe es bis jetzt leider nur geschafft, einen Tiefpass 1. Ordnung nach dieser Formel zu bauen:
http://de.wikipedia.org/wiki/PT1-Glied#Zeitdiskretes_PT1-Glied
Nun habe ich in Matlab vier davon hintereinandergeschalten - hier der Code falls jemand Matlab hat:
t=1:48;
x=[0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
y=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
y2=y;
y3=y;
y4=y;
K=1;
T=4;
dt=1;
for n=2:48; y(n)=(1/(T/dt+1))*(K*x(n)-y(n-1))+y(n-1); end
for n=2:48; y2(n)=(1/(T/dt+1))*(K*y(n)-y2(n-1))+y2(n-1); end
for n=2:48; y3(n)=(1/(T/dt+1))*(K*y2(n)-y3(n-1))+y3(n-1); end
for n=2:48; y4(n)=(1/(T/dt+1))*(K*y3(n)-y4(n-1))+y4(n-1); end
plot(t,y4);
Das funktioniert gut - auf dem PC.
Für den uC ist es aber etwas rechenaufwendig.
Gibt es da eine einfachere Methode, mit der er in einem Durchgang auf die letzten 4 Ausgangswerte + den aktuellen Eingangswert zugreift, und mir ein Ergebnis liefert?
Ein guter Link würde mir schon reichen... Ich hab heut den ganzen Tag gegoogled, aber leider nichts gefunden was ich auch verstanden habe.
lg
Christoph