Matlab Sägezahnsignal

Gast #4524664
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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