Forum: Mikrocontroller und Digitale Elektronik Mega8 Timer1 mit 1µs ?


von Martin (Gast)


Lesenswert?

Hallo,

ich möchte bei einem Mega8(F_CPU = 16MHz) mit dem Timer1 einen Interrupt 
alle 1µs erzeugen.
Innerhalb des CompareMatch Interuptes sollen dann Portpins entsprechend 
gesetzt werden.

Leider macht mein Timer alles andere, als das gewünschte.
Zu Testzwecken habe ich im Compare-Interupt eine LED toggeln lassen.

Hier der Code:
1
void init(void)
2
{  
3
// Timer1 initialisieren ´1µs  
4
TCCR1B |= (1<<WGM12)|(1<<WGM13)|(1<<CS10);  // CaptureCompare / No precaler
5
TIMSK |= (1<<OCIE1A);                       // Compare A Interupt Enable
6
ICR1 = (F_CPU/1000000)-1;              // 1µs
7
OCR1A = (ICR1*50)/100;          // DC = 50%        
8
}
9
10
11
ISR (TIMER1_COMPA_vect )
12
{
13
  toggle_led(2);
14
}

Nach Aussage meines Oszi's toggelt die LED mit einer Frequenz von 
84,21kHz.
Der Duty-Cycle stimmt aber mit 50%.
Etwas verwunderlich finde ich, dass egal ob ich als Timerfrequenz 1µs 
oder 500ns einstelle immer die selbe ausgangsfrequenz zu messen ist.

Könnt Ihr mir da irgendwie helfen?
Spielt es eigentlich hier eine Rolle welchen der beiden CTC-Moden(4,12) 
ich verwende?

Gruß
Martin

von Martin (Gast)


Lesenswert?

1us sind bei 16 mhz nur 16 takte. das wird nicht in der isr zu schaffen 
sein. max. in assembler.

von Peter D. (peda)


Lesenswert?

Martin schrieb:
> Leider macht mein Timer alles andere, als das gewünschte.

Kein Wunder, was soll die CPU in nur 16 Zyklen machen???

Ein Interrupt auf dem AVR (AVR-GCC) kostet typisch etwa 50 .. 500 
Zyklen.
Anfänger können schonmal deutlich mehr brauchen.


Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> toggelt die LED mit einer Frequenz von 84,21kHz.
Das ist langsam...
Warum ist die Funktion toggle_led so umständlich programmiert?

> Innerhalb des CompareMatch Interuptes sollen dann Portpins entsprechend
> gesetzt werden.
Sag doch besser mal, WAS du machen willst, nicht WIE du es machen 
willst.

von Martin (Gast)


Lesenswert?

@Lothar Miller:

ich möchte 2 Halbbrücken(IRF7389) ansteuern. Dazu benötige ich eine 
Frequenz von 92kHz und einem DC von 45,5%. Allerdings kann ich ja nicht 
beide Mosfets einer Halbbrücke gleichzeitig ansteuern, da ich eine kurze 
Totzeit brauche, damit ich im Zwischenkreis keinen Kurzschluss erzeuge.

Für die Zweite Halbbrücjke benötige ich das Signal von der 1. 
Halbbrücke, jedoch um ca. 90° Phasenverschoben.

Hintergrund ist die Ansteuerung des PiezoWave Motors (www.piezomotor.se)

In dem Compare Interrupt wollte ich dann die vier Gates der Vollbrücke 
entsprechend ansprechen.

Vielleicht ist jetzt auch mein Ziel klarer.

Grüße
Martin

von Peter D. (peda)


Lesenswert?

Martin schrieb:
> Allerdings kann ich ja nicht
> beide Mosfets einer Halbbrücke gleichzeitig ansteuern, da ich eine kurze
> Totzeit brauche, damit ich im Zwischenkreis keinen Kurzschluss erzeuge.

Dann schau Dir mal im Datenblatt an:

Figure 39. Phase Correct PWM Mode, Timing Diagram

Damit kannst Du Totzeit, Frequenz und Tastgrad beliebig einstellen 
(OCnx, /OCnx benutzen).


Peter

von Peter D. (peda)


Lesenswert?

Martin schrieb:
> Für die Zweite Halbbrücjke benötige ich das Signal von der 1.
> Halbbrücke, jedoch um ca. 90° Phasenverschoben.

Dann brauchst Du einen AVR mit 2 Timern mit je 2 PWM-Ausgängen.

z.B. ATmega48


Peter

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.