www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega48 - Input-Capture und PWM-Modus


Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuche bei einem Atmega48 den Timer1 über die Input-Capture-Einheit 
des AC zu triggern. Der Timer soll dabei im phasen- und 
frequenzkorrekten PWM-Modus laufen.

Eine Ausgangsänderung des Komparators erzeugt zunächst einen 
AC-Interrupt, über welchen das Ausgangssignal auf einen Pin gegeben wird 
und extern auf den nicht-invertierenden Eingang rückgekoppelt wird.

Gleichzeitig (insofern dies überhaupt möglich ist?) soll ein 
Input-Capture den Timer umschalten und ebenfalls einen Interrupt 
auslösen.

Hat der Timer wieder Bottom erreicht, soll ein Overflow-Interrupt 
ausgelöst werden.

Die Interrupts werden zunächst über zwei LEDs signalisiert.

Die Spannung am invertierenden Eingang stelle ich über einen Poti ein.
.include "m48def.inc"

.equ led_gn = 7
.equ led_rd = 6
.equ rueck = 4
.def temp = r16

;-----Interrupts-----

.org 0x000      ;Reset
rjmp main
.org 0x00A      ;Timer1 Capture
rjmp T1_capt_handler
.org 0x00D                           ;Timer1 Overflow
rjmp T1_ovf_handler
.org 0x017      ;Analog Comparator
rjmp AC_handler    

;----Hauptprogramm-----

main:

ldi temp, low(RAMEND)            
out SPL, temp                    
ldi temp, high(RAMEND)
out SPH, temp  

ldi temp, (1<<led_gn) | (1<<led_rd)
out DDRB, temp  

ldi temp, (1<<rueck)  ;Rückkopplung für die Hysterese
out DDRD, temp

ldi temp,  (1<<ACIE) | (1<<ACIC)
out ACSR, temp  

ldi temp, (1<<CS12) | (1<<CS10) |  (1<<WGM13)
sts TCCR1B, temp       ;Vorteiler 1024, Phasen/Frequenzkorrekt, TOP = ICR1

ldi temp, (1<<ICF1)
out TIFR1, temp      ;Flag rücksetzen

ldi temp, (1<<ICIE1) | (1<<TOIE1)  
sts TIMSK1, temp      

ldi temp, (1<<led_gn)
out PortB, temp

sei

loop:

rjmp loop


;--------------------


AC_handler:    ;rückkopplung
push temp
in temp, sreg
push temp

in temp, ACSR
sbrs temp, ACO
rjmp clear_back_coupling
rjmp set_back_coupling

clear_back_coupling:
cbi PortD, rueck
pop temp
out sreg, temp
pop temp
reti

set_back_coupling:
sbi PortD, rueck
pop temp
out sreg, temp
pop temp
reti


;---------------------

T1_ovf_handler:
push temp
in temp, sreg
push temp

ldi temp, (1<<led_gn)
out PortB, temp

pop temp
out sreg, temp
pop temp

reti

;---------------------


T1_capt_handler:
push temp
in temp, sreg
push temp  

ldi temp, (1<<led_rd)
out PortB, temp

pop temp
out sreg, temp
pop temp
reti


Leider funktioniert die ganze Prozedur nicht mehr, sobald ich den 
Input-Capture mit reinnehme. In diesem Fall scheint der Atmega den 
AC-Interrupt nicht mehr abzuarbeiten.

Ist es grundsätzlich möglich, den Timer in diesem Modus durch den 
Komparator triggern zu lassen? Und kann man die Input-Capture-Einheit 
benutzen, wenn man gleichzeitig einen AC-Interrupt auslöst?

Danke schon mal für jede Hilfe

Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann jemand bitte helfen... ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Input-Capture geht nur in den Modies, wo ICR1 nicht TOP ist.

Und Input-Cature in Modies, wo die Zählrichtung wechselt, ergibt 
völligen Müll.
Mit Input-Capture will man ja Pulslängen ermitteln und das geht nur, 
wenn die Zählrichtung dabei gleich bleibt.


Peter

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Verdacht (nicht simuliert oder im DB nachgesehen)

PWM-Modus mit Top ICR1 und Input Capture schliessen sich aus. Nimm mal 
einen anderen PWM Modus mit anderem Top. Du kannst ja das neue Top im 
AC-Interrupt setzen.

Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helfer schrieb:
> Mein Verdacht (nicht simuliert oder im DB nachgesehen)
>
> PWM-Modus mit Top ICR1 und Input Capture schliessen sich aus. Nimm mal
> einen anderen PWM Modus mit anderem Top. Du kannst ja das neue Top im
> AC-Interrupt setzen.

Doch, tatsächlich ziemlich viel simuliert und auch an der echten 
Schaltung ausprobiert. Das Datenblatt kann ich schon nicht mehr sehen.

Und daraus lese ich, dass ich eben genau einen Modus mit Top = ICR1 
benutzen soll:
"The ICR1 Register can only be written when using a Waveform Generation 
mode that utilizes the ICR1 Register for defining the counter’s TOP 
value"

Aber habe ja selbst festgestellt dass das nicht geht...

Wie meinst du das mit dem neuen Top setzen? Mein Gedanke war, aus dem 
AC-Interrupt heraus die Zählrichtung des Timer zu ändern. Nur wüsste ich 
nicht wie das geht. Der Versuch über das Setzen des Compare-Flag 
scheiterte leider.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dachte an: Statt PWM 8 PWM 9 nehmen und Top OCR1A aus ICR1 updaten 
lassen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst Du denn eigentlich erreichen?

Der Witz beim phasen- und frequenzkorrekten PWM-Modus ist doch gerade, 
daß man ihm nicht dazwischen quatschen kann und daher keine Glitches 
entstehen können.


Der einzig sinnvolle Mode, wo man PWM und Capture gleichzeitig benutzen 
kann, ist mit OCR1A = 0xFFFF als TOP und OCR1B als PWM.
Ich hab ihn z.B. für ne Temperaturregelung verwendet. Das Capture mißt 
die Temperatur mit nem SMT160 und die PWM steuert den Heizwiderstand.


Peter

Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was willst Du denn eigentlich erreichen?

Ich möchte einen BLDC-Motor betreiben. Dafür habe ich zunächst für das 
Hochfahren eine Tabelle hinterlegt, mit der Motor erst mal angefahren 
wird. Dann soll zur Zero-Cross-Detection übergegangen werden, indem ich 
die nicht angesteuerte Phase auf den AC multiplexe und den Nulldurchgang 
über beispielsweise den Input-Capture abfange. Nun muss ja die Zeit 
welche ich zwischen Kommutierung und Zero-Cross gemessen habe noch mal 
verstreichen bis zur nächsten Kommutierung.


> Der einzig sinnvolle Mode, wo man PWM und Capture gleichzeitig benutzen
> kann, ist mit OCR1A = 0xFFFF als TOP und OCR1B als PWM.

Für die eigentliche PWM benutze ich ja sowieso einen anderen Timer. Der 
Timer 1 soll nur für die Kommutierung da sein.


> Ich dachte an: Statt PWM 8 PWM 9 nehmen und Top OCR1A aus ICR1 updaten
> lassen.

Werd ich nach dem Wochenende mal ausprobieren.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> Für die eigentliche PWM benutze ich ja sowieso einen anderen Timer. Der
> Timer 1 soll nur für die Kommutierung da sein.

Dann ist es umso verwunderlicher, warum Du für T1 einen PWM-Modus 
benutzen willst.
Nimm einfach den normalen Timermodus.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.