Die Wärme kommt 'nicht schneller aus dem Chip raus' - also wird Das das absolute Maximum sein.
Auch Dein rein analoger Dimm-Wert wird Nichts an den Stufen des PWM ändern - und gerade in den unteren Stufen - 1 auf 2 z.B. - hast Du 'das Doppelte' bei einem Schritt von 1 - Das hast Du 'weiter hinten' zwar auch, Da sind Da aber 100 Schritte - also 100 auf 200 - dazwischen - auch ist Da Dein Auge 'etwas ungenauer'.
Du willst auch in nahezu absoluter Dunkelheit noch den Säbelzahn-Tiger sehen können, Der Dir in den A*** beißen möchte - über Mittag ist die Differenzierung der Helligkeit bei Weitem nicht mehr so wichtig - deshalb bist Du Da auch eher blinder als in der Dunkelheit
Der ganze Umstand nur, weil Du Dir nicht in den A*** beißen lassen willst
(also evolutionär gesehen ... will Dir hier keine Schuld zuschieben)
uwefed:
Also gib dem Transistor genügend Basisstrom sprich benutze den BD911 in Darlingtonschaltung oder besser nimm einen anderen Transistor oder einen MOSFET.
Bipolare Leistungstransistoren sind für sowas eine sehr schlechte Wahl, weil die nur eine sehr geringe Stromverstärkung haben. Der BD911 hat 15 bei 5A. Das ist praktisch gar nichts. Dann braucht man einen sehr hohen Basisstrom.
Und die Sättigungsspannung ist auch sehr hoch wodurch man eine hohe Verlustleistung hat. Das alles ist mit einem FET so viel einfacher. Die werden natürlich auch irgendwann warm, aber nicht so früh
Mahimus:
Hier hab ich undeutlich formuliert. Wollte fragen: Wenn man einen riesigen Kühlkörper hätte, der 200W bei delta_T von 10K abgibt, sind dann die 90W aus dem Datenblatt dennoch ein Maximum?
Wie ich den als Schalter betreibe weiß ich schon.
Hatte halt mit dem Gedanken gespielt mein PWM zu echtem analog zu glätten und zu sehen wie sich das System dann verhält hinsichtlich wahrgenommener Helligkeit abhängig von meiner jetzigen Stellgröße.
Die 90W des Transistors ist ein konstruktivers Limit dieses Transistortyps. Auch bei noch so guter Kühlung ist das das Absolute Maximum dessen überschreiten eine Beschädigung des Bauteils zur Folge hat.
Nein, es ist kein visueller Unterschied zwischen genügend schneller gepulster Ansteuerung und analoger Strom-Ansteuerung.
Achtung LED mußt Du mit Strom ansteuern und nicht mit Spannung. Dann ist die Leuchtstärke proportional zum Strom.
Wenn Du 50% PWM gibst ist das Ergebnis anders als wenn Du 50% von 5V gibst.
postmaster-ino:
Du willst auch in nahezu absoluter Dunkelheit noch den Säbelzahn-Tiger sehen können, Der Dir in den A*** beißen möchte - über Mittag ist die Differenzierung der Helligkeit bei Weitem nicht mehr so wichtig - deshalb bist Du Da auch eher blinder als in der Dunkelheit
MfG
Das stimmt, das Auge ist stark nichtlinear. Auch interessant ist bei dem Projekt, dass wenn man die Helligkeit um ein gutes Stück erhöht, dann fadet das Licht auf die neue Helligkeit und dann sieht es so aus, als würde es wieder ein kleines bisschen dunkler werden. Dachte erst ich hätte einen Fehler in der Software, aber es muss an der Anpassung der Augen an die neue Helligkeit liegen.
Beflügelt vom Thread PWM per Software mit Timer hab ich mich gerade nochmal mit dem Thema beschäftigt und möchte mich an Timer Interrupts versuchen. Combie hatte in besagtem Thread folgenden Code gepostet, auf dem ich gern aufbauen würde:
Code von Combie:
// Soft PWM für den UNO/Nano/ProMini
// Nutzt Timer0, welcher auch für Millis()usw verwendet wird (Edit: nein, der wird nicht für millis() usw. verwendet)
const byte softpwmpin = 13;
ISR(TIMER0_COMPA_vect)
{
digitalWrite(softpwmpin,HIGH);
}
ISR(TIMER0_COMPB_vect)
{
digitalWrite(softpwmpin,LOW);
}
void softpwm(byte pwm)
{
pinMode(softpwmpin,OUTPUT);
switch(pwm)
{
case 0 : TIMSK0 &= ~(_BV(OCIE0B)|_BV(OCIE0A)); // werden hier die interrupts deaktiviert?
digitalWrite(softpwmpin,LOW);
break;
case 255 : TIMSK0 &= ~(_BV(OCIE0B)|_BV(OCIE0A));
digitalWrite(softpwmpin,HIGH);
break;
default : OCR0A = 1; // schalte bei Timer = 1 ein (ISR Timer compA wir ausgelöst)
OCR0B = pwm; // schalte bei Timer = pwm aus
TIMSK0 |= _BV(OCIE0B)|_BV(OCIE0A); // und diese?
}
}
void setup()
{
}
void loop()
{
static byte dim = 0;
softpwm(dim++);
delay(20);
}
Ich habe in dem Code Fragen und Kommentare ergänzt, wenn ihr mir da weiterhelfen/mich korrigieren könnt immer gern.
Weiterhin habe ich die Vermutung, dass ich das Problem mit der höheren Auflösung lösen kann, wenn ich Timer1 verwende. Neben einer Anpassung an meine Gewohnheiten und meinen Bedarf habe ich also mal versucht das ganze so umzutüfteln, dass es mit Timer1 (16bit) läuft. Dabei hab ich noch hier auf ein paar Infos zurückgegriffen: Timer-Counter-und-Interrupts. Testen kann ich es gerade nicht, vielleicht kann mir ja jemand schon sagen ob es so geht. ansosnten melde ich mich wieder.
Mein Code für Software PWM mit Timer1 (und ca. 250 Hz PWM Frequenz, da er nach 4ms überläuft!?) :
// Soft PWM für den UNO/Nano/ProMini
// Nutzt Timer1, welcher auch für Millis()usw verwendet wird
// ungetestet
#define POWER_LED 13
int Helligkeit = 20000; // PWM Helligkeit, Maximum ist 65535
void setup()
{
pinMode(POWER_LED,OUTPUT);
}
void loop()
{
soft_PWM(Helligkeit); // Software-PWM Funktion
}
ISR(TIMER1_COMPA_vect)
{
digitalWrite(POWER_LED,HIGH);
}
ISR(TIMER1_COMPB_vect)
{
digitalWrite(POWER_LED,LOW);
}
void soft_PWM(int pwm)
{
switch(Helligkeit)
{
case 0 : TIMSK1 &= ~(_BV(OCIE1B)|_BV(OCIE1A));
digitalWrite(POWER_LED,LOW);
break;
case 65535 : TIMSK1 &= ~(_BV(OCIE1B)|_BV(OCIE1A));
digitalWrite(POWER_LED,HIGH); // 16 bit, (2^16 - 1) ist pwm-Maximum
break;
default : OCR1A = 1;
OCR1B = pwm;
TIMSK1 |= _BV(OCIE1B)|_BV(OCIE1A); // Timer-Interrupts aktivieren
}
}
Ich habe meinen Code getestet und er verhält sich genauso wie der von Combie anstatt eine höhere Auflösung zu bieten. Jetzt bin ich etwas überrascht. Kann mir jemand helfen?
Ich verwende einen Uno Nachbau von Elegoo zum Testen.
combie:
Du wirst deinen Timer1 wohl anders einstellen müssen..
Im Moment läuft er wohl in einem 8Bit PWM Mode.
Wird der denn für PWM genutzt standardmäßig?
Meinst du mit der Einstellung den Prescaler? Ist der wohl auf 256 gesetzt?
Ich habe diesen Code gefunden (Quelle im Code):
//https://www.instructables.com/id/Arduino-Timer-Interrupts/
TCCR1B |= (1 << CS11); // Set CS#1 bit for 8 prescaler for timer 1
Ich probiere es mal aus. Ich weiß zwar nicht wie ich Prescaler gleich 1 setze, was ich eigentlich wollte, aber Prescaler gleich 8 ist immer noch eine hohe Auflösung.
Edit: Obiger Code im Setup eingefügt ändert gar nichts.
Wie willst Du durch den Prescaler die Auflösung erhöhen?
Die Laufzeit/Periaodendauer wird kürzer, aber die Auflösung wird beim Timer bleiben - wenn vorher 8 Bit, dann nachher auch 8 Bit - oder eben 16.
Wie willst Du durch den Prescaler die Auflösung erhöhen?
Will ich gar nicht. Ich will Timer Interrupt nutzen um PWM nachzubilden. Auflösung erhöhen möchte ich durch Nutzung von Timer1. Ich habe vermutet der ist standardmäßig mit prescaler 256 behaftet, was ihn dann langsamer hochzählen lassen würde. Den Presscaler möchte ich niedriger einstellen. Vielleicht bin ich auch auf dem Holzweg.
Doch, zu meinem Glück! Ich habe soeben die Library TimerOne für mich entdeckt. Sie bietet pwm mit 1024 Helligkeitsstufen. Normal bin ich nicht so drauf, aber ich freu mich gerade einfach über die vorgefertigte Lösung und schmeiß die selfmade Lösung hin, zumindest für dieses Projekt. Der Testsketch hat funktioniert, ich hoffe die Lib verträgt sich auch mit meinem Projekt-Sketch.
Hier für interessierte Mitleser: Doku TimerOne Library