Programovateľný generátor obdĺžnikového signálu

Programovateľný generátor obdĺžnikového signálu 
Elektrolab Autor  Elektrolab
  216 zobrazení
1
 0
Vybavenie...
 Fórum

Tento projekt predstavuje jednoduchý digitálny generátor signálu, ktorý dokáže generovať obdĺžnikový signál (square wave) s možnosťou voľby frekvencie v rozsahu od 1 kHz do 68 MHz s presnosťou ±1,1 %. Požadovanú frekvenciu je možné zadávať pomocou numerickej klávesnice, pričom aktuálne nastavená hodnota sa zobrazuje na OLED displeji 128×32 pripojenom cez I2C zbernicu. Toto zapojenie bolo publikované na stránke Technoblogy.

Programovateľný oscilátor LTC6904

LTC6904 [1][2] je zaujímavý programovateľný oscilátor, ktorý umožňuje nastavovať frekvenciu cez zbernicu I²C pomocou dvoch 8-bitových registrov. Tieto registre poskytujú 4-bitovú hodnotu OCT (oktáva) a 10-bitovú hodnotu DAC. Frekvencia generovaného signálu je daná nasledujúcim vzorcom:

f = 2 OCT 2078 (Hz) ( 2 DAC 1024 )

Nie je úplne jasné, prečo výrobca zvolil práve konštantu 2078, no pre požadovanú výstupnú frekvenciu je potrebné správne vypočítať hodnoty OCT a DAC – a práve na to je výhodné použiť ATtiny85, ktorý dokáže výpočty zabezpečiť automaticky.

Datasheet LTC6904

 

 

Princíp fungovania

Používateľ zadáva požadovanú frekvenciu (v Hz) ako sekvenciu maximálne ôsmich číslic na číselnej klávesnici a stlačením tlačidla * odošle vstup. Následne sa na OLED displeji zobrazí najbližšia frekvencia, ktorú je možné generovať, a výstupný pin začne produkovať obdĺžnikový signál. Tlačidlom # je možné aktuálny vstup vymazať.

Zapojenie obvodu

Obvod využíva moju jednovstupovú klávesnicovú logiku (One Input Keypad Interface), ktorá umožňuje čítať stlačenia tlačidiel pomocou jediného analógového vstupu mikrokontroléra ATtiny85. Pre komunikáciu s OLED displejom a programovateľným oscilátorom LTC6904 je použitá dvojvodičová zbernica I2C, čo výrazne šetrí I/O piny. Vďaka tomu zostávajú na čipe ATtiny85 ešte dve voľné I/O linky, ktoré je možné využiť pre ďalšie rozšírenie alebo funkcie.

David Johnson-Davies

Konštrukcia

Plošný spoj je navrhnutý v Eagle. Odkaz na zdrojové súbory Eagle je na konci článku, ak si chcete dosku vyrobiť svojpomocne. PCB je navrhnutá pre cenovo dostupné tlačidlá s priamym vývodom, ktoré je možné zohnať u dodávateľov už od 0,04 € / kus [5], alebo ešte lacnejšie na Banggood [6]. Displej je OLED 128×32 s I²C rozhraním, využívajúci driver SSD1306. Je použitý lacný modul z AliExpressu [7], ktorý je uchytený pomocou obojstrannej samolepiacej penovej pásky. PCB je však kompatibilná aj s verziou od Adafruit [9]. Aby bola doska čo najkompaktnejšia, ostatné súčiastky sú umiestnené ako SMD súčiastky na zadnej strane plošného spoja.

David Johnson-Davies

Zadná strana a pohľad na PCB signálneho generátora

Program

Program pozostáva z troch hlavných častí: spracovanie klávesnice, komunikácia s displejom a rozhranie k programovateľnému oscilátoru.

Rozhranie klávesnice

Rozhranie je založené na predchádzajúcom projekte "One Input Keypad Interface", ktorý využíva starostlivo zvolené rezistory. Tie zabezpečujú, že každé tlačidlo na klávesnici vytvára špecifické napätie na analógovom vstupe, čo umožňuje rozpoznanie stlačeného tlačidla pomocou jediného pinu mikrokontroléra.

Rozhranie displeja

Komunikácia s displejom využíva rovnaké rutiny ako projekt Tiny Function Generator, ktorý používal identický OLED displej s I2C rozhraním. Frekvencia sa zobrazuje veľkými znakmi (double-sized) – na jeden riadok sa zmestí maximálne 10 znakov, čo presne postačuje pre 8-cifernú frekvenciu a príponu „Hz“.

Rozhranie k programovateľnému oscilátoru

Po zadaní cieľovej frekvencie sa zavolá funkcia CalculateParameters(), ktorá vypočíta hodnoty DAC a OCT, ktoré treba odoslať do čipu LTC6904, aby sa generovala najbližšia možná frekvencia.

int CalculateParameters (long target) {
  if (target < 1039) target = 1039;
  int oct = 0;
  while (target >= ((long)2078 * 1<<oct) && oct < 15) oct++;
  long factor = (long)1<<oct;
  long val = (target + factor/2) / factor;
  int frac = (Mult + val/2) / val;
  int dac = 2048 - frac;
  return oct<<10 | dac;
}

Výpočet parametrov a spätné overenie frekvencie

Funkcia CalculateParameters() implementuje výpočtový vzorec z datasheetu čipu LTC6904. Aby sa zabránilo pretečeniu pri výpočtoch, používajú sa vhodné úpravy s cieľom udržať medzičísla v rozsahu 32-bitových celých čísel (long).

Výsledkom výpočtu je 16-bitové číslo, v ktorom sú zabalené potrebné parametre:

  • 4-bitová hodnota OCT sa nachádza v bitoch 10 až 13.
  • 10-bitová hodnota DAC sa nachádza v bitoch 0 až 9.

Následne funkcia GetFrequency() prepočíta reálnu frekvenciu, ktorú čip vygeneruje na základe týchto parametrov, a zobrazí ju na displeji.

long GetFrequency (int parameters) {
  int dac = parameters & 0x3FF;
  int oct = parameters>>10 & 0x0F;
  long factor = (long)1<<oct;
  int frac = 2048 - dac;
  return ((Mult + frac/2)/ frac) * factor;
}

Presnosť generovanej frekvencie a prenos parametrov

Pri nízkych frekvenciách v oblasti niekoľkých kHz sa zvyčajne podarí vygenerovať frekvenciu, ktorá presne zodpovedá požadovanej hodnote. No vzhľadom na to, že programovateľný oscilátor LTC6904 dosahuje presnosť iba ±1,1 % v celom rozsahu, pri vyšších frekvenciách v MHz oblasti sa môže objaviť odchýlka v rádoch niekoľkých kHz.

Napríklad, ak zadáte 32 000 000 Hz (32 MHz), čip v skutočnosti vygeneruje 31 981 568 Hz, čo predstavuje chybu iba 0,06 %, teda vysoko prijateľnú hodnotu pre väčšinu praktických aplikácií. Na záver sa vypočítané parametre OCT a DAC odošlú do oscilátora prostredníctvom I2C zbernice pomocou funkcie SendFrequency().

void SendFrequency (int parameters) {
  int cnf = 2; // Only CLK output enabled.
  int data = parameters<<2 | cnf;
  Wire.beginTransmission(OscAddress);
  Wire.write(data>>8 & 0xFF);
  Wire.write(data & 0xFF);
  Wire.endTransmission();
}

Vypnutie výstupu a hlavná slučka programu

Ďalšia pomocná rutina s názvom SendSilence() sa používa na deaktiváciu výstupu oscilátora počas zadávania novej frekvencie. To zabraňuje generovaniu nechcených impulzov, kým používateľ ešte len vyberá požadovanú hodnotu.

Hlavná rutina

Hlavná časť programu sa nachádza vo funkcii loop(), ktorá neustále čaká na stlačenie tlačidiel na klávesnici. Na základe aktuálneho režimu potom:

  • buď umožňuje zadávať frekvenciu ako postupnosť číslic,
  • alebo, ak je frekvencia potvrdená, aktivuje generovanie výstupného signálu.

Riadenie prebieha jednoducho a intuitívne – používateľ zadá požadovanú frekvenciu, stlačí * na potvrdenie, a čip začne generovať čo najpresnejší výstupný signál. Stlačením # sa vstup vynuluje a proces môže začať znova.

void loop() {
  int key, parameters;
  // Wait for key
  do { key = ReadKeypad(); } while (key == -1);
  
  if (key <= 9 && Input < 9999999) {
    if (Mode) {
      PlotChar(Space, 0, 8*Scale);
      PlotChar(Space, 0, 9*Scale);
      Input = 0;
      Mode = 0;
      SendSilence();
    }
    Input = Input*10 + key;
  } else if (key == Hash) {
    PlotChar(Space, 0, 8*Scale);
    PlotChar(Space, 0, 9*Scale);
    Input = 0;
    Mode = 0;
    SendSilence();
  } else if (key == Star) {
    Mode = 1;
    parameters = CalculateParameters(Input);
    Input = GetFrequency(parameters);
    PlotHz(0, 8*Scale);
    SendFrequency(parameters);
  }
  
  PlotFreq(Input,0,0);
  // Wait for key up
  do { key = ReadKeypad(); } while (key != -1);
}

Kompilácia programu

Program bol skompilovaný pomocou ATTiny Core od Spencea Kondeho [9]. V menu Board zvoľte možnosť ATtiny25/45/85 v sekcii ATtinyCore. Potom nastavte nasledovné parametre:

  • Timer 1 Clock: CPU
  • B.O.D.: Disabled
  • Mikrokontrolér: ATtiny85
  • Frekvencia: 1 MHz (interný oscilátor)

Na pripojenie k čipu ATtiny85 som použil špeciálny klip, ktorý sa nasadzuje zhora na puzdro čipu [10], a programátor Sparkfun Tiny AVR Programmer [11]. Ak je to potrebné, najprv zvoľte možnosť Burn Bootloader na nastavenie poistiek (fuse bits). Následne kliknite na Upload na nahratie programu do mikrokontroléra.

Ďalšie návrhy na vylepšenie

Aj keď má tento programovateľný generátor signálu pôsobivý rozsah 16 oktáv, v niektorých aplikáciách by bolo užitočné rozšíriť spodnú hranicu generovaných frekvencií pod aktuálne minimum 1039 Hz. Jednou z možností by bolo využiť jeden z časovačov (Timer/Counter) mikrokontroléra ATtiny85 ako frekvenčný delič. Ten by mohol:

  • prijať výstup z oscilátora cez jeden z voľných I/O pinov
  • vydeliť ho podľa potreby (napr. 2×, 4×…)
  • a výstup vrátiť na druhom voľnom pine

Takéto riešenie by umožnilo generovať frekvencie výrazne nižšie než natívny rozsah čipu LTC6904, bez nutnosti meniť samotný oscilátor.

Zdroje

Tu si môžete stiahnuť program pre Generátorr signálu Program (.txt)

Schémy a návrh PCB vo formáte Eagle PCB (Eagle)

  1. LTC6903/LTC6904 1kHz to 68MHz Serial Port Programmable Oscillator na Linear Technology.
  2. LTC6904 Timer, Oscillator & Pulse Generator na Farnell.
  3. Linear Technology LTC6904 Voltage Controlled Oscillator na RS-Online.
  4. 4x4 Keypad MCU Accessory Board na AliExpresse.
  5. FSM4JH - Tactile Switch, Non Illuminated na Farnell.com.
  6. Geekcreit 100pcs Mini Micro Tactile Touch Switch na Banggoode.
  7. 0.91 inch 128x32 I2C IIC Serial OLED LCD Display Module na AliExpresse.
  8. Monochrome 128x32 I2C OLED graphic display na Adafruit.
  9. ATTinyCore  na GitHub.
  10. IC test Clip - SOIC 8-pin na SparkFun.
  11. Tiny AVR Programmer na Sparkfun.
Máte aj vy zaujímavú konštrukciu, alebo článok?

Máte aj vy zaujímavú konštrukciu, alebo článok a chceli by ste sa o to podeliť s viac ako 360.000 čitateľmi? Tak neváhajte a dajte nám vedieť, radi ju uverejníme a to vrátane obrazových a video príloh. Rovnako uvítame aj autorov teoretických článkov, či autorov zaujímavých videí z oblasti elektroniky / elektrotechniky.

Kontaktujte nás!

ElektroLab potrebuje aj vašu pomoc / ElektroLab also needs your help
Podpor nás!   Support us!


Páčil sa Vám článok? Pridajte k nemu hodnotenie, alebo podporte jeho autora.
 

       

Komentáre k článku



Komentár môžete adresovať buď diskutujúcemu priamo pomocou tlačidla „Odpovedať“, alebo ho môžete adresovať všeobecne do poľa nižšie.

Zatiaľ nebol pridaný žiadny komentár k článku. Pridáte prvý? Berte prosím na vedomie, že za obsah komentára je zodpovedný užívateľ, nie prevádzkovateľ týchto stránok.
Pre komentovanie sa musíte prihlásiť.

Vaša reklama na tomto mieste



Vyhľadajte niečo na našom blogu

Máte záujem o reklamu?

PCBWay Promo

Máte záujem o reklamu?

PCBWay Promo

Máte záujem o reklamu?

PCBWay Promo

🎨 Rezistor
Pásiky: 4
Výsledok: 0.00 Ω ±1%
🔗 Zdieľať widget

💡 Vedeli ste, že…


Webwiki Button