Hallo,
Na het succesvol bouwen van een 2 x 18W versterker (TDA2030), had ik nu graag wat digitale besturing/monitors ervoor gebouwt.

Wat ik graag zou hebben is een dubbele VU-meter (L/R); weergegeven op een 2 x 16 char LCD display.
Hiervoor heb ik een zetje nodig, qua soft & hardware.
Indien mogelijk zou het chic zijn moest het een audio-spectrum kunnen weergeven (16 char = 16 kanalen)

Indien het ook mogelijk is zou ik graag het volume digitaal willen kunnen instellen ipv een potentiometer.
Hoe?

Leuk zou ook zijn moest het display geleverd vermogen kunnen weergeven.

Wat ik ter beschikking heb: een ATMEGA88 & een grafisch display.

Wie helpt me op weg??

Digitale pot meter, deze hun resolutie is niet echt hoog. Maar mij lijkt het nu niet echt belangrijk om je volume in 1000-en stappen te regelen.

Eerst praat je over een 2*16lcd en dan een glcd... Zelf al iets opgezocht voor het aansturen van glcd? waarschijnlijk niet want dan zou je weten dat je mega88 vrij krap is. qua flash & qua pinnen.

Voor draadloos volume regeling heeft Velleman een leuk mini bouwpakketje , IR elektronic volume control.

Voor een spectrum analyzer moet je in software een FFT algoritme programmeren, een erg wiskundige, en mogelijk computationeel te zware opgave voor een simpele AVR. Andere mogelijkheid is 16 analoge filtertjes en piekdetectortjes bouwen (google op vocoder) en hun uitgangen meten met de DAC.

[edit]hmm ik zie dat hij een multiplier onboard heeft, dan is het mss toch niet zo'n onmogelijke opgave.

[Bericht gewijzigd door Zom-B op (17%)]

Voor de duidelijkheid (ik mix ze wat door elkaar), het is een simpel 4 euro kostend 2 x 16 char display.

Ik heb amper 6 DAC-kanalen ter beschikking, wat het dus moeilijk maakt om er 16 te monitorren.
't zal dus wel degelijk met zo'n algoritme moeten gebeuren, maar daar ik nog geen digitale signaalverwerking gehad heb zal ik dit nog niet voor elkaar krijgen. Liefst een code dus.
Kan je ev wat uitleg geven HOE een µC het voor elkaar kan krijgen om signalen te filteren?

Digitale pot-meter, uitstekend idee! Ik ga eens zoeken achter een sample.

Wat wil je op het display ? een vertikaal balkje per kanaal ? Het is een karakter display dus dat wordt lastig.

Waarom niet ipv FFT je LCD gebruiken om een simpele sinus weer te geven? Dat is veeeel makkelijker ;) Dan hoef je namelijk niet die zware berekeningen uit te voeren en alleen een paar custom characters aan te maken voor je LCD.
Om de sinus een beetje goed weer te geven til je met een opamp je 0-volt op naar 2.5volt en alles wat boven de 2.5V ligt teken je op lijn 1 en onder de 2.5V teken je op lijn 2.

@Scheef_schaap: als je een aantal filters bouwt, en achter elk filter een (actieve) gelijkrichter plaatst, hoeft de AVR geen ingewikkelde berekeningen meer te maken - daar dienen de filters voor.
Het nadeel dat je geen 16 ADC-ingangen te beschikking hebt, kan omzeild worden door een analoge multiplexer te gebruiken. De 4067 is daarvoor prima geschikt. Die heeft 4 stuurlijnen, waarmee je een keuze maakt uit 16 ingangen (in werkelijkheid 16 I/O pinnen, want het ding is bidirectioneel).

Op 7 september 2008 19:27:33 schreef Sponcebert:
Wat wil je op het display ? een vertikaal balkje per kanaal ? Het is een karakter display dus dat wordt lastig.

Klopt, het zijn 2 regels, en 1 regel bevat 8 lijnen. Dus in totaal een schaal van 16 / kanaal.

Dit bv:
http://www.youtube.com/watch?v=Ecq9a97DcmI

Met schema:
http://diy.elektroda.eu/analizator.php

't is hier al allemaal gemaakt, board, schema, software, heerlijk :D
Enkel werken ze met een ATMEGA48; en ik vraag me af of ik simpelweg in de code $regfile = "m48def.dat" mag veranderen door $regfile = "m88def.dat" ?

Ben even aan het experimenteren geweest, maar ik slaag er maar niet in :/
Bedoeling is dat ik 2 rijtjes (L & R) constant zie bewegen (om de seconde een lijntje bij).

Wat hij nu doet is hij heeft een juist scherm weer,
met waarde
R = 53
L = 20, maar het beweegt niet. Volgens mij returned mijn sub niet ofzo..


Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Declare Sub Writelcd

Dim R As Byte
Dim L As Byte
Dim Lx As Byte
Dim Rx As Byte

Deflcdchar 0 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)
Deflcdchar 1 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)
Deflcdchar 2 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)
Deflcdchar 1 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)
Deflcdchar 2 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24        ' replace ? with number (0-7)
Deflcdchar 3 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28        ' replace ? with number (0-7)
Deflcdchar 4 , 30 , 30 , 30 , 30 , 30 , 30 , 30 , 30        ' replace ? with number (0-7)
Deflcdchar 5 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31        ' replace ? with number (0-7)
Cls
Cursor Off





R = 53
L = 20
Call Writelcd
Do

Call Writelcd

Incr R
Incr L
  If R = 70 Then
  R = 0
  End If
  If L = 70 Then
  L = 0
  End If
Waitms 1000

Loop









Sub Writelcd
Cls
Rx = R                                                      'backup
Lx = L                                                      'backup

Lcd "R:"
Do
   If R > 5 Then
      Lcd Chr(5)
      R = R - 5
   End If
Loop Until R < 5

Select Case R
   Case 4:
      Lcd Chr(4)
   Case 3:
      Lcd Chr(3)
   Case 2:
      Lcd Chr(2)
   Case 1:
      Lcd Chr(1)
   Case 0:

End Select

Lowerline

Lcd "L:"
Do
   If L > 5 Then
      Lcd Chr(5)
      L = L - 5
   End If
Loop Until L < 5

Select Case L
   Case 4:
      Lcd Chr(4)
   Case 3:
      Lcd Chr(3)
   Case 2:
      Lcd Chr(2)
   Case 1:
      Lcd Chr(1)
   Case 0:
End Select
R = Rx
L = Lx


End Sub

[Bericht gewijzigd door Henry S. op (63%)]

Responstijden LCD's zijn meestal lang (100-200msec) en reageren VU meters niet lekker, beter kun je dan een OLED/PLED display toepassen.

LCD's reageren idd. niet geweldig snel, maar nog altijd sneller dan het (mijn) oog kan volgen. Zo kan je een karakter "grijs" maken, door het zo snel mogelijk te laten wisselen tussen "space" en "karakter".
Dat moet volstaan voor de toepassing die de TS voor ogen heeft, denk ik.

Heb zelf ook een keer een testje gedaan (23-07-08) met audio en een PIC. Heb daar ook nog een filmpje van, zal hem zo wel even uploaden. maar mijn bevinding is dat met een gewoon LCD het niet echt lekker gaat, veel "ghost" karakters.. een PLED gaat veel beter.
Heb een filmpje met een gewoon LCD.

//EDIT: Duurde even, maar : http://www.youtube.com/watch?v=fRjDgnrwcTY
Dit is trouwens geen VU. lijn 1 is bovenste helft van de sinus en lijn 2 in de onderstehelft. Dit alles is gesampled op ongeveer 100Hz.

[Bericht gewijzigd door BernardV op (26%)]

Jep! Dit is wat ik wil hebben :D
(of toch om mee te beginnen)

't lijkt me wel dat je LCD'tje niet echt actueel is, de peak komt precies na de beat, mss hogere kloksnelheid ofzo?

Ik programmeer in BASCOM; wat me lukt is om één schermpje te schrijven dus bv


R:#####|
L:#######|

maar vanaf dat ik er een andere waarde in wil steken gebeurt er niets.
Het schrijven van de waarde naar het LCD scherm gebeurt in een subroutine, en het lijkt alsof de µC na de subroutine niet meer terug keert naar z'n retour adres. Heb ik de foute subroutine gebruikt of wat moet er veranderen?

@ BernardV kan je eventueel eens je code uploaden?

begin eens met hier en daar i/o pinnen te flippen

Portd=Portd XOR 1
...
Portd=Portd XOR 2
...
etc

op verschillende punten in het programma, om te zien of de uitvoer daar iedere seconde komt (meet de pennen met multimeter)

Klopt dat het lijkt dat het na de beat komt, dat is volgens mij een nare eigenschap van Youttube bij het encoden. Live zie je dat niet.
De code zal ik vanavond wel even plaatsen hier.. (ben nu niet thuis).
Is echt maar een paar regels.

Niet te moeilijk denken allemaal er zit gewoon een simpele fout in je code, in je subroutine idd deze loopt vast in en infinite loop door de volgende code:

Do
   If L > 5 Then
      Lcd Chr(5)
      L = L - 5
   End If
Loop Until L < 5

L = 20, dus na 3 iteraties is L gelijk aan 5, hij voldoet niet meer aan de IF (hiervoor moet deze immers groter dan 5 zijn) maar ook niet aan de escape, UNTIL (hiervoor moet hij kleinder dan 5 zijn)

Oplossing:

If L >= 5 Then

zelfde fout zit in de loop voor het rechterkanaal alleen gaat deze wel goed omdat de startwaarde (in dit geval) niet deelbaar is door 5.

edit:

Nog wat opmerkingen over de code,

Je kunt in dit geval veel beter een for-lus gebruiken dan ben je van de if-statement af; een do-while constructie gebruik je eigenlijk alleen als de loop ALTIJD minimaal 1x doorlopen moet worden wat hier absoluut niet het geval is. Ook ben je gelijk van je backup waarden af.

Het select statement kun je vervangen door 1 simpele regel door gebruiken te maken van de modulus (restwaarde van deling)

Meer edit:
volgens mij kun je je hele subroutine vervangen door de volgende code:

Sub Writelcd
Cls

FOR Rx = 5 TO R STEP 5 
   Lcd Chr(5) 
NEXT Rx

Lcd Chr(R MOD 5)

Lowerline

FOR Lx = 5 TO R STEP 5 
   Lcd Chr(5) 
NEXT Lx

Lcd Chr(L MOD 5)

End Sub

Ik programeer zelf nooit in basic dus het zou kunnen dat er een syntax fout in zit, maar deze code is iig een stuk overzichtelijker.

http://elm-chan.org/works/akilcd/report_e.html

leuk linkje waar de FFT module te downloaden. Deze is geoptimaliseert voor de AVR MEGA reeks.

Dank aan Scorpie! De subroutine werkt perfect nu
(en ik hoop met het zo gedaan te hebben een minimale berekeningstijd gebruikt te hebben qua snelheid)

Nu nog de ADC inlezen; omzetten naar een schaal van 70 en vervolgens deze waarde in L & R steken.

Even een sestje gedaan ook; om de 20ms een waarde doorsturen in toch wel het minimum. Aan 10ms werkt de bovenste lijn nog perfect; de onderste lijn knippert maar wat raar.

Sample rate zal ik dus wat moeten verlagen dmv een delay.

Q: Hoe moet ik de ADC instellen? M.a.w. met AVCC & AREF
EDIT: Gelukt :D

Q: Voor de inkoppeling van het geluid; kan ik hiervoor een simpele AM-detector gebruiken? Dat is dus een diode en een condensator én een weerstand. Zoja; wat zou ik moeten nemen als RC-tijd?

[Bericht gewijzigd door Scheef_schaap op (15%)]

Als je met AM detector dit bedoeld
http://members.bellatlantic.net/~vze2n9fe/meteor/peak1.gif
dan Ja.

Voor de RC tijd is het erg persoonsgebonden (de een houd van lekker vlot en flikkerend terwijl de andere liever de pieken langzaam ziet dalen), als lower bound zal ik dan iets nemen als r*c=0.01 en verhoog R om trager te laten gaan.

Jap, indeed dit werkte :D

Werkte .. Het is nu al het 2e LCD display dat ik van Dick Best gekocht heb dat het spontaan begeeft.. Door daar gewoon aan te liggen. Altijd zelfde symptomen, na reset µC werkt het perfect, dan na enige tijd begint het allemaal rare tekens te geven,maar na reset werkt het opnieuw terug, na nog enige tijd 2 volle rijen blokjes, dan blokjes met gaatjes in... Nu als ik spanning steek op de displays wordt er een IC gloeiend heet & heb ik 2 rijen van die mislukte blokjes..

Raar.. Doe ik iets verkeerd? Ik denk het niet want de display's heb ik al weken gebruikt..
Misschien kunnen ze er niet tegen van lang aan te liggen.
Kan het zijn dat ik het contrast té hard instel? 'k gebruik geen POT meter, maar een weerstandje.

http://users.skynet.be/fa296995/DSC00402.JPG

[Bericht gewijzigd door Sine op (1%)]

Ik heb geen idee wat er met je display is, als je ons geen schema verstrekt.

Ik kan je nu hooguit mijn schema geven ter vergelijking:
http://www.uploadarchief.net/files/download/hd44780-aansluitingen.png

[Bericht gewijzigd door Zom-B op (30%)]

Ik gebruik hetzelfde schema; enkel hangen DB0 - DB3 te zweven ipv aan massa. Is dit de oorzaak ev?

Geen idee, maar het zou zo eens kunnen.

ik heb ook een lcd van dick best en mijn beeld werd vaag. ik kwam er achter dat als ik het beeld aandrukte en opnieuw de schakeling aanzette het beeld weer goed was. dus heb ik met ijzerdraad het beeld beter vast gemaakt.

edit: ik heb d0 tot d3 ook zwevend. geen problemen.

[Bericht gewijzigd door robojan op (11%)]

Ik denk dat ik het probleem gevonden heb; m'n 7805 geeft geen 5V, maar 6V af. Volgens mij is deze defect ..

Vandaag is er alweer eentje gesneuveld ... :/