Forum: Mikrocontroller und Digitale Elektronik Frequenz generieren in C


von XC866 (Gast)


Lesenswert?

Hallo zusammen

Ich habe eine kleine Frage zu C. Ich möchte möglichst einfach eine 
Frequenz an einem Port ausgeben. Ich habe einen internen Wert von 0-500.
Jetzt möchte ich aus diesem Wert eine Frequenz machen. Also 0-500HZ.

Gruss und Danke

Matthias

von Stefan (Gast)


Lesenswert?

Rechtecksignal?

Dann dauert eine Halbperiode (1/Frequenz)/2 Sekunden

Beispiel:

Frequenz = 10 Hz
Dauer der Halbperiode = (1/10)/2 s = 0,1/2 s = 0,05 s = 50 ms

Um das Signal zu erzeugen kannst du einen Output-Pin eine Halbperiode 
lang LOW schalten und eine Halbperiode lang HIGH.

Bei AVRs beispielsweise so
1
#define F_CPU 1000000   // µC läuft z.B. mit 1 MHz Haupttakt (anpassen!)
2
#include <util\delay.h> // Wartefunktionen (Wertebereich nachlesen!)
3
#include <avr/io.h>     // IO Definitionen
4
5
int main(void)
6
{
7
   DDRC = 0xFF;         // PORTC auf Ausgang (anpassen!)
8
   while(1)
9
   {
10
      PORTC ^= (1<<PC0);  // PC0 LOW/HIGH toggeln (anpassen!)
11
      delay_ms(50);       // Halbperiode warten  
12
   }
13
}

  

von Profi (Gast)


Lesenswert?

Dafür verwendest Du einen Timer- oder PWM-Port.
Die Register werden mit den Zeiten (Peridendauer) programmiert, nicht 
mit der Frequenz.
xtal 8000000L
timerregister=0-xtal/prescale/freq

0- deswegen, weil die Timer meistens hinaufzählen

Vermutlich musst Du bei einem so großen Bereich noch eine 
Fallunterscheidung für den Prescaler einbauen  und  Timer kaskadieren.

Alternative: DDS (direkte digitale Synthese)

http://www.mikrocontroller.net/forum/1?filter=dds*
http://www.mikrocontroller.net/forum/1?filter=freque*
http://www.mikrocontroller.net/forum/1?filter=ton*

von Sonic (Gast)


Lesenswert?

Wie Profi schon sagte: Timer benutzen. Am Besten den 16-bit-Timer wegen 
der Auflösung, den Teiler richtig einstellen und den 
Output-Compare-Interrupt benutzen um den (beliebigen) Pin umzuschalten. 
Dazu den CTC-Modus einschalten (WGM12) und den Inhalt für das 
Output-Compare-Register entsprechend berechnen.

von XC866 (Gast)


Lesenswert?

Hallo zusammen

Danke für die Antworten. Werde das einmal versuchen.

Gruss
Matthias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.