Forum: Compiler & IDEs Problem Takterzeugung mit Mega328


von Fer T. (fer_t)


Lesenswert?

Hallo,
Ich habe ein Problem, ich will einen Sensor auslesen und die Werte auf 
eine SD Karte schreiben. Soweit habe ich auch kein Problem, klappt auch, 
aber jetzt muss das ganze kleiner werden und da taucht das Problem auf:

Ich muss den Sensor mit einem Masterclock versorgen, das kann ich normal 
mit einem Quarz machen, jetzt habe ich aber leider keinen Platz mehr 
dafür, daher muss ich den Takt mit dem uC erzeugen.
Das ist eigentlich auch kein Problem, im Datenblatt des Sensors wird der 
Takt auch mit einem uC erzeugt, aber in meinem Fall ist folgendes das 
Problem:

Ich verwende einen Mega328 und habe nur eine Spannung von 3,3V zur 
Verfügung, also kann ich max. 10Mhz als Frequenz verwenden (laut 
Datenblatt).

Da ich aber den Sensor mit:
Min.  30Khz
Norm. 32768Hz
Max.  35Khz
versorgen muss ist es schwer diese Frequenz zu erzeugen, daher meine 
Frage wie man das am besten macht.

Was mir dazu einfällt:
Timer mit 8 als Prescaler und dann mittels CTC alle 38 Takte den Port zu 
tooglen (sollen etwa 32895 Hz sein also im normalen Bereich).
Jetzt ist die Frage, ist das eine gute Idee? Das würde ja bedeuten alle 
38 Takte das Programm zu unterbrechen, klappt das?

Im Rest des Programms wird wie gesagt der Sensor ausgelesen (I2C) und 
dann auf eine SD Karte (SPI) geschrieben...

DANKE schon mal!
MfG,
Fer_t

von Krapao (Gast)


Lesenswert?

Du brauchst doch das Programm nicht zu unterbrechen.

Die Timer können in Hardware PWM Signale an definierten Pins ausgeben, 
ohne dass ein IRQ enabled und eine ISR dafür angesprungen werden muss!

von Fer T. (fer_t)


Lesenswert?

Danke eine echt gute Idee :D

Also müsste es so klappen oder?
1
  //Timer1 PWM für Sensor Takt 32Khz
2
  TCCR1A = 1<<COM1A1; // Toogle Pin OC1A
3
  ICR1L = 0x28;
4
  TCCR1B = 1<<CS11; // Prescaler 8

Also mit dem ersten sage ich ja, dass der den Pin OC1A tooglen soll, mit 
dem zweiten, dass er bis 38 zählen soll und mit dem letzten, halt den 
Prescaler von 8.
Habe ich dort was vergessen?

Theoretisch müsste ja jetzt raus kommen:
10000000  8  38 = 32894 Hz
Muss ich noch irgendwie einen Duty-Cycle von 50% einstellen?

MfG,
Fer_T

von Krapao (Gast)


Lesenswert?

Du musst als erstes festlegen, ob und in welchem PWM mode du arbeiten 
willst.

Angenommen Timer1 darf sich komplett allein mit der Frequenzerzeugung 
befassen, dann kannst du einen Modus verwenden, der TCNT1 manipuliert.

Das wäre als Modus Clear Timer on Compare or CTC mode (WGM13:0 = 4 or 
12). Mode WGM13:0 = 4 passt da IMHO gut, weil da OCR1A als top value 
benutzt wird.

Wenn der Ausgabepin toggelt ist Frequenzberechnung:
1
               f_clkIO
2
f_OC1A = ---------------------
3
          2 * N * (1 + OCR1A)
4
5
              N: 1,8,64,256,1024

Mit f_clkIO = 10.000.000 Hz und N=8 und OCR1A=19 kommst du auf 31250 Hz
Der 50% Duty Cycle steckt in dem Toggeln
1
  // Timer1 erzeugt ~32Khz für Sensor
2
  OCR1A = 19; // 31250 Hz @ 10 MHz
3
  TCCR1A = (1<<COM1A0); // Toogle Pin OC1A
4
  TCCR1B = (1<<CS11) | (1<<WGM12);  // Prescaler 8, CTC Mode, OCR1A top

von Fer T. (fer_t)


Lesenswert?

Danke!
Ich glaube jetzt habe ich es durchschaut, für die nächsten Projekte was 
gelernt :D

Du hast sogar dadurch gerade indirekt mir noch mal geholfen:
Ich dachte ich brauche einen 10Mhz Quarz, aber dank der Formel, bin ich 
gerade drauf gekommen, das ich genauso gut einen 8Mhz verwenden kann, 
das bedeutet ich muss nicht mal meine Schaltung ändern :D

8000000Hz : (2 x 8 x (1+15)) = 31250 Hz

Danke und mfG,
Ferdinand

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.