Hallo liebe Forumgemeinde. Hoffe einer erbarmt sich und hilft mir. Würde gerne meine Aquariumleuchte selbst bauen. Habe einen Aquaristikcomputer der 4 Dimmkanäle mittels 1-10v ausgibt die mir auch reichen da ich nur vier verschiene Leuchtmittel habe. Würde gerne damit 24 Stck Konstantstromqellen von Meanwell LDD-700l ansteuern. an jede kommen dann 9Stck 3Watt Power LEDs mit 3,5v 700mA oder 1Stck Power Led mit 20 Watt 700 mA. An der Stromquelle ist ein PWM Eingang mit L=0v und H=5v und 100-1KHz Wie setze ich das jetzt die 1-10v in ein PMW Signal um?????? Leider hab ich mit Microcontrollern bis jetzt nichts zu tun. Drum mein Hilferuf. Wer kann mir helfen mein vorhaben umzusetzen????
Du brauchst nicht unbedingt einen MC, du kannst auch den klassischen PWM Modulator aus Dreieckgenerator und nachgeschaltetetem Komparator bauen. Den Dreieckgenerator mit Ausgang zwischen 0 und 10V brauchst du nur einmal und legst ihn auf alle - Eingänge der Komparatoren. Auf die Pluseingänge der Komparatoren legst du dein 0-10V Signal. Am Ausgang der Komparatoren liegen PWM modulierte Rechtecksignale mit der Frequenz des Dreieckgenerators.
Matthias Sch. schrieb: > Du brauchst nicht unbedingt einen MC, du kannst auch den klassischen PWM > Modulator aus Dreieckgenerator und nachgeschaltetetem Komparator bauen. Passende Schaltungen findet man u.a. in den dse-faq.
Danke erst mal für die schnellen Antworten. unter dse-faq bin ich leider nicht fündig geworden. Würde sich bitte jemand erbarmen und mir einen leicht verständlichen Schaltplan am besten mit genauen Bezeichnung der Bauteilen und Werten die ich dann 1 zu 1 für mich übernehmen kann erstellen. Bin wie gesagt Leihe aber löten bring ich hin :-)und die Bauteile besorgen auch. Wie gesagt hätte 4Stck 1-10V Ausgänge an denen jeweils 6 Konstantstromquellen hängen sollen. Danke schon mal in Vorraus. Hätte auch noch ein Atmel Evaluationbord Ver.2.01 und einen Atmega8535 da auf den ich wenigstens schon mal laut youtub Anleitung die LED auf den Board zum blinken bring. Ich weiß ja nicht was einfacher zu realisieren wäre mit MC oder oben die Variante ohne. Bin wirklich über jede Hilfe dankbar.
:
Bearbeitet durch User
Das ist die Schaltung, vorderer Teil ein mal, hinterer pro PWM Kanal +-----------------------+---+---- +5V | | | 47k +---47k--+ 47k | | | | | | +--+--|+\ | 0-10V | | | | >--+ | | | +--|-/ 47k o-47k--+--|+\ | | | | | >-- PWM | +--------+-----------(--|-/ 47k | | | TS914 | 100nF 22k | | | | | +-----------+-----------+---+---- GND Die kann man auf eine Lochrasterplatine auflöten.
>Hätte auch noch ein Atmel Evaluationbord Ver.2.01 und einen Atmega8535 >da auf den ich wenigstens schon mal laut youtub Anleitung die LED auf >den Board zum blinken bring. >Ich weiß ja nicht was einfacher zu realisieren wäre mit MC oder oben die >Variante ohne. >Bin wirklich über jede Hilfe dankbar. Schau mal ins Datenblatt von Deinem Atmel: - Four PWM Channels – 8-channel, 10-bit ADC Ist alles drin, was Du brauchst. Quick und dirty mit der Demo von Bascom die Spannung einlesen und entsprechend PWM raushauen. Hilfestellung gibt Tante Google in Hülle und Fülle. Gruß N8
Das es mit dem MC funktionieren müsste weiß ich ja. Bin aber schon drei Tage am suchen wie. Mit Bascom Spannung einlesen und per PWM ausgeben ist ja super und das will ich auch aber wie?????
Markus Mois schrieb: > Das es mit dem MC funktionieren müsste weiß ich ja. Bin aber schon drei > Tage am suchen wie. Bei so wenig Vorwissen zum Thema µC, würde ich schätzen, dass du mit der Schaltung die MaWin gepostet hat schneller ans Ziel kommst.
Hallo meine Entscheidung ist gefallen. Nachdem ich bis heut früh um 4.30Uhr am PC gesessen bin. Will es auf jedenfall mit Spannungsteiler fürs Eingangsignal 1-10V müsste doch mit zwei 1k E12 hin hauen oder? Dann mit Bascom ADC die Spannung einlesen und dann per Pwm ausgeben. Habe heut Nacht die bascom avr tutorial auf youtube durchgemacht. Sprich auch die folgen mit der pmw und adc aber wie die Erkenntnisse miteinander verbinden????? Weil das Einlesen ist die eine Sache aber dann die Pmw Ausgabe anhand der ermitteltem Werte die andere :-(
Das sollte nicht so aufregend sein. Sie bekommen vom ADC einen Wert von 0-255 (ich denke 8 Bit sollten reichen) der dann eben für eine Frequenz von 100- 1 kHz entsprechen soll. Also ADC 0 = 100 Hz ADC 255 = 1 kHz Das ist eine Geradengleichung (y = kx+d), k ist dann in etwa 3,5 und d=100. f_soll = 7/2*ADC+100 Jetzt brauchen S' noch ein Rechtecksignal mit dieser Frequenz,dafür nimmt man wohl am besten einen Counter im ctc und toggle-mode. f_pwm = f_clk / (2*N*(1+ OCRnA)) mit f_soll = f_pwm kommt man dann für OCRnA auf: OCRnA = ( f_clk / ( (7*ADC +200)*N ) ) -1 (N steht für den Prescaler des Timers, für den müssen S' noch einen sinnvollen Wert finden, das heißt einen mit dem ihnen bei ADC = 255 OCRnA gerade nicht überläuft)
:
Bearbeitet durch User
innerand innerand schrieb: > Also > ADC 0 = 100 Hz > ADC 255 = 1 kHz Das ist doch Käse. Die PWM soll immer z.B. 250Hz betragen. Nur das Tastverhältnis ändert sich von 0% bis 100%. Du hast nicht die leiseste Ahnung von PWM, willst hier aber jemandem beraten, das ist doch peinlich.
MaWin schrieb: > Das ist doch Käse. > > Die PWM soll immer z.B. 250Hz betragen. > Nur das Tastverhältnis ändert sich von 0% bis 100%. Markus Mois schrieb: >An der Stromquelle ist ein PWM Eingang mit L=0v und H=5v und 100-1KHz Daraus würde ich nun doch schließen, dass es hier um die Frequenz geht und nicht um die Pulsweite. MaWin schrieb > Du hast nicht die leiseste Ahnung von PWM, > willst hier aber jemandem beraten, > das ist doch peinlich. 1. Kann ich mich nicht erinnern Ihnen das Du angeboten zu haben. 2. Sollten sie ihre Umgangsformen überdenken. So können S' vielleicht am Stammtisch rum rotzen aber nicht hier im Forum.
innerand innerand schrieb: > MaWin schrieb >> Du hast nicht die leiseste Ahnung von PWM, >> willst hier aber jemandem beraten, >> das ist doch peinlich. > > 1. Kann ich mich nicht erinnern Ihnen das Du angeboten zu haben. > 2. Sollten sie ihre Umgangsformen überdenken. So können S' vielleicht am > Stammtisch rum rotzen aber nicht hier im Forum. Getroffene Hunde bellen... Manche sogar unnötig laut siehe 1. und ungehobelt siehe 2. Im übrigen ist das "Du" absolut gängige Umgangsform im Internet - im In - und Ausland. Schon ewig.
:
Bearbeitet durch User
innerand innerand schrieb: >>An der Stromquelle ist ein PWM Eingang mit L=0v und H=5v und 100-1KHz > > Daraus würde ich nun doch schließen, dass es hier um die Frequenz geht > und nicht um die Pulsweite. Falsch geschlossen, schliesslich heisst es PWM und nicht PFM.
Leute Leute Leute bitte bitte bitte so wird mir und auch Anderen die so etwas mal verwirklichen wollen am aller wenigsten geholfen.Bitte bleibt höflich und vertragt Euch. Was ist nun richtig bzw wie könnte es funzen? Im Datenblatt der Konstantstromquelle Mean Well LDD-700l steht PWM Frequency: 100~1KHz
:
Bearbeitet durch User
100 Hz PWM modulierte Konstanstromquelle ist wohl für den vorgesehen Anwendungszweck wohl eher grenzwertig, zumal ja 24 in 4 Gruppen betrieben werden sollen. 1 kHz sollte man da in jedem Fall anstreben. Kann aber auch durchaus sein, daß diese ganze Lösung ungeeignet ist. Könnte zu unerwünschten Schwebungseffekte kommen, den einig Bewohner des Aquariums nicht unbedingt mögen.
Markus Mois schrieb: > > Was ist nun richtig bzw wie könnte es funzen? > Im Datenblatt der Konstantstromquelle Mean Well LDD-700l steht > PWM Frequency: 100~1KHz Ja, der Rüpel hatte wohl recht. Gedimmt wird direkt über die Pulsweite. Das macht die Sache allerdings auch einfacher. Mit einem 8-Bit-Timer im FastPWM Mode kann man dann eigentlich direkt den ADC-Wert als Output Compare übergeben. Und den Prescaler wählt man halt so, dass sich eine Frequenz zwischen 100- und 1 kHz ergibt.
Markus Mois schrieb: > Im Datenblatt der Konstantstromquelle Mean Well LDD-700l steht > PWM Frequency: 100~1KHz Das heisst, Du kannst dazwischen alle PWM-Frequenzen nehmen, die Du gerade schön findest und nicht, das Du die Frequenz dauernd wechselst. Gruss Harald
Bitte haut mich nicht aber was haltet Ihr davon: $regfile = "m8535def.dat" $crystal = 8000000 Config ADC = Single , Prescaler = Auto , Reference = Avcc Config TIMER1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1 Config TIMER1 = Pwm , Pwm = 10 , Compare B Pwm = Clear Down , Prescale = 1 Config TIMER2 = Pwm , Pwm = 10 , Compare Pwm = Clear Down , Prescale = 1 Start ADC Dim Wert As Integer Do COMPARE1A = Getadc(0) COMPARE1B = Getadc(1) COMPARE2 = Getadc(2) Waitms 500 Loop End
Markus Mois schrieb: > Bitte haut mich nicht aber was haltet Ihr davon: Schwer zu sagen da ich kein Bascom kann. Aber wurden da die unterschiedlichen Bit-Breiten berücksichtigt? Der ADC liefert 10 Bit, Timer1 ist 16 Bit breit, Timer2 8 Bit (jedenfalls wenn Bascom so nummeriert wie das Datenblatt). Vom ADC will man eigentlich noch die 2 niederwertigsten Bits loswerden (also >> 2, zumidnest in c). Die Timer sollten nur bis 255 laufen (8bit), das heißt Timer 1 müsste man ein Top auf 255 setzen (oder Timer0 verwenden). Und was bedeutet Prescaler = 1? Heißt das kein Prescaler? Damit würde man bei 8 Mhz auf eine PWM Frequenz von 31,25 kHz kommen, die ist zu hoch. Mit einem Prescaler von 64 wären es 488 Hz. mit 256 122 Hz, das würde wohl auch noch reichen (weniger oft schalten = geringere Verluste).
Prescaler = 1bedeutet die Frequenz die vom Quarz kommt wird durch 1 geteilt. Ist glaube ich so in Ordnung ! Habe auch noch einen Atmega8 zuhause wie siehts dann damit aus bzw. Würde das so funzen???? $regfile = "m8def.dat" $crystal = 8000000 Config ADC = Single , Prescaler = Auto , Reference = Avcc Config Portb.1 = Output Config Portb.2 = Output Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1 Start ADC Start Timer1 Do Compare1a = Getadc(0) Compare1b = Getadc(1) Loop End
Markus Mois schrieb: > Prescaler = 1bedeutet die Frequenz die vom Quarz kommt wird durch 1 > geteilt. Ist glaube ich so in Ordnung ! Das glaub ich nicht, jedenfalls nicht wenn der mit 8 Mhz läuft. f_pwm = f_clk/(N * 256) Das macht dann 31,25 kHz. Der LED-Treiber spielt aber nur bis 1kHz mit.
Dann sollte ich wohl 8 nehmen das wären dann (80000000Hz/8) / (1024*2) = 488,28125 Hz ist das korrekt?
Markus Mois schrieb: > Dann sollte ich wohl 8 nehmen das wären dann (80000000Hz/8) / (1024*2) = > 488,28125 Hz ist das korrekt? Nö. N steht in der Formel für den Prescaler, die 256 kommen vom 8 Bit Counter. Woher kommen Ihre 1024*2? Wenn Sie auf die 1024 aufgrund der 10 Bit des ADCs kommen, dann müssen S' dem 16 Bit Counter ein TOP von 1023 geben, ansonsten zählt der bis 65535 und dann können Sie ihm den ADC Wert nicht mehr direkt übergeben (also können schon...). Wenn Sie das machen dann wäre die PWM-Frequenz: 8Mhz/(N*1024) Also 976 Hz bei einem Prescaler von 8 bzw. 122 Hz bei einem Prescaler von 64. Wobei hier Letzteres zu bevorzugen wäre (da geringe Verluste). Oder für 8 Bit Counter eben wie bereits erwähnt einen Prescaler von 64 bzw. 256, in dem Fall müsste man vom ADC aber noch die zwei LSB raus werfen.
Hab ich von : rn-wissen.de/index.php/Bascom_und_PWM
Ok, die machen da eine phasenkorrekte PWM, das ist hier eigentlich nicht notwendig sollte aber auch funktionieren, deshalb ist da noch die 2 dabei. Damit ist dann auch Ihre Berechnung korrekt und der Prescaler von 8 ist ok. Allerdings müssten Sie die dann auf Clear-down stellen, damit bei 0 auch eine Pulsweite von 0 und nicht 100% rauskommt. (Jedenfalls wenn die Beschreibung von nrw-wissen stimmt, der Bezeichnung nach müsste es sich meiner Meinung nach genau umgekehrt verhalten.)
Ok super ! danke für Ihre Mühen werd ich mal testen. Innerand würden Sie wenn sie Lust haben das komplette Programm mal so wie Sie es sich vorstellen,in c umschreiben? Wäre echt super!
So ungefähr, ist aber nicht getestet:
1 | #include <avr/io.h> |
2 | #include <stdio.h> |
3 | |
4 | unsigned char adc_read8(char channel); |
5 | |
6 | int main(void) |
7 | {
|
8 | |
9 | //PD4,5 output
|
10 | DDRD = (1<<DDD4) | (1<<DDD5); |
11 | |
12 | //TIMER 1
|
13 | ICR1 = 255; |
14 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<< WGM11); //Fast PWM, TOP = ICR1, Clear on Compare Match |
15 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1 << CS12); //Fast PWM, Prescaler 256 |
16 | |
17 | |
18 | //ADC
|
19 | ADMUX = (1<<REFS1) | (0<<REFS0) | (1<<ADLAR); //VRef = AVCC |
20 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADEN); // 125 kHz @ 8 Mhz, ADC enabled |
21 | ADCSRA |= (1<<ADSC); |
22 | while (ADCSRA & (1<<ADSC)); |
23 | |
24 | unsigned int i = 0; |
25 | while(1) |
26 | {
|
27 | if (~i) |
28 | {
|
29 | OCR1A = adc_read8(PA0); |
30 | OCR1B = adc_read8(PA1); |
31 | }
|
32 | i++; |
33 | }
|
34 | }
|
35 | |
36 | unsigned char adc_read8(char channel) |
37 | {
|
38 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
39 | ADCSRA |= (1<<ADSC); |
40 | while (ADCSRA & (1<<ADSC)); |
41 | return ADCH; |
42 | }
|
Danke erstmal und das kann ich jetzt zum testen 1:1 in meinen Atmega8 übernehmen ? An welchen ADC Pin schick ich mein 1-5v Signal rein?
Ja, sollte klappen. Eingelesen wird an PA0 und PA1, Die PWM kommt von PD5 und PD4.
Ok Danke werd ich morgen früh mal testen da und dann Bericht erstatten!
Habe den Code in Atmel Studio übertragen es kommen folgene 2 Fehlermeldungen: Error 1 'PA0' undeclared (first use in this function) Message 2 each undeclared identifier is reported only once for each function it appears in Error 3 'PA1' undeclared (first use in this function) Was ist zu tun ????
PA0 im Programm durch 0 und PA1 durch 1 ersetzen oder
1 | #define PA1 1
|
2 | #define PA0 0
|
oben zum Programm hinzufügen. Wobei er das eigentlich kennen müsste. Haben Sie in ihrer IDE den korrekten µC ausgewählt?
Einen PORTA gibt`s beim Mega8 nicht, der ADC liegt auf PORTC
Also ich hab hier das Datenblatt eines ATmega8535 (den der TO haben
will) und darin gibt es den PortA wohl und dahinter soll demnach auch
der ADC liegen.
Markus Mois schrieb:
> Hätte auch noch ein Atmel Evaluationbord Ver.2.01 und einen Atmega8535
Edit:
Ok, grad gesehen, dass der TO wohl doch ein ATmega8 verwendet.
Dann gibt es den Port tatsächlich nicht.
Somit wäre PA0 und PA1 durch PC0 und PC1 zu ersetzen, die PWM kommt von
PB1 und PB2.
Das hier
1 | DDRD = (1<<DDD4) | (1<<DDD5); |
wäre dann entweder zu entfernen oder durch
1 | DDRB = (1<<DDB1) | (1<<DDB2); |
zu ersetzen. (Ich geh jetzt mal davon aus, dass die Timer und Register beim Mega8 ansonsten gleich sind... )
:
Bearbeitet durch User
Hallo danke für die tolle Arbeit innerand. Ja mit oben genannten Code und Atmega 8535 gibts keine Errors! Teste jetzt und gib bescheid.
Da bin ich wieder mit den ersten Testergebnissen: Mit dem Atmega 8535 Leider funktioniert es noch nicht optimal. Dimmen macht es aber wie!!! Das heißt wenn ich wenn ich am PA1oderPA0 unter 50% sprich 2,5V fahre wird die LED zwar dunkler aber das Flakern ist nicht aus zu halten und wird immer teutlicher um soweniger ich Spannung rein fahre. Geht mann jedoch über 50% ist kein Flakern mehr mit bloßen Auge erkennbar. Was ist zutun ????
:
Bearbeitet durch User
Markus Mois schrieb: > Was ist zutun ???? Hmm, war eigentlich der Meinung, dass man bei einer Frequenz von 122 Hz kein Flackern mehr wahrnehmen würde. Läuft der µC auch mit 8 Mhz? Ansonsten mal einen anderen Prescaler versuchen:
1 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1 << CS12); |
durch
1 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10); //Prescaler 64 |
ersetzen.
Und da ist er wieder der Leihe: Ich weiß leider nicht mit welcher Mhz der mc arbeitet. Ich weiß auch nicht wie ich es setzen kann. Hab es nur 1:1 mit Ponyprog2000 in den mc geschrieben. Hab jetzt versucht ein #define F_cpu 8000000UL mit rein zuschreiben aber dann bringt mir Ponyprog eine Fehlermeldung und schreibt es mir nicht in den mc.
Eingestellt wird das über die Fuse-Bits, der Default ist hier der interne 1 MHz Oszilator, am Board gäb's einen externen Quarz mit 16 MHz. Gut möglich, dass er mit 1 MHz läuft, dann wären wir mit der PWM nur noch bei etwa 15 Hz, was das Flakern erklären würde. Mit dem geänderten Prescaler sollte das dann verschwinden.
:
Bearbeitet durch User
ALso im Dattenblatt steht unter Calibrated Internal RC Oscillator CKSEL3..0 0100 wären 8 MHz Bei PonyProg entspricht ein gesetztes Häkchen einer 0 im Datenblatt somit müsste ich nur bei CKSEL2 das Häckchen enfernen, oder??? Muß ich dann noch etwas machen oder läuft er dann auf 8MHz? Das #define F_cpu 8000000UL muss das dann in den Code mit rein oder nicht?
Das mit den Fusebits ist nicht ganz so trivial, da kann man sich schnell mal "aussperren" und für diesen Anwendungsfall ist auch der interne Oszillator vollkommen ausreichend. Also am Besten einfach den Prescaler ändern ;) Ansonsten, das hier https://www.mikrocontroller.net/articles/AVR_Fuses und das Datenblatt lesen.
Super habe in jetzt auf 8MHz gesetzt und sonst hab ich nichts verändert und was soll ich sagen das Flakern ist weg. Danke für die tolle Arbeit und Unterstützung. Es gibt aber noch eine Kleinigkeit die ich glaube das sie noch nicht passt laut meinen Tests ist folgendes: 1- ca.50% sprich Eingangssignal 1-2,5v stetiges ansteigen der Helligkeit und des Watt verbrauches zwischen 51-100% keine Mehrzunahme der Helligkeit erkennbar und der Verbrauchin Watt der LEDs bleibt gleich wie bei 50 % Was könnte das noch sein???
:
Bearbeitet durch User
Schon mal nachgemessen, ob am Eingang wirklich 0-5V ankommen bzw. welche Spannung messen Sie am AREF Pin? Ansonsten ist es grundsätzlich so, dass hier die Helligkeit linear gesteigert wird, die Wahrnehmung der Helligkeit aber logarithmisch ist, je heller die LED wird, umso geringer nimmt man die Steigerung der Helligkeit wahr. Wie haben S' denn die Leistung gemessen, (die müsste trotzdem linear ansteigen)? Sind Jumper 5 bzw. 6 eventuell gesetzt? Die sollten offen sein. Jedenfalls der Jumper 5 wird ein Problem machen, da der Kondensator dort die PWM glätten würde...
:
Bearbeitet durch User
Also am Eingang kommen dev. 0-4,92v an. Denn Verbrauch hab ich mit einem Wattmeter gemessen. Der bleibt wirklich ab ca. 50-100% gleich. unter 50% fällt er kontinuierlich ab. Mal die Daten bei ca. 60% : Eingang= 3,32v Verbrauch=17,2 Watt AREF Pin = 2,65v Jumper 5 und 6 sind draussen keine Änderung :-(
:
Bearbeitet durch User
Ok, da stimmt was mit der Reverenz-Spannung des ADCs nicht, die sollte eigentlich bei 5V liegen. Hab da zwei Bits vertauscht, statt
1 | ADMUX = (1<<REFS1) | (0<<REFS0) | (1<<ADLAR); //VRef = AVCC |
gehört
1 | ADMUX = (1<<REFS0) | (1<<ADLAR); //VRef = AVCC |
Hast du eigendlich schon mal über die spektrale Lichtverteilung bei den LEDs nachgedacht? Die Aquariumleuchte soll doch die Pflanzen mit Licht und Energie versorgen. Welche (Licht)-Wellenlänge wird von den Pflanzen benötigt und kann das Wasser passieren. Und welche Wellenlängen werden von den LED emmiriert? Stichwort diskontinuierliches Spektrum. Nicht ohne Grund sind Aquariumlampen eine "besondere Lichtquelle"
Jap jetzt funzt es. Hab mich oben verschrieben es kommen aus meiner Schnittstelle 0.51-4,92 raus. Deshalb noch folgendes kleines Problem. bei 0% =0.0V glimmt die LED ganz leicht das kann mann ja nicht ganz abstellen, mache ich mit einer Schaltsteckdose und ist auch kein Problem, aber sobald ich auf 1% gehe, sie ahnen es bestimmt schon, kommen ja gleich 0,51v und die LED Blitzt sofort mit einer ganz schönen Grundhelligkeit auf und meine Fische schrecken wieder auf. Könnten sie mir das bitte bitte noch anpassen???
Ersetzten S' das
1 | OCR1A = adc_read8(PA0); |
2 | OCR1B = adc_read8(PA1); |
durch das
1 | OCR1A = adc_read8(0x18); |
2 | OCR1B = adc_read8(0x19); |
Und legen S' 0.5V an PA2. 0% sind dann gleich 0.5V 100% 5,5V Wenn Sie das LED ganz aus machen können wollen, dann ersetzen S' das
1 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<< WGM11); //Fast PWM, TOP = ICR1, Clear on Compare Match |
durch das
1 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) |(1<< WGM11); //Fast PWM, TOP = ICR1, Set on Compare Match |
Dann sind 5,5V = 0% und 0.5V = 100%
Martin B. aus E. schrieb: > Welche (Licht)-Wellenlänge wird von den Pflanzen benötigt und kann das > Wasser passieren. Typisch wird Rot benötigt, und da kommt bei weissen LEDs so gut wie garnichts raus.
ich soll zusätzlich an PA2 0.5v anlegen. meine Eingänge PA0 und PA1 bleiben gleich da schick ich dann meine 0.5-5v rein oder? zusätzlich bedeutet es dann aber das ich keine 100% mehr ausgeben kann weil ich ja keine 5.5v habe sondern nur max 4.92v aus meiner Schnittstelle raus kommen.oder ?
:
Bearbeitet durch User
wird eine meerwasser Beleuchtung und ich verwende royal blue,coolwhite und ein paar rote Leds !
Guten Tag, ich möchte ebenfalls LEDs mit 0-10v dimmen. Das mit einem Mega8. Hab jetzt den Code von innerand übernommen. Funktioniert auch alles gut, außer das die LEDs bei 0v stark gedimmt weiter leuchten. Kann mir einer vielleicht helfen den Code zu ändern, damit die LEDs bei 0v ganz aus sind? Hier ist der Code, den ich genommen hab
1 | #define PC1 1
|
2 | #define PC0 0
|
3 | #include <avr/io.h> |
4 | #include <stdio.h> |
5 | |
6 | unsigned char adc_read8(char channel); |
7 | |
8 | int main(void) |
9 | {
|
10 | |
11 | //PC4,5 output
|
12 | DDRB = (1<<DDB1) | (1<<DDB2); |
13 | |
14 | |
15 | //TIMER 1
|
16 | ICR1 = 255; |
17 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<< WGM11); //Fast PWM, TOP = ICR1, Clear on Compare Match |
18 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10); //Prescaler 64 //Fast PWM, Prescaler 256 |
19 | |
20 | |
21 | //ADC
|
22 | ADMUX = (1<<REFS0) | (1<<ADLAR); //VRef = AVCC |
23 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADEN); // 125 kHz @ 8 Mhz, ADC enabled |
24 | ADCSRA |= (1<<ADSC); |
25 | while (ADCSRA & (1<<ADSC)); |
26 | |
27 | unsigned int i = 0; |
28 | while(1) |
29 | {
|
30 | if (~i) |
31 | {
|
32 | OCR1A = adc_read8(PC0); |
33 | OCR1B = adc_read8(PC1);; |
34 | |
35 | }
|
36 | i++; |
37 | }
|
38 | }
|
39 | |
40 | unsigned char adc_read8(char channel) |
41 | {
|
42 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
43 | ADCSRA |= (1<<ADSC); |
44 | while (ADCSRA & (1<<ADSC)); |
45 | return ADCH; |
46 | }
|
Wenn ich richtig informiert bin, dann ist ein Duty Cycle vom 0% beim AVR Prinzip bedingt nicht möglich. Man könnte das PWM invertieren. Dann kommst du aber nichtganz auf 100%. Ins Register schreibst du dann das: OCR1A=255-adc_read8(PC0); Keine Ahnung wie man dem PWM-Ausgang invertiert.
hmmm ne invertieren geht nicht (5v>0% 0v>99% so meinen Sie?). Kann man nicht zusätzlich ein Ausgang nehmen. Womit ich einschalten bzw. ausschalten kann. Damit bei 0.01v am Eingang der Ausgang mit 5v ganz durchschaltet wird und bei 0.00v der Ausgang auf 0v geschaltet wird Oder was kan man sonst machen außer invertieren.
Stas S. schrieb: > Kann man nicht zusätzlich ein Ausgang nehmen. Womit ich einschalten bzw. > ausschalten kann. Du könntest das PWM-Modul auch komplett deaktivieren, wenn die Ausgansspannung 0V sein sollte.
Danke für deine hilfe:) Wie den ich hab nur die 0-10v. damit muss ich die LED einschalten dimmen und ausschalten.
Stas S. schrieb: > ne invertieren geht nicht Sollte gehen: http://www.atmel.com/images/atmel-2486-8-bit-avr-microcontroller-atmega8_l_datasheet.pdf S.96 Ich kann nicht garantieren, da ich mit dem Datenblättern von Atmel nicht gut zurechtkomme (programmiere nur PIC) Ich meine so: Wenn du 255 ins OCR1A schreibst, ist der PWM auf 0%, wenn du 0 ins OCR1A auf 100%. Du musst dann aber 0 ins OCR1A schreiben wenn der ADC Wert 255 ist und 255 wenn der ADC Wert 0 Das geht dann mit dieser Formel: OCR1A=255-adc_read8(PC0); In summer führ dass dann dazu: ADC 255 --> fast 100% ADC 0 --> 0% Max H. schrieb: > Du könntest das PWM-Modul auch komplett deaktivieren, wenn die > Ausgansspannung 0V sein sollte. In pseudocode könnte das so aussehen:
1 | while(1) |
2 | {
|
3 | if (~i) |
4 | {
|
5 | adc0 = adc_read8(PC0); |
6 | adc1 = adc_read8(PC1); |
7 | if(adc0) |
8 | OCR1A = adc0; |
9 | else
|
10 | pwm aus, ausgang auf null |
11 | if(adc1) |
12 | OCR1B = adc1; |
13 | else
|
14 | pwm aus, ausgang auf null |
15 | |
16 | }
|
17 | i++; |
18 | }
|
Bitte korrigiert mich, wenn ich falsch liege.
:
Bearbeitet durch User
Ich hab leider keine Erfahrung mit mc zu programmieren. Hier mein Versuch. Hab jetzt dein pseudocode dazugefügt sieht jetzt so aus
1 | #define PC1 1
|
2 | #define PC0 0
|
3 | #include <avr/io.h> |
4 | #include <stdio.h> |
5 | |
6 | unsigned char adc_read8(char channel); |
7 | |
8 | int main(void) |
9 | {
|
10 | |
11 | //PC4,5 output
|
12 | DDRB = (1<<DDB1) | (1<<DDB2); |
13 | |
14 | |
15 | //TIMER 1
|
16 | ICR1 = 255; |
17 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<< WGM11); //Fast PWM, TOP = ICR1, Clear on Compare Match |
18 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10); //Prescaler 64 //Fast PWM, Prescaler 256 |
19 | |
20 | |
21 | //ADC
|
22 | ADMUX = (1<<REFS0) | (1<<ADLAR); //VRef = AVCC |
23 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADEN); // 125 kHz @ 8 Mhz, ADC enabled |
24 | ADCSRA |= (1<<ADSC); |
25 | while(1) |
26 | {
|
27 | if (~i) |
28 | {
|
29 | adc0 = adc_read8(PC0); |
30 | adc1 = adc_read8(PC1); |
31 | if(adc0) |
32 | OCR1A = adc0; |
33 | else
|
34 | if(adc1) |
35 | OCR1B = adc1; |
36 | else; |
37 | |
38 | }
|
39 | i++; |
40 | }
|
41 | }
|
42 | |
43 | |
44 | unsigned char adc_read8(char channel) |
45 | {
|
46 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
47 | ADCSRA |= (1<<ADSC); |
48 | while (ADCSRA & (1<<ADSC)); |
49 | return ADCH; |
50 | }
|
und diese 3 Fehler kommen: Error 3 'adc0' undeclared (first use in this function) Error 4 'adc1' undeclared (first use in this function) Error 1 'i' undeclared (first use in this function)
Versuchs mal so:
1 | #define PC1 1
|
2 | #define PC0 0
|
3 | #include <avr/io.h> |
4 | #include <stdio.h> |
5 | |
6 | unsigned char adc_read8(char channel); |
7 | |
8 | int main(void) |
9 | {
|
10 | unsigned int i; |
11 | unsigned char adc0,adc1; |
12 | //PC4,5 output
|
13 | DDRB = (1<<DDB1) | (1<<DDB2); |
14 | PORTB&= ~( (1<<PB1) | (1<<PB2) ); |
15 | |
16 | //TIMER 1
|
17 | ICR1 = 255; |
18 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<< WGM11); //Fast PWM, TOP = ICR1, Clear on Compare Match |
19 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10); //Prescaler 64 //Fast PWM, Prescaler 256 |
20 | |
21 | |
22 | //ADC
|
23 | ADMUX = (1<<REFS0) | (1<<ADLAR); //VRef = AVCC |
24 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADEN); // 125 kHz @ 8 Mhz, ADC enabled |
25 | ADCSRA |= (1<<ADSC); |
26 | while(1) |
27 | {
|
28 | if (~i) |
29 | {
|
30 | adc0 = adc_read8(PC0); |
31 | adc1 = adc_read8(PC1); |
32 | if(adc0) |
33 | {
|
34 | TCCR1A|=(1<<COM1A1); //Aktiviert PWM |
35 | OCR1A = adc0; |
36 | }
|
37 | else
|
38 | TCCR1A&= ~(1<<COM1A1); //Deaktiviert PWM |
39 | |
40 | if(adc1) |
41 | {
|
42 | TCCR1A|=(1<<COM1B1); //Aktiviert PWM |
43 | OCR1B = adc1; |
44 | }
|
45 | else
|
46 | TCCR1A&=1<<COM1B1); //Deaktiviert PWM |
47 | }
|
48 | i++; |
49 | }
|
50 | }
|
51 | |
52 | |
53 | unsigned char adc_read8(char channel) |
54 | {
|
55 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
56 | ADCSRA |= (1<<ADSC); |
57 | while (ADCSRA & (1<<ADSC)); |
58 | return ADCH; |
59 | }
|
Wenn's immer noch nicht funktioniert, gebe ich auf und lasse die Leute ran, die von AVRs wirklich was verstehen.
:
Bearbeitet durch User
1 | #define PC1 1
|
2 | #define PC0 0
|
3 | #include <avr/io.h> |
4 | #include <stdio.h> |
5 | |
6 | unsigned char adc_read8(char channel); |
7 | |
8 | int main(void) |
9 | {
|
10 | |
11 | //PC4,5 output
|
12 | DDRB = (1<<DDB1) | (1<<DDB2); |
13 | |
14 | |
15 | //TIMER 1
|
16 | ICR1 = 255; |
17 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B01) | (1<< WGM11); //Fast PWM, TOP = ICR1, Clear on Compare Match |
18 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10); //Prescaler 64 //Fast PWM, Prescaler 256 |
19 | |
20 | |
21 | //ADC
|
22 | ADMUX = (1<<REFS0) | (1<<ADLAR); //VRef = AVCC |
23 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADEN); // 125 kHz @ 8 Mhz, ADC enabled |
24 | ADCSRA |= (1<<ADSC); |
25 | while (ADCSRA & (1<<ADSC)); |
26 | |
27 | unsigned int i = 0; |
28 | while(1) |
29 | {
|
30 | if (~i) |
31 | {
|
32 | OCR1A = 255-adc_read8(PC0); |
33 | OCR1B = 255-adc_read8(PC1);; |
34 | |
35 | }
|
36 | i++; |
37 | }
|
38 | }
|
39 | |
40 | unsigned char adc_read8(char channel) |
41 | {
|
42 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
43 | ADCSRA |= (1<<ADSC); |
44 | while (ADCSRA & (1<<ADSC)); |
45 | return ADCH; |
46 | }
|
Noch eine zweite möglichkeit, die vllt. funktionieren könnte.
:
Bearbeitet durch User
Markus Mois schrieb: > Ich weiß ja nicht was einfacher zu realisieren wäre mit MC oder oben die > Variante ohne. Die Frage hat sich nun nach fast einem Monat wohl geklärt. Die Schaltung mit dem 10-Cent-OpAmp + Hühnerfutter wär nach 10 Minuten am Steckbrett einsetzbar, und ihr bastelt hier (inzwischen in der zweiten Programmiersprache) immer noch am ADC-Einlesen herum... Und am Schluss kommt was unschönes heraus, weil in den niedrigen Helligkeitsstufen ein kleines ADC-Wackeln zu deutlich sichtbaren Helligkeitssprüngen führt.
Εrnst B✶ schrieb: > > Die Frage hat sich nun nach fast einem Monat wohl geklärt. > Die Schaltung mit dem 10-Cent-OpAmp + Hühnerfutter wär nach 10 Minuten > am Steckbrett einsetzbar hab in der Tat noch ein flackern im unteren dimm Bereich und brings nicht hin. Den besagten Schaltplan konnte ich nicht nachbauen, da ich in nicht verstehe wie ich in auf den Steckbrett umsetzen soll! vieleicht könnte a irgendwer den umzeichnen das in auch so ein Dummkopf wie ich in nachbauen kann! Danke !
MaWin schrieb: > +-----------------------+---+---- +5V > | | | > 47k +---47k--+ 47k | > | | | | | > +--+--|+\ | 0-10V | | > | | >--+ | | > | +--|-/ 47k o-47k--+--|+\ > | | | | | >-- PWM > | +--------+-----------(--|-/ > 47k | | | TS914 > | 100nF 22k | > | | | | > +-----------+-----------+---+---- GND Kann mir den keiner helfen???? Weiß nicht wie ich das umsetzen soll! Sprich an welche Pins ich die einzelnen Widerstände und den Kondensator an den Ts914 löten soll. Wo soll ich dann meine 0-10v rein schicken?und was soll das 0-47k sein ? Danke schon mal.
Schon mal einen Blick ins Datenblatt geworfen? http://www.st.com/web/en/resource/technical/document/datasheet/CD00000990.pdf Auf der ersten Seite findest du die Pinbelegung...
:
Bearbeitet durch User
Max H. schrieb: > Schon mal einen Blick ins Datenblatt geworfen? > http://www.st.com/web/en/resource/technical/document/datasheet/CD00000990.pdf > Auf der ersten Seite findest du die Pinbelegung... ja hab ich und trotzdem bringts mich nicht weiter! wo sind den oben im Schaltplan die Punkte bezeichnet? Wo ist der Inverting Input, der Non-Inverting Input? oder der punkt genau wo ich meine 0-10v einspeisen muss?
Non-Inverting Input ------|+\ | >------- Ausgang Inverting Input ------|-/ Erkennst du Parallelen zu meinem Anhang (Ausschnitt aus dem oben verlinkten Datenblatt)? Anschluss für die 0...10V o-47k-- Markus Mois schrieb: > was soll das 0-47k sein ? "o" ist der Anschluss für das 0-10V signal, "47k" ist ein 47kOhm Widerstand
:
Bearbeitet durch User
Ja Danke erkenn ich ! Heißt das das ich jetzt zum Beispiel an Non-Inverting Input 1 dann die 5v Betriebsspannung und an Non-Inverting Input 2 mein Steuerspannung einspeise und somit an Output 2 mein gewünschtes PWM signal raus kommt ? Dies bedeutet dann das ich mit einem TS914 2 PWM Signale erzeugen kann,richtig?
Markus Mois schrieb: > Max H. schrieb: >> Schon mal einen Blick ins Datenblatt geworfen? >> http://www.st.com/web/en/resource/technical/document/datasheet/CD00000990.pdf >> Auf der ersten Seite findest du die Pinbelegung... > > ja hab ich und trotzdem bringts mich nicht weiter! ja dann hast du dir halt das falsche hobby gesucht... briefmarken sammeln soll auch ganz schön sein und strengt das köpfchen nicht so an.
Markus Mois schrieb: > Non-Inverting Input 1 dann die 5v Betriebsspannung Wie kommst du darauf? Masse kommt an den Pin Nr. 11 und +5V kommt an den Pin Nr. 4
Das gibt es das ja zwei mal im Schaltplan: ------|+\ | >- ------|-/ Einmal rechts als PMW Ausgang und einmal links und da kommt über einen 47k Widerstand die +5V auf Plus rein. Soll also das Linke die Pins 4 und 11 symbolisieren? Danke schon mal für Deine Geduld
Wenn ich morgen Zeit habe, zeichne ich dir einen schönen Schaltplan mit den Pinnummern...
Danke vielmals! Teile sind geordert sobald ichs probiert hab erstatte ich Bericht!
äh, und mal was ganz anderes: hast du mal versucht an den pwm input eine analogspannung zw. 0 und 5v anzulegen? evtl. kann man sich die pwm komplett sparen, wenn im regler hinter dem pwm pin ein low-pass liegen sollte, der aus der pwm sowieso wieder eine analoge spannung macht...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.