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
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!
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
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.