Įvadas
Pagrindinis stereo garso lygio indikatoriaus elementas yra „Atmel“ firmos AVR mikrovaldiklis „Atmega16“. Papildomai prietaiso pagaminimui reikės 16 šviesos diodų, 17–16 MHz kvarcinio rezonatoriaus, keleto kondensatorių bei mažos galios varžų (1 pav.). Schemos veikimas yra toks: stereo garsas paduodamas į mikrovaldiklio ASK (analoginį skaitmeninį keitiklį) per K. (kairysis kanalas) ir D. (dešinysis kanalas) įėjimus. Prieš tai nufiltruojamos aukštesnės dedamosios RC žemų dažnių filtru (10K ir 1 uF). Mikrovaldiklio ASK gali maksimaliai 15 kHz dažniu diskretizuoti įėjimo signalą vienam kanalui (pvz.: 40 mikrovaldiklio išvadas).
Pagal Naikvisto teoremą, maksimalus paduodamas signalas, kurį dar galima atkurti po konvertavimo yra 7,5 kHz (sinusinio signalo atveju). Mūsų atveju naudojami du kanalai (1 pav.), taigi 7,5 kHz dalinasi iš 2 ir lieka 3,75 kHz vienam kanalui. Kadangi mums reikalingi signalo dažniai nesiekia kiloherco, tai mikrovaldiklio resursų pakankamai užtenka stereo garso signalų matavimui (mikrovaldiklio apkrovimas ~10 %). ASK konvertuodamas analoginio signalo reikšmes, įrašo į ADCL ir ADCH registrus 10 bitų tikslumu. Kadangi toks tikslumas šiuo atveju nereikalingas, todėl panaudojami tik 8 bitai, nuskaitant ADCH registrą, prieš tai nustačius ADMUX registre nuskaitymo iš ADC būdą. Panaudojant tuos 8 bitų duomenis, paprasčiausiu skaičių palyginimu galima įjungti ir išjungti šviesos diodus. Prie to pačio, panaudojus mikrovaldiklio įėjimo kanalų multiplekserį, galima fiksuoti keletą skirtingų dažnio juostų. Mūsų atveju panaudoti du kanalai iš aštuonių (kanalus galima labai lengvai perjunginėti keičiant ADMUX registro parametrus).
Šviesos diodų perjunginėjimas
Pagal ASK pateiktas skaitines signalų reikšmes, galima spręsti kokio lygio įėjimo signalas ir atitinkamai įjungti prie PORTB ir PORTD prijungtus šviesos diodus. 2 paveiksle parodytas diodų junginėjimo galimas suskirstymas. Kai turime didėjantį įėjimo signalą (juoda kreivė atitinka vieno iš kanalų augančią įtampą trumpu laiko momentu), dėl programoje numatytų lyginimo reikšmių (1, 2, 4 ... 256) įjungiamas didesnis šviesos diodų skaičius. Įtampos lygiui krintant, vykdomas atvirkščias procesas, šviesos diodai išjunginėjami. Taip gauname įtampa valdomą šviesos diodų stulpelį.
2 pav. Šviesos diodų įjungimo pavyzdys
Kadangi garsiniai signalai laike kinta, tai pateiktos schemos šviesos diodai atitinkamai į tai reaguoja. Dėl schemoje panaudotų žemų dažnių filtrų, šviesos diodai daugumoje reaguoja tik į žemus dažnius, keičiant filtrų kondensatorių talpas bei varžas galima keisti signalų dažnių sritį, kurio lygį norima matuoti. Lygio indikatoriaus programos kodo pavyzdys, rašytas IAR'u, pateiktas žemiau. Pradžioje atliekamas ASK parametrų nustatymas ADMUX ir ADCSRA registruose. Bei įjungiamos globalios pertrauktys _SEI(). Toliau programa įjunginėja diodus, priklausomai nuo ADCH registro skaitinės vertės. Programoje lyginimo duomenys nuo (2 pav.) skiriasi dėl to, kad kompiuterio garso kortos, kurią naudojau signalo padavimui, nepakako maksimaliai reikšmei išgauti (vidinis ASK stiprintuvas šiuo atveju nenaudojamas). Vienas iš galimų variantų jautrumui padidinti tai paprasčiausiai pakeisti if.. then sąlygose naudojamas lyginimo reikšmes.
Laiko vėlinimas prie kiekvienos sąlygos yra tam, kad kurį laiką būtų užlaikytas diodo švietimas, taip pašalinamas kartais atsirandantis silpnas diodo šviesos srautas. Kuo didesnė reikšmė ADCH reikšmė, tuo ilgiau reik palaikyt šviesos diodą įjungtą, taip suvienodinamas viso diodų stulpelio apšvietimas. Visa tai tenka daryti dėl to, kad kuo žemesnė diodo eilė, tuo ilgiau jis šviečia, o greitai kintantis sritis yra būtent aukštos eilės diodų (1 pav. pažymėjimai 1..8). Vėlinimo laikas buvo parinktas empiriškai, geriausias vėlinimo reikšmes galite pasirinkti patys keisdami programos kodą.
#include <iom16.h>
#include "ina90.h"
// Laiko vėlinimo funkcijos aprašymas
void Laikas2(unsigned int m);
// Globalus kintamasis stereo kanalų išskyrimui
char i=0;
void main()
{
//PORTB ir PORD nustatymas kaip išėjimo prievadai
DDRB=255; DDRD=255;
//ADMUX registras skirtas ASK valdymui
//REFSx – nustato etaloninį maitinimo šaltinį, skirtą ASK
//MUXx – viduje esančio multiplekserio nustatymui
// MUX1->1 ir MUX0->1 nustato kaip įėjimą 37 išvadą
//ADLAR - nustato nuskaitymo iš duomenų registro ADC būdą
ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|
(1<<MUX1)|(1<<MUX0);
//ADCSRA – ASK valdymo, įjungimo, išjungimo registras
//ADEN ->1- įjungiame ASK, ADSC->1
//pradėti vienkartinį konvertavimą
//ADFR->1 Laisvo konvertavimo režimas,
//ADIE – konvertavimo pertraukties įjungimas
//ADPS – skirtas ASK veikimo spartai keisti
//pagal kvarcinį rezonatorių
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADIE)|
(1<<ADFR)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
_SEI(); // Globalių pertraukčių įjungimas
while(1)
{} // Amžinas ciklas
}
// ASK pertraukties paprogramė
#pragma vector=ADC_vect
__interrupt void Analog()
{
char a; // Tarpinio kintamojo išskyrimas
a=ADCH;// nuskaitom
if (i==0){// Kairio kanalo diodų įjungimo tvarka
//Lyginam ASK reikšmes su mūsų pačių
//nustatymo diodų perjungimo reikšmių
if (a>5) PORTB=1;
if (a>10)PORTB=3;
if (a>15) {PORTB=7;Laikas2(50);}
if (a>20){PORTB=15;Laikas2(100);}
if (a>26) {PORTB=31; Laikas2(200);}
if (a>33) {PORTB=63; Laikas2(300);}
if (a>39){PORTB=127;Laikas2(400);}
if (a>44){PORTB=255;Laikas2(500);}
//Sudarom sąlygas dešinio kanalo diodų įjungimui
i=1;
// Perjungiam multiplekserį prie 40 išvado kitam kanalui
ADMUX=(1<<REFS1)|(1<<REFS0)|
(1<<ADLAR)|(0<<MUX1)|(0<<MUX0);
// Dešinio kanalo diodų įjungimo tvarka
}else{
//Lyginam ASK reikšmes su mūsų pačių nustatymo
//diodų perjungimo reikšmių
if (a>5) PORTD=1;
if (a>=10)PORTD=3;
if (a>15) {PORTD=7;Laikas2(50);}
if (a>20){PORTD=15;Laikas2(100);}
if (a>26) {PORTD=31; Laikas2(200);}
if (a>33) {PORTD=63; Laikas2(300);}
if (a>39){PORTD=127;Laikas2(400);}
if (a>44){PORTD=255;Laikas2(500);}
//Sudarom sąlygas kairio kanalo diodų įjungimui
i=0;
// Perjungiam multiplekserį prie 37 išvado kitam kanalui
ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|
(0<<MUX4)|(1<<MUX1)|(1<<MUX0);
}
}
// Laiko vėlinimo paprogramė
void Laikas2(unsigned int m)
{
unsigned int i=0, k=0;
for (i=0; i<m; i++)
{
for (k=0; k<150; k++){}
}
}
Sukompiliuotą programą „Atmega16“ mikrovaldikliui galite parsisiųsti čia: lygio_indikatorius.hex. Į mikrovaldiklį galite įrašyti naudodami „PonyProg“ programėlę su programatoriumi.
Šio lygio indikatoriaus schemai, galima parašyti žymiai sudėtingesnes programas, sudarant keletą galimų diodų junginėjimo variantų, taip pagyvinant savo gamintą garso stiprintuvą. Kadangi mikrovaldiklio apkrovimas tokiai programai labai mažas, galima drąsiai didinti tikrinimo kanalų skaičių (iki 8), skirtingiems dažniams.
Tokiu pačiu principu galima sudaryti schemą turinčią 16 šviesos diodų vienam kanalui, arba keletą kanalų skirtingiems dažniams. Tokiu atveju programos kodas keisis bet principas gali išlikti toks pats.
Papildoma informacija ir testavimo rezultatai
Tokio tipo programa pakankamai neblogai veikia, pradžioje nustačius (2 pav.) reikšmes nepakako įėjimo signalo lygio, kad būtų įjungti visi šviesos diodai. Signalą galima pastiprinti vidiniu diferencialiniu stiprintuvu, bet paprasčiausiai pakeičiau lyginimo reikšmes: if (a>44)... taip sumažindamas lyginimo diapazoną nuo 255 maksimalios iki daugiau nei 44.
Lygio indikatorius nesukalibruotas, todėl jis rodo tik besikeičiančius signalo lygius. Norint, kad jis rodytų tikrąsias signalo dB reikšmes, reiktų signalų generatoriaus bei voltmetro ir sukalibruoti prietaisėlį. Laiko vėlinimo įtraukimas pakeitė diodų švietimo trukme, padidino jų ryškumą nors galima naudoti ir be jo, tada programos kodas dar labiau sutrumpėja. Labai geras stereo kanalų lygio išryškėjimas įrodantis, kad pateikta programėlė veikia nepriekaištingai. Vietoj RESET išvadui naudojamo kondensatoriaus ir varžos geriausia naudoti RESETO valdymui skirtą mikroschemą, taip padidinamas veikimo patikimumas (pvz.: ADM1811 ar analogiški). Kai kuriems pradedantiesiems iškyla problemų su „Atmega“ tipo mikrovaldikliais, dėl jų kvarcinio rezonatoriaus parametrų nustatymo, „Atmega16“ mikrovaldikliui galite nustatyti šiuos parametrus:
3 pav. „PonyProg“ programoje parametrų „Atmega16“ mikrovaldikliui nustatymai
Taip pat rekomenduoju prieš programuojant „Atmega16“ paskaityti šios mikroschemos PDF aprašymą. Jei atsiras norinčių pakartoti bei patobulinti esamą schemą, būtų malonu, kad pasidalintumėte savo rezultatais.