Matlab Sägezahnsignal

Gast #4524664
Moin Moin,

ich stehe momentan vor einem kleinen Problem und würde mich über eure 
Hilfe freuen.

Ich möchte ein Sägezahnsignal plotten lassen, welches eine amplitude von 
0.02 hat.
Der Ablauf soll sein: Signal steigt(von 0) so lange linear, bis +0.02 
erreicht ist. Bei diesem Zeitpunkt soll das Signal dann durch 
dotenew=-0.001; solange fallen, bis der Wert -0.02 erreicht ist und dann 
wieder positiv etc...

Mein Problem ist jetzt, dass sobald der Wert 0.02 erreicht ist, durch 
"else" dotenew=-0.001 ist, dies jedoch nur genau einmal passiert und 
anschließend wieder dotenew wieder positiv ist, wodruch das Signal 
ständig zwischen 0.021 und 0.02 pendelt.

Ich weiß, dass mir eine Bedingung fehlt, welche sagt, dass dotenew erst 
wieder positiv sein soll, sobald -0.02 erreicht worden ist. Hat jemand 
eine Idee wie ich diese Bedingung programmieren kann?

Die Matlabdatei befindet sich im Anhang :)

Danke!
Angehängte Dateien:
Gast #4524682
Okay, wie genau meinst du das?
Ich denke halt eher an eine zusätzliche Bedignung, welche irgendwie 
feststellt, dass -0.02 noch nicht erreicht wurde und deswegen weiterhin 
dotenew=-0.001 ist. Nur bekomme ich keinen funktionierenden Code 
zusammen.
#4524733
Also nach deinem Code würde ich so gehen:
1
if enew>=0.02 & flag==0;          %steptime<=20
2
% blocker>0          %Dehnung, Epsilon
3
%else blocker  
4
%steptime<=10        %wenn steptime kleiner gleich 10 ist...
5
%dotenew=+0.001;     %Dehnrate
6
flag=1;     %aufwärts
7

8
elseif enew<=-0.02 & flag==1
9
%  enew>=-0.02;           %Dehnung, Epsilon
10
%dotenew=-0.001;       %Dehnrate
11
flag=0;     %abwärts
12
blocker=1;
13
%bis -0.02 erreicht wurde, dann wieder dotenew+0.001
14
end

danach auf die Zustände prüfen
1
if flag==1;
2
dotenw=0.001;
3
else
4
dotenw=-0.001;
5
end


MfG

Edit: ein wenig abgeändert... Denkfehler. Jetzt aber.
Gast #4524764
super :) also ich habe den code mal getestet, jedoch war nur ein linear 
sinkendes Signal zu sehen. Ich hab den Code mal angepasst, jetzt ist das 
Sägezahnsignal erkennbar:


1
enew<=0.02 & flag==0;

und
1
elseif enew>=-0.02 & flag==1

Leider schwingt das Signal jedoch zwischen 0-1 (das Ziel ist 0.02 und 
-0.02). Wie kann das sein, obwohl enew max +-0.02 ist?
#4524774
Genau, da habe ich noch einen Vorzeichenfehler dringehabt.
Mit diesem Code geht es von -0.02 bis 0.02:
1
clear;
2
enew=0.0;
3
flag=0;
4

5
for N=1:400
6
   if enew>=0.02 & flag==0;          %steptime<=20       
7
       %dotenew=0.001;     %Dehnrate
8
       flag=1;
9
   elseif enew <=-0.02 & flag==1 
10
      %dotenew=-0.001;       %Dehnrate
11
      blocker=1;
12
      flag=0;
13
      %bis -0.02 erreicht wurde, dann wieder dotenew+0.001
14
   end
15
   if flag==0;
16
       dotenew=0.001;
17
   else
18
       dotenew=-0.001;
19
   end    
20
   enew=enew+dotenew;
21
   Y(N,1)=enew;
22
   %disp(enew);
23
  
24
end
25
N=1:1:400;
26
plot(N,Y);
Sollte passen. Hat gegenüber deiner Version die Vergleichszeichen anders 
und die Flags waren vorhin beim hoch- und runterzählen falschherum.

MfG

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.