Forum: Mikrocontroller und Digitale Elektronik Software-PWM, Attiny13 schnell genug?


von fragender (Gast)


Lesenswert?

Guten Abend,

ich würde gerne einen Lüfter steuern (PWM-fähig). Auf der Platine wird 
das Signal einmal direkt rausgeführt und einmal GND über einen MOSFET 
geschaltet.
Ich würde das Teil gern universell halten und deshalb mit den von 
PC-Lüftern geforderten 25 kHz betreiben.
Der aktuell vorgesehene Delta PFR1212DHE-SP00 akzeptiert zwar angeblich 
30Hz-300kHz, aber ich möchte das Modul trotzdem universell halten.

Eigentlich wollte ich ja die Hardware-PWM nutzen, aber ich habe 
vergessen, dass ich mit 9,6 MHz nur auf 37,6 kHz komme. Fail.

Deshalb muss jetzt Software-PWM herhalten (Bascom).

Der Attiny13 liest ein Poti aus und rechnet den Wert in 0-100 um. Die 
0-100 sollen dann als PWM-Sollwert dienen.

Meine Frage ist eigentlich ganz einfach: Kann der Code schnell genug 
ausgeführt werden? Kann ich das irgendwo simulieren und mir anschauen, 
wieviel "Luft" noch ist?

Danke und schönen Abend!

Code:
1
$regfile = "ATtiny13.DAT"
2
$crystal = 9600000
3
$hwstack = 10
4
$swstack = 10
5
$framesize = 10
6
7
Poti Alias PINb.4
8
Config Poti = Input
9
10
Pwm_Ext Alias PORTB.0
11
Config Portb.0 = Output
12
13
Pwm_Int Alias PORTB.1
14
Config Portb.1 = Output
15
16
dim zaehler as Byte
17
dim pwm_soll as Byte
18
dim potiwert as Word
19
20
21
Const Timer0_Preload = 218
22
23
Config Timer0 = Timer, Prescale = 1
24
Enable Timer0
25
Timer0 = Timer0_Preload
26
On Timer0 Isr_Timer0
27
Enable Interrupts
28
29
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
30
START ADC
31
32
Do
33
potiwert=getadc(2)
34
if potiwert <=24 then
35
   potiwert = 0
36
end if
37
potiwert = potiwert - 24 'Bereich 0-1000
38
zaehler = potiwert/10
39
Loop
40
41
Isr_Timer0:
42
   Timer0=Timer0_Preload
43
   incr zaehler
44
   if zaehler = pwm_soll then
45
      Pwm_Int = 0
46
      Pwm_Ext = 0
47
   elseif zaehler = 100 then
48
      zaehler = 0
49
      Pwm_Int = 1
50
      Pwm_Ext = 1
51
   end if
52
Return
53
54
End

von Mark S. (voltwide)


Lesenswert?

Wenn die HW-PWM nicht schnell genug ist, wird es wohl die BASCOM SW-PWM 
erst recht nicht bringen, vermute ich mal.

von fragender (Gast)


Lesenswert?

Mark S. schrieb:
> Wenn die HW-PWM nicht schnell genug ist, wird es wohl die BASCOM SW-PWM
> erst recht nicht bringen, vermute ich mal.

Hm, die Hardware-PWM ist schnell genug, aber eben zu schnell. Ich 
brauche eine Frequenz von 25 kHz. Mit der Hardware-PWM (8-bit/255 
Stufen) komme ich auf ungefähr 37,6 kHz (@9,6MHz) bzw. 18,8 kHz 
(@4,8MHz).

Bei der Software-PWM habe ich nur 100 Stufen statt 255. Deshalb die 
Hoffnung, dass das geht.

von Dyson (Gast)


Lesenswert?

Das mit Soft PWM ist Quatsch und sowieso zu langsam.

Stell den Takt mit dem Prescaler auf 4,8MHz und OCR0A für Fast PWM mit 
Top = OCR0A auf 191, dann passt das genau  mit 25KHz. Du kannst auch die 
9,6Mhz lassen und Phase Correct PWM verwenden. Ich glaube, dann musst du 
nur 190 einstellen. Habe ich jetzt aber nicht genau im Kopf. Phase 
Correct liefert die halbe Frequenz wie Fast PWM.

Wie man das in Basic einstellt? Keine Ahnung. Aber das wirst du schon 
hinkriegen.

von fragender (Gast)


Lesenswert?

Dyson schrieb:
> Aber das wirst du schon
> hinkriegen.

Schaue ich mir auf alle Fälle mal an.
Klingt auf den ersten Blick logisch/einleuchtend, ob ich das umsetzen 
kann muss ich ausprobieren.

Ich habe gerade gesehen, dass die Attiny25/45/85 pinkompatibel sind, 
auch einen ADC haben und netterweise mit einstellbaren 6,4MHz zufällig 
fast genau die passende Frequenz mitbringen würden.

Beitrag #7059099 wurde von einem Moderator gelöscht.
von Falk B. (falk)


Lesenswert?

fragender schrieb:
> Mark S. schrieb:
>> Wenn die HW-PWM nicht schnell genug ist, wird es wohl die BASCOM SW-PWM
>> erst recht nicht bringen, vermute ich mal.
>
> Hm, die Hardware-PWM ist schnell genug, aber eben zu schnell. Ich
> brauche eine Frequenz von 25 kHz. Mit der Hardware-PWM (8-bit/255
> Stufen) komme ich auf ungefähr 37,6 kHz (@9,6MHz) bzw. 18,8 kHz
> (@4,8MHz).

Ja und? Das liegt doch nahe genug an 25kHz. Außerdem kann man die 
Hardware-PWM mit weniger als 256 Stufen betreiben. Siehe Datenblatt, 
Timer mode 7. Dann kann man den Maximalwert (TOP) in OCRA festlegen. 
OCRB bleibt dann als PWM Ausgang übrig.

> Bei der Software-PWM habe ich nur 100 Stufen statt 255. Deshalb die
> Hoffnung, dass das geht.

Nö. Soft-PWM ist auf recht niedrige Frequenzen von vielleicht 
100-300Hz beschränkt.

von Purzel H. (hacky)


Lesenswert?

Wenn sich der Poster von diesen Tiny Schwarten loesen und einen kleinen 
Mega8 oder so verwenden koennte, haette er einen RC Oszillator, welche 
auf irgend eine Frequenz kalibriert werden kann.

von Oliver S. (oliverso)


Lesenswert?

fragender schrieb:
> Config Timer0 = Timer, Prescale = 1
> ...
> aber ich habe
> vergessen, dass ich mit 9,6 MHz nur auf 37,6 kHz komme. Fail.

Nun ja, es war deine Entscheidung, das so zu wollen. Der Attiny kann 
Hardware PWM bei 9,6MHz bis runter auf 36,6Hz (Hz, nicht kHz).

Oliver

von HildeK (Gast)


Lesenswert?

Purzel H. schrieb:
> Wenn sich der Poster von diesen Tiny Schwarten loesen und einen kleinen
> Mega8 oder so verwenden koennte, haette er einen RC Oszillator, welche
> auf irgend eine Frequenz kalibriert werden kann.

Erkläre das mal näher, warum du die 'Schwarten' nennst.
Der Mega8 ist zunächst mal gar nicht klein - im Vergleich zu einem 
Tiny13/x5 o.ä.
Die haben natürlich auch einen veränderbaren RC Oszillator - Register 
OSCCAL. Damit können die x5 zwischen 5MHz und 15MHz rennen und der 13 
sogar bis rund 17MHz.
Dass diese Frequenzen nicht besonders temperaturstabil sind und zudem 
exemplarabhängig, steht auf einem anderen Blatt. Das wird sich vom Mega8 
jedoch nicht unterscheiden.

von Dyson (Gast)


Lesenswert?

Purzel H. schrieb:
> Wenn sich der Poster von diesen Tiny Schwarten loesen und einen
> kleinen Mega8 oder so verwenden koennte, haette er einen RC Oszillator,
> welche auf irgend eine Frequenz kalibriert werden kann.

Mega8?
Purzelchen, du bist in ein Zeitloch gefallen.

von c-hater (Gast)


Lesenswert?

Falk B. schrieb:

> Nö. Soft-PWM ist auf recht niedrige Frequenzen von vielleicht
> 100-300Hz beschränkt.

Ähem, nö, jedenfalls nicht so allgemein.

Hängt nämlich voll ganz voll krass vom Systemtakt, der 
gewünschten/nötigen Auflösung und der Zahl der gewünschten/benötigten 
Kanäle ab, was machbar ist Alder.

Wenn du nichtmal das gecheckt hast, gute Nacht!

von Gugscht (Gast)


Lesenswert?

fragender schrieb:
> Ich habe gerade gesehen, dass die Attiny25/45/85 pinkompatibel sind,

dann nimm doch denn, der hat eine PLL-Schaltung die man aktivieren kann.
Dann hat man 8-fachen Takt, der auch für die Timer gilt.

von Max M. (Gast)


Lesenswert?

fragender schrieb:
> Der aktuell vorgesehene Delta PFR1212DHE-SP00 akzeptiert zwar angeblich
> 30Hz-300kHz,

Ja wenn das so ist, würde ich definitiv ein Rubidium Zeitnormal 
verwenden und einen 32bit Präzisionstimer mittels FPGA bauen.
Darunter geht es definitiv nicht für die fünfhunderste universelle 
Lüftersteuerung.

von c-hater (Gast)


Lesenswert?

Gugscht schrieb:

> dann nimm doch denn, der hat eine PLL-Schaltung die man aktivieren kann.
> Dann hat man 8-fachen Takt, der auch für die Timer gilt.

Das ist ja nun doch ein wenig stark verkürzt/verfälscht.

Tatsächlich ist es vielmehr so, dass die Dinger zwei PLLs besitzen, 
die man unterschiedlich kombinieren kann.

Eine der PLLs ist ausschließlich für Timer1 zuständig und kann auch nur 
diesem einen Timer Beine machen (bis 64MHz Timertakt). Der Timer1 ist 
dann asynchron zum Rest des Systems.

Die andere PLL hingegen kann den Systemtakt verdoppeln und damit auch 
den Takt von allem, was daran hängt. Diese PLL funktioniert allerdings 
nur, wenn die Taktquelle der interne RC-Oszillator ist. Hier ist also 
bei ~16Mhz Schluss (mit ein wenig OSCCAL-Tuning geht auch noch mehr, 
dass ist dann aber schnell außerhalb der Specs).

von Gugscht (Gast)


Lesenswert?

c-hater schrieb:
> Eine der PLLs ist ausschließlich für Timer1 zuständig und kann auch nur
> diesem einen Timer Beine machen (bis 64MHz Timertakt). Der Timer1 ist
> dann asynchron zum Rest des Systems.

völlig richtig, nur für die Anwendung für den TO für die Lüftersteuerung 
passt das doch. Muss halt eben den Timer1 nutzen. Sind dann 250kHz bei 
8bit möglich.

von Achim H. (pluto25)


Lesenswert?

fragender schrieb:
> Kann ich das irgendwo simulieren

Klar im Simmulator, Da fällt dann auf das in Zeile 57 pwm_soll anstelle 
zaehler stehen sollte und das ganze 172Hz bringt.
Ich würede auch das HW PWM vorziehen, jedoch ist es auch in SW möglich. 
Aber das wird eng da nur 384 Takte zur Verügung stehen. Die müssen 
reichen den ADC ab zu fragen und den Pinwechsel vor zu nehmen. Keine 
Zeit für eine Isr, da die so schon 170 Takte braucht.

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.