Forum: Analoge Elektronik und Schaltungstechnik 0-10v in Pwm umsetzen für Konstantstromquelle


von Markus M. (iceagekommt)


Lesenswert?

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????

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

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
von MaWin (Gast)


Lesenswert?

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.

von N8Schicht (Gast)


Lesenswert?

>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

von Markus M. (iceagekommt)


Lesenswert?

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?????

von Max H. (hartl192)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

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 :-(

von innerand i. (innerand)


Lesenswert?

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
von MaWin (Gast)


Lesenswert?

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.

von innerand i. (innerand)


Lesenswert?

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.

von Hardy F. (hardyf)


Lesenswert?

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
von MaWin (Gast)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

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
von Mikki M. (mmerten)


Lesenswert?

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.

von innerand i. (innerand)


Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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

von Markus M. (iceagekommt)


Lesenswert?

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

von innerand i. (innerand)


Lesenswert?

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).

von Markus M. (iceagekommt)


Lesenswert?

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

von innerand i. (innerand)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

Dann sollte ich wohl 8 nehmen das wären dann (80000000Hz/8) / (1024*2) = 
488,28125 Hz ist das korrekt?

von innerand i. (innerand)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

Hab ich von :
rn-wissen.de/index.php/Bascom_und_PWM

von innerand i. (innerand)


Lesenswert?

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.)

von Markus M. (iceagekommt)


Lesenswert?

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!

von innerand i. (innerand)


Lesenswert?

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
}

von Markus M. (iceagekommt)


Lesenswert?

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?

von innerand i. (innerand)


Lesenswert?

Ja, sollte klappen.
Eingelesen wird an PA0 und PA1, Die PWM kommt von PD5 und PD4.

von Markus M. (iceagekommt)


Lesenswert?

Ok Danke werd ich morgen früh mal testen da und dann Bericht erstatten!

von Markus M. (iceagekommt)


Lesenswert?

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 ????

von innerand i. (innerand)


Lesenswert?

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?

von Mikki M. (mmerten)


Lesenswert?

Einen PORTA gibt`s beim Mega8 nicht, der ADC liegt auf PORTC

von innerand i. (innerand)


Lesenswert?

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
von Markus M. (iceagekommt)


Lesenswert?

Hallo danke für die tolle Arbeit innerand.
Ja mit oben genannten Code und Atmega 8535 gibts keine Errors!

Teste jetzt und gib bescheid.

von Markus M. (iceagekommt)


Lesenswert?

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
von innerand i. (innerand)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

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.

von innerand i. (innerand)


Lesenswert?

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
von Markus M. (iceagekommt)


Lesenswert?

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?

von innerand i. (innerand)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

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
von innerand i. (innerand)


Lesenswert?

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
von Markus M. (iceagekommt)


Lesenswert?

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
von innerand i. (innerand)


Lesenswert?

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

von Martin B. (statler)


Lesenswert?

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"

von Markus M. (iceagekommt)


Lesenswert?

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???

von innerand i. (innerand)


Lesenswert?

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%

von Harald W. (wilhelms)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

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
von innerand i. (innerand)


Lesenswert?

Ja.

von Markus M. (iceagekommt)


Lesenswert?

wird eine meerwasser Beleuchtung und ich verwende royal blue,coolwhite 
und ein paar rote Leds !

von Stas S. (stas0)


Lesenswert?

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
}

von Max H. (hartl192)


Lesenswert?

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.

von Stas S. (stas0)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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.

von Stas S. (stas0)


Lesenswert?

Danke für deine hilfe:)

Wie den ich hab nur die 0-10v.
damit muss ich die LED einschalten dimmen und ausschalten.

von Max H. (hartl192)


Lesenswert?

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
von Stas S. (stas0)


Lesenswert?

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)

von Max H. (hartl192)


Lesenswert?

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
von Max H. (hartl192)


Lesenswert?

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
von Εrnst B. (ernst)


Lesenswert?

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.

von Markus M. (iceagekommt)


Lesenswert?

Ε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 !

von Markus M. (iceagekommt)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von Markus M. (iceagekommt)


Lesenswert?

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?

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

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
von Markus M. (iceagekommt)


Lesenswert?

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?

von mh (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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

von Markus M. (iceagekommt)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

Wenn ich morgen Zeit habe, zeichne ich dir einen schönen Schaltplan mit 
den Pinnummern...

von Markus M. (iceagekommt)


Lesenswert?

das wäre super! dank Dir schon mal in vorraus!

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

Bitte...

von Markus M. (iceagekommt)


Lesenswert?

Danke vielmals! Teile sind geordert sobald ichs probiert hab erstatte 
ich Bericht!

von und? (Gast)


Lesenswert?

Und? Hat es funktioniert?

von Joe F. (easylife)


Lesenswert?

ä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
Noch kein Account? Hier anmelden.