Go Down

Topic: PWM Ausgangsfrequenz ändern (Read 3850 times) previous topic - next topic

volvodani

Hallo,
ich habe folgendes Problem. Ich brauche an meinem Anrduino einen PWm ausgagng mit einer Frequenz von 30-35 Hz zu takten eines Solenoiden um eine besser Regelung zu erhalten. Ich habe mittllerwiele ein paat Anleitungen gelesen wie man die PWM Frequenz ändert die aber immer mit sich bringt das dies einfluß auf die millis() und micros() hat . Meine Frage daher ist kann ich einen "normalen" Port dafür nehmen da es bei so einem schnellen Chip ja keine besondere Frequenz ist.
Hat jemand soetwas schon in einem Projekt gesehen oder verbaut. Für Infos wäre ich dankbar
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

zur not von hand.
30ms sind ja ne ewigkeit bei 16MHz. Solange du nicht ernsthalt über 10BitAufläsung hinauswillst...

volvodani

Genau so sehe ich das auch. Ich dachte nur vielleicht hat jemand was. Ich habe es noch nicht so ganz kapiert wie man funktionen ordentlich schreibt mit void ().
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

#3
Feb 14, 2010, 01:28 pm Last Edit: Feb 14, 2010, 01:33 pm by willich Reason: 1
Code: [Select]
Typ_des_Uebergabewerts name_der_funktion(typ_1Argument Name_1Argumnt,typ_2Arg name2Arg,...)
{was es tun soll;
return Uebergabewert;
}


Und nen void ist nen leerer variablentyp. Immer, wenn man nix übergeben will kommt das dahin.

zum Beispiel:
Code: [Select]

int plus2bitte(int var)
{var=var+2;
return var;
}

void MachDieDreiehnAn(void)
{digitalWrite(13,HIGH);

}


Ich glaub, wenn es an der Syntax hapert, solltest dich erst nach nen paar mehr Programmspielereien an die OCR-Registersachen trauen.
Oder halt damit die syntax lernen :)

volvodani

#4
Feb 22, 2010, 06:30 pm Last Edit: Feb 22, 2010, 06:32 pm by volvodani Reason: 1
So ich habe einen eigene Funktion geschrieben mit der ich eine PWM Basisfrequenz bis ca 50Hz treiben kann mit einer Variablen ontime und
das an jedem Digital Out der Code sieht folgendermassen aus

Code: [Select]

unsigned long pmicros;
int nextCall=HIGH;

void setup(){
 pinMode(13,OUTPUT);
}

void loop(){
Low_PWM(13,30,75);    //erster Wert AusgangsPin,Base Frequenz,Ontime 0-100%
}

void Low_PWM(int Pin, int Fre, int Value){
long time;
long ontime;
time=1000000/Fre;
 ontime=time/100*Value;
 if (micros() - pmicros > time && nextCall==HIGH) {
   digitalWrite(Pin,HIGH);
   pmicros=micros();
   nextCall=LOW;
 }
 if (micros() - pmicros > ontime&& nextCall==LOW){
   digitalWrite(Pin,LOW);
   nextCall=HIGH;
 }
}



Vielleicht hilft das jemandem weiter bzw kann das gebrauchen
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

volvodani

kleine Frage was passiert wenn der micros() überläuft dann geht mir ja höchstens 1Flanke kaputt. Oder denke ich dann falsch.
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

#6
Feb 22, 2010, 07:06 pm Last Edit: Feb 22, 2010, 07:11 pm by willich Reason: 1
denke auch. Kann sogar sein, dass es durch die Differenz eh ausgebügelt wird. Oder dauerhaft triggert??

Musste mal durchdenken, wie das genau ist beim überlauf... Bin da grad zu faul zu :)

Hab auch das Gefühl, dass du time in "s" und ontime in Prozent hast. Und beides mit den micros vergleichst.

volvodani

Hier ist jetzt ja so hier wird die maximale Zeit bei einer bestimmten Frequenz berechnet also bei 30HZ 33000µS das sind dann auch gleichzeitig meine 100% der Rets ist dreisatzt am "Ende" wird nur der Eingang auf HIGH geschrieben und dann "gewartet" bis die berechnete Zeit abgelaufen ist und dann wieder auf LOW gesetzt also bin ich zu jeder Zeit in µS unterwegs
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

ah, jau. Vergucker. :)
Und? Schluckts Zyklen?

volvodani

Wie kann ich das mit den Zyklen am besten messen. Am Anfang micros() speichern und dann am Ende
Ende-Anfang=ZyklusZeit?
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Go Up