Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

PWM output geen 0 Volt

Pagina: 1
Acties:

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
ik ben een beetje aan het rotzooien met een avr microcontroller en ik heb het volgende gebouwd
Afbeeldingslocatie: http://www.xs4all.nl/~eelcon/images/PWM.gif
als ik nu de PWM instell op 0 dan blijven mijn ledjes toch nog heel zachtjes branden. De PWM werkt verder wel goed want ik zie hem echt veranderen als ik een andere instelling geef. Alleen wil dat ding niet uit :( ASM code heb ik ff niet beschikbaar op deze PC.
Iemand enig idee wat het kan zijn?
Overigens ik gebruik de echte hardware PWM van de AVRs dus geen software achtig iets. Leek me wel zo netjes namelijk als ze er toch op zitten

[ Voor 13% gewijzigd door TrailBlazer op 30-10-2006 10:58 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Geef eens een stukje code. edit: Ik kan me iets herinneren dat bij waarden dicht op 0 er toch nog een puls doorkwam omdat de output eerst aan gaat vlak voor 0 (bij het maximum dus) en dan direct weer uit gaat.

[ Voor 80% gewijzigd door madwizard op 30-10-2006 11:11 ]

www.madwizard.org


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
die heb ik dus ff niet op dit moment. In AVR studio zie ik nooit de output poortjes oplichten als ik hem simuleer dus dat lijkt goed te gaan. Mischien toch een elektronisch probleem.

Code zal ik vanavond posten.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Ah heb het weer gevonden (uit datasheet):
The extreme values for the OCR0A Register represents special cases when generating a PWM waveform output in the fast PWM mode. If the OCR0A is set equal to BOTTOM, the output will be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0A equal to MAX will result in a constantly high or low output (depending on the polarity of the output set by the COM0A1:0 bits.).
Dicht bij 0 gaat dus niet goed, maar bij de maximum waarde werkt het omgekeerd (altijd aan dus) wel goed. Oplossing is het om te draaien, via de COM0A1:0 (of welke timer je dan ook gebruikt) de output precies omgekeerd laten reageren, zodat de maximum waarde (255 bv.) de LEDs uit zet, en de minimum waarde (0) de LEDs aan. Ze kunnen dan wel helemaal uit, maar net niet volledig aan. Maar dat laatste zul je niet merken.

www.madwizard.org


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
madwizard schreef op maandag 30 oktober 2006 @ 11:15:
Ah heb het weer gevonden (uit datasheet):

[...]

Dicht bij 0 gaat dus niet goed, maar bij de maximum waarde werkt het omgekeerd (altijd aan dus) wel goed. Oplossing is het om te draaien, via de COM0A1:0 (of welke timer je dan ook gebruikt) de output precies omgekeerd laten reageren, zodat de maximum waarde (255 bv.) de LEDs uit zet, en de minimum waarde (0) de LEDs aan. Ze kunnen dan wel helemaal uit, maar net niet volledig aan. Maar dat laatste zul je niet merken.
ok had die tekst wel zien staan maar ik dacht dat is vast niet voor mij bedoeld. Blijkbaar zie je dit niet in de simulator. Dus hoe hoger ik mijn PWM instel hoe zwakker het ledje wordt en ff die bitjes omdraaien maar dat is geen probleem.
Overigens heb ik nog een probleem ik gebruik de 16 bits timer als een 8 bits fast PWM omdat ik dan drie dezelfde PWMs heb. Alleen is die 16 bits dan no steeds dual slope in tegenstelling tot de native 8 bits PWM die wel keurig single slope in fast PWM mode werkt.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Fast PWM hoort geen dual slope te zijn, alleen de phase correct PWM mode.

www.madwizard.org


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
madwizard schreef op maandag 30 oktober 2006 @ 11:45:
Fast PWM hoort geen dual slope te zijn, alleen de phase correct PWM mode.
nee volgens mij ook niet echter of AVR simulator is gek of mijn code is raar. Ik zal hem vanavond wel ff posten

  • MeMoRy
  • Registratie: Augustus 2004
  • Laatst online: 17-07 12:50
het heet niet voor niets "simulator"

si·mu·la·tor (de ~ (m.), ~s)
1 toestel dat een situatie of werking van vliegtuigen enz. nabootst

Dat is nooit helemaal accuraat, er zijn altijd meerdere simplificaties gedaan.

U vraagt, wij antwoorden.


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
dat van die spike kan ik me voorstellen dat die niet in de simulator zit. Ik vind het wel vreemd dat die dual slope verkeerd lijkt te gaan.
Vanavond alle bitjes maar eens checken. Overigens het gedrag is wel alsof hij single slope is. Immers ook met degene die dual slope zijn (volgens de simulator) zie ik hem niet uitgaan en volgens de datasheet zou dat wel moeten.

  • guus.assmann
  • Registratie: Augustus 2006
  • Laatst online: 27-04-2021
Het zou ook kunnen zijn dat de ULN een beetje lekstroom heeft.
En er kan ook "Ghosting" optreden bij multiplexing.
De ULN heeft een gemeenschappelijke aansluiting met diodes naar alle uitgangen.
Sluit die eens aan. (Moet naar de plus als ik me goed herinner)

Guus Assmann


  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 19-11 10:47
Waarschijnlijk worden je leds simpelweg nooit uitgezet. Je PWM doe je neem ik aan met een teller, als die 0 is zet je alle leds aan en zodra die gelijk is aan een bepaalde waarde zet je de leds weer uit. In dat geval zal de led nooit helemaal uitgaan.

Dit is op te lossen door als de pwm-teller gelijk is aan 0 de vergelijkingen NIET te doorlopen, ze hebben immers geen enkel nut. Ikzelf werk ook met interrupt gedreven pwm, en zodra je de leds aan hebt gezet als de teller 0 is. Gewoon de interrupt beindigen.

Dit is dus een simpele beschrijving zoals de hardware pwm het ook doet. Als je dit wil voorkomen moet je het in software proggen, interrupt gedreven. Meteen meer output kanalen..

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
guus.assmann schreef op maandag 30 oktober 2006 @ 16:19:
Het zou ook kunnen zijn dat de ULN een beetje lekstroom heeft.
En er kan ook "Ghosting" optreden bij multiplexing.
De ULN heeft een gemeenschappelijke aansluiting met diodes naar alle uitgangen.
Sluit die eens aan. (Moet naar de plus als ik me goed herinner)
dat is die free-wheeling diode zal ik eens doen
Thijsch schreef op maandag 30 oktober 2006 @ 17:03:
Waarschijnlijk worden je leds simpelweg nooit uitgezet. Je PWM doe je neem ik aan met een teller, als die 0 is zet je alle leds aan en zodra die gelijk is aan een bepaalde waarde zet je de leds weer uit. In dat geval zal de led nooit helemaal uitgaan.
ik gebruik de ingebouwde PWM controllers. Je krijgt ook volgens de datasheet een spike als je je PWM waarde op 0 zet. Dit is wel te verhelpen
Dit is op te lossen door als de pwm-teller gelijk is aan 0 de vergelijkingen NIET te doorlopen, ze hebben immers geen enkel nut. Ikzelf werk ook met interrupt gedreven pwm, en zodra je de leds aan hebt gezet als de teller 0 is. Gewoon de interrupt beindigen.
omdat ik toch de HW PWM gebruik zal dat me een beetje een rotzorg zijn denk ik
Dit is dus een simpele beschrijving zoals de hardware pwm het ook doet. Als je dit wil voorkomen moet je het in software proggen, interrupt gedreven. Meteen meer output kanalen..
Op dit moment kan ik er 4 maken voor een RGB led is 3 al genoeg dus op dit moment niet echt relevant.

maar voor de liefhebbers mijn ongetwijfeld erg prutserige code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
.include "tn2313def.inc"

.equ led=6
.equ blue=4
.equ green=3
.equ red=2
.equ delay=10

.def temp=R16
.def pwmh=R17
.def pwml=R18

;interrupt vector
.org 0x0000
   rjmp RESET
RESET:
;STACK INIT!!!
ldi temp, RAMEND
out    SPL, temp
;STACK INIT!!!
;timer0
;enable PWM A and B of Timer0
;ldi temp, 163
ldi temp, 255

out    TCCR0A, temp

;set prescaling of Timer0
ldi temp, 1
out    TCCR0B, temp
;enable ports for PWM outputs
sbi DDRB, 2
sbi DDRD, 5

;timer1
;enable PWM A and B of Timer1
;ldi temp,161
ldi temp,241

out    TCCR1A, temp
;set prescaling of Timer1 and 8 bit operation mode

ldi temp,9
;ldi temp,1

out    TCCR1B, temp

;enable ports for PWM outputs
sbi DDRB, 3
sbi DDRB, 4


;set PWM values timer 0
ldi temp, 0 ;red
out OCR0A, temp
ldi temp, 0
out OCR0B, temp
;set PWM values timer 1
ldi pwmh, 0
ldi pwml,  0 ;blue
out OCR1AH, pwmh
out OCR1AL, pwml
ldi pwmh, 0
ldi pwml, 0 ; green
out OCR1BH, pwmh
out OCR1BL, pwml

rjmp LOOP
LOOP:
rjmp LOOP

[ Voor 39% gewijzigd door TrailBlazer op 30-10-2006 18:08 ]


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

Topicstarter
madwizard schreef op maandag 30 oktober 2006 @ 11:15:
Ah heb het weer gevonden (uit datasheet):

[...]

Dicht bij 0 gaat dus niet goed, maar bij de maximum waarde werkt het omgekeerd (altijd aan dus) wel goed. Oplossing is het om te draaien, via de COM0A1:0 (of welke timer je dan ook gebruikt) de output precies omgekeerd laten reageren, zodat de maximum waarde (255 bv.) de LEDs uit zet, en de minimum waarde (0) de LEDs aan. Ze kunnen dan wel helemaal uit, maar net niet volledig aan. Maar dat laatste zul je niet merken.
Yep zo werkt het inderdaad wel thx. Overigens commentaar op mijn code is welkom
Pagina: 1