Guten Abend zusammen,
ich brauche für einen Lüfter ein 25-kHz-Signal. Eigentlich sollte das
kein großes Ding sein, ich wollte mir das schnell mit Bascom schreiben.
Leider kann Bascom offenbar kein Fast-PWM. Da ich aber einen Attiny45
mit 6,4 MHz verwenden will und mit Fast-PWM recht genau 25 kHz
rauskommen sollten, würde ich ausnahmsweise mit den Timer-Registern
arbeiten. Haut das vom Code her hin?
Datenblatt, interessant wird es ab Seite 77:
https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A300%2FATTINY25-ATTINY45-ATTINY85_DATASHEET.pdf#page=77
Das Programm ist so simpel, das bedarf wahrscheinlich keiner langen
Reden. Am B4 ist ein Poti angeschlossen, an B0 und B1 brauche ich das
PWM-Signal.
1
$regfile = "ATtiny45.DAT"
2
$crystal = 6400000
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 potiwert as Word
17
18
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
19
START ADC
20
21
TCCR0A = 10100011
22
TCCR0B = 00001001
23
24
'OCR0A und OCR0B sind Variablen, gegen die der Timer verglichen wird (0-255)
Das WGM02 in TCCR00B darf nicht gesetzt werden. Es begrenzt die Timer
Frequenz im FAST PWM Mode mit dem Wert in OCR0A. Nur WGM00 und WGM01 in
TCCR0A lassen. (Table 11-5)
Wie kommt der Tiny4 auf 6,4MHz? Ohne Quarz kann er nur 1MHz, 8MHz oder
16MHz.
pegelwendler schrieb:> TCCR0A = 10100011
Sollte das nicht TCCR0A = &B10100011 heißen?
> Do> potiwert=getadc(2) '0-1024
...
> OCR0A = potiwert
[Hier könnte man sich ausnahmsweise mal ein delay() gönnen]
> Loop
> Attiny45 mit 6,4 MHz
Per Quarz? Denn zu
> Der Tiny45 hat einen Tiny15 compatibility Mode mit 6,4 MHz.
steht im Datenblatt 'Note that in this mode of operation the 6.4 MHz
clock signal is always divided by four, providing a 1.6 MHz system
clock', schließlich läuft der ATtiny15 auch ausschließlich mit 1.6 MHz.
Soweit ich weiß, sind die internen 6.4 MHz im ATtiny45 nicht direkt
verfügbar.
Muli schrieb:> Das WGM02 in TCCR00B darf nicht gesetzt werden. Es begrenzt die Timer> Frequenz im FAST PWM Mode mit dem Wert in OCR0A. Nur WGM00 und WGM01 in> TCCR0A lassen. (Table 11-5)
Danke für den Hinweis, ich habs korrigiert.
S. Landolt schrieb:> 'Note that in this mode of operation the 6.4 MHz> clock signal is always divided by four, providing a 1.6 MHz system> clock', schließlich läuft der ATtiny15 auch ausschließlich mit 1.6 MHz.> Soweit ich weiß, sind die internen 6.4 MHz im ATtiny45 nicht direkt> verfügbar.
Ups. Stimmt, das habe ich übersehen - dann wird das wohl nichts mit den
25 kHz. Wobei, eigentlich müsste ich doch das ausnutzen können, dass
beim Overflow vom Timer ein Interrupt ausgelöst wird. Kann ich da nicht
einfach für TCNT0 einen höheren Startwert reinschreiben? Quasi weniger
Zähltakte und höhere Frequenz auf Kosten der Auflösung?
Da sollte doch dann bei 191 auch ungefähr 25 kHz rauskommen und für die
PWM-Einstellung blieben dann 64 Werte bzw. 6 Bit. Oder kommt da der µC
taktmäßig nicht mehr mit, wenn da ein Interrupt mit einem Befehl drin
hängt?
Ansonsten muss sich der Lüfter halt mit 31,x kHz aus den 8 MHz
zufriedengeben.
> ich brauche für einen Lüfter ein 25-kHz-Signal
Weshalb dann zwei,
> an B0 und B1 brauche ich das PWM-Signal
?
Würde ein einziger PWM-Ausgang reichen, wäre der Modus 7 verwendbar mit
TOP=OCR0A, PWM auf OC0B.
Oder Timer1 mit TOP=OCR1C, mit entsprechenden Ausgängen.
> Interrupt ... für TCNT0 einen höheren Startwert reinschreiben
Geht sicher auch, aber ...
S. Landolt schrieb:> Weshalb dann zwei
Auf der Platine schleife ich einmal das PWM-Signal an die Schraubklemme
durch und einmal schalte ich mit einem MOSFET und einem Gate-Treiber GND
ein und aus.
Man weiß ja nie, wozu man die Platine vielleicht mal noch brauchen kann.
So gesehen wäre es aber egal, auf welchem Ausgang das Signal rauskommt,
notfalls tut es ein Klecks Lötzinn.
S. Landolt schrieb:> TOP=OCR0A, PWM auf OC0B
Ach, das geht? Ich habe das bisher so verstanden, dass sich das mit
OCR0A als TOP nur auf den Ausgang A bezieht und ich für B das Gleiche
machen muss. Aber wenn ich darüber nachdenke, dann macht das absolut
Sinn und ist natürlich technisch viel sauberer und wahrscheinlich
schneller. Gute Idee, danke dafür.
Ich würde also WGM02 wieder auf 1 setzen, um den Mode 7 zu benutzen,
OCR0A auf 64 setzen und bei OCR0B je nach gewünschter PWM-Einstellung
irgendwas zwischen 0 und 64 reinschreiben. Richtig?
1
$regfile = "ATtiny45.DAT"
2
$crystal = 1600000
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 = Input 'wird mit Lötklecks an PB1 verbunden
12
13
Pwm_Int Alias PORTB.1 '=OC0B
14
Config Portb.1 = Output
15
16
dim potiwert as Word
17
18
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
19
START ADC
20
21
TCCR0A = &B10100011
22
TCCR0B = &B00001001
23
24
'OCR0A bestimmt Einschalten des PWM-Pins und Zurücksetzen des Timers (Anzahl Ticks pro Zyklus = 64)
25
OCR0A = 64
26
'OCR0B bestimmt das Ausschalten des PWM-Pins OCR0B zwischen 0 (Dauer-Aus) und 64 (Dauer-An)
pegelwendler schrieb:> Da sollte doch dann bei 191 auch ungefähr 25 kHz rauskommen
Wie kommst Du auf 191?
Bei mir sind 8MHz / 25kHz = 320.
Du setzt also einfach einen der beiden Timer auf Clear nach 159 und
einen OCRxy Ausgang auf PWM.
Bzw. bei Fast-PWM setzt Du noch den CPU-Prescaler auf 2 (=4MHz).
> OCR0A = 64
Damit teilen Sie den Timer-Takt durch 64+1. Wenn diese Auflösung reicht,
okay.
Feiner würde es mit 'OCR0A=160 -1' (Auflösung 1/160), was jedoch (für
die verlangten 25 kHz) einen Systemtakt von 4 MHz voraussetzt. Die dafür
notwendige Manipulation von CLKPR ist zeitkritisch, wie das unter Bascom
zu bewerkstelligen ist, müssen Sie selbst nachschlagen.
Peter D. schrieb:> Wie kommst Du auf 191?
Ich habe 1,6 MHz durch 25 kHz geteilt, da komme ich auf 64. Hier hätte
ich den Timer nach dem Überlauf direkt wieder auf 191 vorgeladen, damit
er nur noch 64 Ticks zählt und dann wieder den Ausgang auf Clear setzt.
Bei 8 MHz und Fast-PWM hätte ich sonst das Problem gehabt, dass ich mit
dem 8-bit Timer nicht bis 320 zählen kann.
Vielleicht verstehe ich auch nicht ganz, was du meinst. Sprichst du vom
"normalen" PWM-Modus?
Aber das hat sich inzwischen erledigt, da die von S. Landolt
vorgeschlagene Lösung für Fast-PWM aus meiner Sicht besser ist als das
Ändern des TCNT0 in der ISR.
pegelwendler schrieb:> Sprichst du vom> "normalen" PWM-Modus?
Mode 5.
OCR0A macht den TOP (159), OCR0B die PWM.
pegelwendler schrieb:> Ändern des TCNT0 in der ISR.
Wozu denn?
Aber - hey: wenn wir uns jetzt ohnehin auf einen einzigen Ausgang,
nämlich den auf PB1, beschränken, warum dann nicht Timer1.OC1A, wie um
11:50 skizziert? Dann hätten Sie die volle Auflösung von 1/256 (falls
das überhaupt sinnvoll sein sollte für einen Lüfter).
Also ATtiny15-Compatibility-Mode mit 1.6 MHz und PLL auf 25.6 MHz.