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


von Marco B. (marco-b)


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.
1
.include "m48def.inc"
2
3
.equ led_gn = 7
4
.equ led_rd = 6
5
.equ rueck = 4
6
.def temp = r16
7
8
;-----Interrupts-----
9
10
.org 0x000      ;Reset
11
rjmp main
12
.org 0x00A      ;Timer1 Capture
13
rjmp T1_capt_handler
14
.org 0x00D                           ;Timer1 Overflow
15
rjmp T1_ovf_handler
16
.org 0x017      ;Analog Comparator
17
rjmp AC_handler    
18
19
;----Hauptprogramm-----
20
21
main:
22
23
ldi temp, low(RAMEND)            
24
out SPL, temp                    
25
ldi temp, high(RAMEND)
26
out SPH, temp  
27
28
ldi temp, (1<<led_gn) | (1<<led_rd)
29
out DDRB, temp  
30
31
ldi temp, (1<<rueck)  ;Rückkopplung für die Hysterese
32
out DDRD, temp
33
34
ldi temp,  (1<<ACIE) | (1<<ACIC)
35
out ACSR, temp  
36
37
ldi temp, (1<<CS12) | (1<<CS10) |  (1<<WGM13)
38
sts TCCR1B, temp       ;Vorteiler 1024, Phasen/Frequenzkorrekt, TOP = ICR1
39
40
ldi temp, (1<<ICF1)
41
out TIFR1, temp      ;Flag rücksetzen
42
43
ldi temp, (1<<ICIE1) | (1<<TOIE1)  
44
sts TIMSK1, temp      
45
46
ldi temp, (1<<led_gn)
47
out PortB, temp
48
49
sei
50
51
loop:
52
53
rjmp loop
54
55
56
;--------------------
57
58
59
AC_handler:    ;rückkopplung
60
push temp
61
in temp, sreg
62
push temp
63
64
in temp, ACSR
65
sbrs temp, ACO
66
rjmp clear_back_coupling
67
rjmp set_back_coupling
68
69
clear_back_coupling:
70
cbi PortD, rueck
71
pop temp
72
out sreg, temp
73
pop temp
74
reti
75
76
set_back_coupling:
77
sbi PortD, rueck
78
pop temp
79
out sreg, temp
80
pop temp
81
reti
82
83
84
;---------------------
85
86
T1_ovf_handler:
87
push temp
88
in temp, sreg
89
push temp
90
91
ldi temp, (1<<led_gn)
92
out PortB, temp
93
94
pop temp
95
out sreg, temp
96
pop temp
97
98
reti
99
100
;---------------------
101
102
103
T1_capt_handler:
104
push temp
105
in temp, sreg
106
push temp  
107
108
ldi temp, (1<<led_rd)
109
out PortB, temp
110
111
pop temp
112
out sreg, temp
113
pop temp
114
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

von Marco B. (marco-b)


Lesenswert?

kann jemand bitte helfen... ?

von Peter D. (peda)


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

von Helfer (Gast)


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.

von Marco B. (marco-b)


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.

von Helfer (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von Marco B. (marco-b)


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.

von Peter D. (peda)


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

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.