Sterrenhemel

Dit topic is gesloten

Arco

Special Member

Je moet je ook houden aan de 250mA voor het totale ic, en 800mW max....

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik heb de ULN2803 er al inzitten. Werkt prima.

Dan wordt het nog een stukje wiskunde:
De PIC16F18857 heeft een 10-bits PWM. Dus kan ik van 0 - 1023 als Duty Cycle kiezen.

De lichtopbrengst van de LED's zijn echter niet lineair aan de duty_cycle. Ik denk eerder een logoritmische curve.

Ik heb daarom een tabel gemaakt van 0 - 1023 in 23 stappen.

De kunst is dus om die 23 stappen een gelijke verandering te laten zien in de lichtopbrengst.

Ik heb er wat mee geëxperimenteerd. Mijn tabel is nu

pic basic code:

Const MarsTable As Word[24] = (
  0, 1, 2, 3, 4, 5, 6, 7, 8, 16, 32, 96, 160, 224,
  288, 352, 416, 480,  544, 608, 672, 800, 928, 1023
  )

De eerste 8 stappen doe ik +1, daarna steeds meer. Het lijkt er al wel een beetje op, maar is het nog niet helemaal...(of nét niet).

Ik heb wat lopen zoeken, maar ben nog geen tabel tegengekomen. Zouden die er evenwel zijn voor LED's?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De lichtopbrengst van de LED's zijn echter niet lineair aan de duty_cycle.

De leds zijn wel lineair, maar je ogen niet... ;)
Zie: https://hellocircuits.com/2013/04/24/how-to-make-led-brightness-linear… voor waardes...

https://ericjformanteaching.files.wordpress.com/2015/09/led-luminosity-a_en.png?w=736

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Geweldig artikel!
Dit is precies wat ik zocht... :)

Het plaatje gaat uit van een 8-bits PWM (0 - 255). Omdat ik 10 bits-PWM heb, heb ik de tabel maar geëxtrapoleerd naar 0 - 1023.
Zal wellicht niet helemaal juist zijn, maar komt zeker in de buurt.

pic basic code:


MarsTable As Word[32] = (0, 4, 8, 12, 16, 20, 28, 36, 48, 60, 72, 88, 108, 128, 148, 176, 200, 232, 264, 300,
  340, 384, 428, 480, 532, 588, 652, 716, 784, 860, 936, 1020)
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Nou, het programma nadert zijn voltooing..! :)

Alles werkt. Mooie combinatie (én oefeningen): SPI voor de MAX7219's, I2c voor een DS3221 RTC module, dan vier 10-bits PWM voor aansturing van Mars-Ledjes. Plus een IR-afstandbediening met NEC-Data protocol.

De PIC 16F18857 zit lekker ruim in zijn jasje en het oogt naar mijn mening heel netjes:

Wat wil een mens nog meer? ;)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

O ja, ik heb nog een klein issue met MikroBasic:

Ik heb me aangeleerd om regelmatig op de 'Save' knop te drukken (altijd goed natuurlijk :) )

Maar dat is ook ingegeven omdat regelmatig, op onverwachte momenten, de applicatie (MB) spontaan crasht en dit mooie scherm verschijnt:

Wellicht een bug? Of wellicht 'iets' i.c.m. Windows10...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik zit nog even met de (Witte) LED's.

Ze zijn nl te fel. Nu kan je met de Max7219 de lichtsterkte regelen op twee manieren:
- mbv het Intensity Register
- Mbv een externe weerstand de zgn Iset.
Standaard is deze 10k. (is ook gemonteerd op de printjes).

Op de minimale registry waarde (0x01) is de lichtsterkte (PWM 1/32) nog te groot. Daarom had ik de externe weerstand verhoogd naar 68K.

Nog te weinig.

In de datasheet staat wel een minimum waarde (rond 10K) voor de weerstand, maar ik zie geen maximale waarde (wellicht lees ik er over heen).
Zou je deze zonder problemen net zo kunnen verhogen als je wilt?

Punt is wel dat ik dan alle SMD weerstandjes moet vervangen op de printjes, dat wordt er niet echt beter op om in die printjes te knutselen. (bovendien zijn ze al gemonteerd op de panelen).

Wat ook zou kunnen is om bij elke 'rij' naar de MAX7219 een weerstand op te nemen.
Het grappige is dat ik daar best een behoorlijke waarde voor moet nemen om het spul wat te dimmen (meer dan 1k).
De voedingsspanning is 4,6 Volt, Daar valt niet meer te halen met een minimum vereiste 4V voor de Max-en.

Is er wellicht een beter idee?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Nu ik 8 panelen met sterren aan de praat heb, is er nog een vreemd verschijnsel waarneembaar.
Als je je hoofd beweegt terwijl er sterren aan staan, dan zie je heel even een soort 'lichttrein' tussen twee LED's. Een soort echo-effect.

Ik weet niet of dit een stroboscopisch effect is. Maar ik vermoed dat het komt vanwege het gebruik van PWM, aangestuurd door de MAX7219's.

Kent iemand dit verschijnsel en is er wat aan te doen?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Alle 7219's multiplexen op hun eigen oscillator en snelheid, dat kan soms effecten opleveren.
Ik geloof niet dat de 7219 een mogelijkheid heeft om meerdere te synchroniseren.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 22 februari 2021 19:04:26 schreef Arco:
Alle 7219's multiplexen op hun eigen oscillator en snelheid, dat kan soms effecten opleveren.
Ik geloof niet dat de 7219 een mogelijkheid heeft om meerdere te synchroniseren.

Ik kan zo gauw niet ontdekken welke frequentie de MAX7219 gebruikt om te PWM-en...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Nog iets wat me verbaast:

Ik heb gemeten hoeveel stroom de leds in totaal trekken.
Dat gebeurt door een weerstand van 10 Ohm in de voeding aansluiting van de panelen met MAX-en op te nemen en daar de spanningsval over te meten.

Alle 8 panelen samen, met gemiddeld zo'n 250 leds aan vragen op de minimale lichtsterkte (die nog teveel is ook), slechts 20 mA.

(0,195 Volt over de 10 Ohm).

Bij de maximale helderheid, waarbij het licht er bijna uitknalt, is dat 80 mA in totaal.
Dat is toch verduiveld weinig?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

't Zijn vrijlopende oscillatoren die voor multiplexen gebruikt worden dus die lopen nooit gelijk. Dat kan allerlei interferentiestoringen geven...
De totale stroom kun je bij PWM en multiplexing niet direct met een voltmeter meten. Dan zou je een scoop over de weerstand moeten zetten.

[Bericht gewijzigd door Arco op maandag 22 februari 2021 22:48:06 (32%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 22 februari 2021 22:46:28 schreef Arco:
't Zijn vrijlopende oscillatoren die voor multiplexen gebruikt worden dus die lopen nooit gelijk. Dat kan allerlei interferentiestoringen geven...

Een andere oplossing ipv de MAX7219's zou dus ook kunnen. Deze PIC16F18857 heeft 7 PWM's, die je met dezelfde oscillator kan aansturen. Dus die lopen dan synchroon.

Maar ja, hoeveel heb ik er dan wel niet nodig om 8 panelen van 64 LEDS aan te sturen...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

De helderheid van de ledjes is ook gelukt, dwz een mooie lichtsterkte waardoor het meer op 'sterren' lijkt dan op 'lampjes'.

Ik moest daarvoor de Iset Weerstand bij de MAX7219 wel aanpassen naar...1 M Ohm.

Dat vind ik wel héél veel, zeker gezien de standaard van 10K.

Maar ja, het werkt.. :)

Tis alleen te hopen dat ik hiermee niet iets instabiels heb gecreëerd...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

De PIC16F18857 heeft naast CCP1 t/m CCP5 ook een PWM6 en PWM7 aan boord.

(PWM6OUT en PWM7OUT)

Ik kan deze functies aan een poort mappen:

pic basic code:

RC4PPS = 0x0E                                                'Map C.4 To PWM6OUT

en ook

pic basic code:

PWM6CON    = %10000000

kon ik uit de Dataheet halen.

Maar dan houdt het op...

pic basic code:

PWM6_Remappable_START() of PWM6OUT_Remappable_START()

kent MikroBasic niet.

Hoe krijg ik nu de PWM6OUT aan de praat?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Update

Op 24 februari 2021 02:03:50 schreef Arco:
Zul je zelf moeten aansturen, daar is geen support voor: https://forum.mikroe.com/viewtopic.php?f=88&t=75732

Daar ben ik dus mee aan de slag gegaan en dat is op zich gelukt:

pic basic code:

PWM6CON    = %10000000                                       'Enable PWM6, Active High
CCPTMRS1   = %00101010                                       'Timer 4 for CCP5, PWM6, PWM7

Wat ik echter nog even niet snap: de duty Cycle kan worden ingesteld voor de CCP en PWM module met:

pic basic code:



 'CCP1:
 CCPR1H   =  %00000001          'Higher Bits 
 CCPR1L   =  %11000000          'Lower  Bits
 
 'PWM6:
 PWM6DCH   = %00000001          'Higher Bits 
 PWM6DCL   = %11000000          'Lower Bits

Echter beide geven niet hetzelfde resultaat. Te meten op de de scope.

Om beide exact dezelfde duty-cycle te geven, moet ik de PWM6 met 64 vermenigvuldigen. Dat zijn 6 bits opschuiven.

Maar waar kan dat vandaan komen? Wellicht het feit dat de eerste 6 Lower bits niet meedoen, vanwege de 10-bits resolutie?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Na flink wat te hebben lopen grasduinen in de datasheet van de PIC16F18857, denk ik waar ik het moet zoeken:

De PulsWidth wordt bepaald door het register CCP1R. Deze heeft een hoog-en laag deel.
Maar omdat er maar 10 bits worden gebruikt, kan je de 'PWM alignment' instellen.

Dus ófwel de 2 LSB-bits van het hoog-gedeelte, aangevuld met het volledige 'Laag' gedeelte, óf het volledige hoog-gedeelte aangevuld met de 2 MSB bits van het lower-deel.

Deze PWM alignment wordt geregeld in het CCPxCON register: Bit 4.

En daar móet het zitten: De PWM6 heeft een andere instelling dan de CCP1.
Dat scheelt precies de 6 bits die ik ervaar...

Maar nou is het vreemde, dat wanneer ik bit 4 van CCP1CON wijzig, er geen enkele verandering optreedt in de pulsbreedte! En dat zou wel moeten.

Nu vermoed ik echter, dat de routine van MikroBasic roet in het eten gooit en de instelling weer verandert door

pic basic code:

PWM1_Remappable_START()

Klopt mijn redenatie en zou dat kunnen?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik ben nog aan het puzzelen over de Maan in de sterrenhemel. Het programma heeft hiervoor een functie. Alles werkt, eerste kwartier, laatste kwartier, Volle en Nieuwe maan. Met PWM ook nog...Het komt langzaam op.

Maar... nu moet ik de maan nog wel máken. :>
Eigenlijk is het geen electronica/ programmeer aangelegenheid, maar probeer het hier toch maar even...

Ik dacht een maan te maken ter grootte van ca 4 Cm diameter.
Maar het is nog best wel lastig om een cirkel te maken die gevuld is met ledjes (waarbij dan steeds de helft wordt aangestuurd vanuit het programma).
Ik ben aan het knutselen geweest met karton, papier. schaar, lijm, passer, etc om een malletje te maken om uiteindelijk de LED's in het paneel te boren. Maar krijg nog niet echt een mooi resultaat.

Heeft iemand wellicht ook zoiets gehad? Of een andere oplossing? Om een dergelijk rondje te krijgen met LED's? Ik heb nog even gezocht op hele grote leds, maar kan daar niets van vinden.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb een Maan gemaakt, die er een beetje op lijkt.
Het kost wel 24 LEd's per 'helft'.

Ik kan ze aansturen vanuit de ULN2803, die kan zo te zien max 500 mA aan per output.

Ik lees ook wel eens dat mensen een POWER FET (Zoals de STP36NF06L) gebruiken om LED's aan te sturen.

Maar wat is daar eigenlijk de lol van? Je zou toch in principe iedere willekeurige tor kunnen gebruiken die een beetje stroom aan kan (bv BD-reeks)?
Waarom dan een MOS Power FET?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

In een transistor gaat veel meer vermogen verloren, dat scheelt vooral bij hoge vermogens aanzienlijk.
Bij 10A gaat er bij een Vcesat van 300mV zo'n 3W verloren in de tor als warmte, bij een goeie mosfet (~1mΩ) is dat maar 10mV (0.1W)...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ah, Ok..

Maar dat speelt dus vooral bij redelijk veel vermogen begrijp ik.

Ik heb de stroom gemeten door de ledjes: bij 6 mA geven ze al redelijk licht.
Als ik dan 24 * 6 mA = 144 mA trek dan zit ik nog ruim in de marge.

En dat is dan als ze continu branden. Ik ga PWM gebruiken om de helften aan te sturen, dan zal het nog minder zijn.

(Ik heb - eigenlijk hoort het niet, maar ja - de ledjes gewoon aan elkaar geknoopt als ware het één LED....Scheelt weer 48 weerstanden.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je krijgt dan wel het 'kerstboom effect'... ;)
(als er 1 ledje doorbrandt krijgt de rest meer stroom, waardoor die eerder doorbranden en nog meer stroom krijgen, en uiteindelijk alles doorbrandt...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 27 februari 2021 14:55:15 schreef Arco:
Je krijgt dan wel het 'kerstboom effect'... ;)
(als er 1 ledje doorbrandt krijgt de rest meer stroom, waardoor die eerder doorbranden en nog meer stroom krijgen, en uiteindelijk alles doorbrandt...)

Op zich is dat juist, ik was me er wel van bewust (Vandaar 'het hoort eigenlijk niet' :) ).
Daarentegen is de stroom dusdanig beperkt (in de orde van ca 6-8 mA per Led), dat de andere LEDS een eventueel sneuvelen van een ledje op zouden moeten kunnen vangen. Daar komt ook nog bij dat de LED's niet continu branden. Ik gebruik hiervoor PWM6OUT en PWM7OUT van de PIC16F18857 (Ik vond het al geweldig dat ik dat aan de praat heb gekregen met PPS mapping, etc ;) ).
Alleen bij volle maan branden ze allemaal even. Bij nieuwe maan kunnen ze even uitrusten... :)

Wat ik altijd nog kan doen, (kost wel tijd en ik wil nog zoveel..) is een printje maken met een eigen processortje en MAX7219, alleen voor de Maan. Dan kan ik nog meer doen, zoals de maan kantelen, wassende maan, etc.
Zo'n printje kan ik dan op het paneel zetten waar de Maan zich bevindt...

Maar eerst maar eens sterrenhemel 1.0...

Het is best een heel leuk project geworden; ik heb al een paar keer een demo gegeven, wat leidde tot wat kreetjes van de toeschouwers... :) :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Wat ik me even afvroeg:

In de PIC16F18857 kan je met het CCP1CON register de PWM1 instellen.

Ik deed dat door

pic basic code:

 CCP1CON    = %10000000                                       'Enable CCP1, 

.

Maar bij het nogmaals lezen van de datasheet ziet ik dat bits 3:0 eigenlijk 1111 zouden moeten zijn voor de PWM Mode:

Ik heb er daarom maar

pic basic code:

 CCP1CON    = %10001111                                       'Enable CCP1, PWM Mode 

van gemaakt.

Wat me eigenlijk een beetje verbaasd, is dat beide statements gewoon goed werken. Beetje vreemd?
Of lees ik de sheet niet goed?

Fouten zijn het bewijs dat je het probeert..

Dit topic is gesloten