Forum: Mikrocontroller und Digitale Elektronik AVR Duty Cycle anpassung


von Julian (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

leider konnte ich im Internet bisher noch keine Lösung für mein Problem 
finden. Ich habe eine Schaltung aufgebaut um ein DMX-Signal in 0-10V 
analog zu wandeln (nach Vorlage von Hendrik Hoelscher). Der Demuxer soll 
für die Ansteuerung einer Nebelmaschine dienen.
Mein Problem: Die Nebelmaschine heizt erst bei einer Eingangsspannung 
von 1,0-2,5V auf, ab 2,5V-9,5V wird der Ausstoß reguliert, ab 9,5V-10V 
wird ein interner Timer gesetzt.
da die Nebelmaschine Heizen soll sobald sie eingeschaltet ist und bei 
einer DMX Steuerung der interne Timer nicht benötigt wird, soll der 
Demuxer im endeffekt eine Spannung von 2,3V (0%) und 9,4V(100%) 
ausgeben.
Bei der Schaltung wird von einem Atmega 8515 das DMX Signal ausgewertet 
und ein PWM (0-5V) erzeugt. Dieses wird durch einen Tiefpass und ein LM 
324 mit Spannungsteiler auf 0-10V gewandelt.
Eigentlich müsste ja eine Anpassung des AVR-Codes ausreichend sein.
Leider bin ich nicht so ganz fit, dass ich die PWM Duty Cycle anstatt 
von 0%-100% auf 22%-94% abändern kann.
Ich würde mich freuen, wenn mir jemand erklären könnte wie das bei dem 
Demultiplexer Code möglich ist. Die Schaltung habe ich soweit 
verstanden, leider scheitert es halt am Assembler. Mich interessiert 
halt nicht nur die fertige Lösung sondern auch die Umsetzung im 
Assembler.

Vielen Dank im Voraus, viele Grüße

Julian

m.E. müsste es irgendwo in diesen Zeil umsetzbar sein:
1
.equ DMX_FIELD=    0x60     ;SRAM-Beginn
2
.equ DMX_CHANNELS= 8
3
.equ PWM_FIELD=     0x68
4
.equ F_OSC=        8000
5
.equ WIDTH=        105      ;Offset zwischen Steps
6
.equ IND_OFFSET=   550       ;Offset f¸r indicator-Timer (14Hz)

bzw.
1
; ***************************PWM-Ausgabe ****************************************
2
pwm:              ; CALLED EVERY 12.5µs (80kHz)
3
    in      SREGbuf, SREG
4
    push  tempL
5
6
    ldi    ZH,high(PWM_FIELD)      ;set data-pointer  
7
    ldi    ZL,low(PWM_FIELD);
8
9
10
      ld    tempL,Z+          ;1
11
    cp    tempL, dimm_count
12
    ror    status
13
    ld    tempL,Z+          ;2
14
    cp    tempL, dimm_count
15
    ror    status
16
    ld    tempL,Z+          ;3
17
    cp    tempL, dimm_count
18
    ror    status
19
    ld    tempL,Z+          ;4
20
    cp    tempL, dimm_count
21
    ror    status
22
    ld    tempL,Z+          ;5 
23
    cp    tempL, dimm_count
24
    ror    status
25
    ld    tempL,Z+          ;6 
26
    cp    tempL, dimm_count
27
    ror    status
28
    ld    tempL,Z+          ;7 
29
    cp    tempL, dimm_count
30
    ror    status
31
    ld    tempL,Z            ;8 
32
    cp    tempL, dimm_count
33
    ror    status
34
35
36
      sbic  PinD, PD4
37
      com    status
38
      out   PORTA,status  ;fire
39
      
40
    sbrc  dimm_count, 7
41
    rjmp  pwm_inc
42
    sbr    dimm_count, (1<<7)      ;toggle msb
43
     pwm_exit:
44
    pop    tempL
45
    out     SREG, SREGbuf
46
    reti
47
48
  
49
  pwm_inc:
50
    inc    dimm_count
51
    cbr    dimm_count, (1<<7)
52
    tst    dimm_count
53
    brne  pwm_exit
54
55
    ldi    dimm_count, 0x80
56
    out    TCNT0, null
57
58
    ldi    ZH,high(DMX_FIELD)      ;refresh  
59
    ldi    ZL,low(DMX_FIELD);
60
    ld    tempL, Z+
61
    std    Z +7, tempL
62
    ld    tempL, Z+
63
    std    Z +7, tempL
64
    ld    tempL, Z+
65
    std    Z +7, tempL
66
    ld    tempL, Z+
67
    std    Z +7, tempL
68
    ld    tempL, Z+
69
    std    Z +7, tempL
70
    ld    tempL, Z+
71
    std    Z +7, tempL
72
    ld    tempL, Z+
73
    std    Z +7, tempL
74
    ld    tempL, Z
75
    std    Z +8, tempL
76
77
    rjmp  pwm_exit
78
79
    
80
;****************************** LED INDICATOR ***********************************
81
82
LED_indicator:
83
    in      SREGbuf, SREG
84
    wdr            ;reset Watchdog
85
    sbr    Flags, (1<<DO_IND)
86
    out    SREG, SREGbuf
87
    reti
88
89
90
nix: rjmp nix
91
92
93
.include "lib_dmx_in.asm"
94
.include "lib_indicate.asm"

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.