Acasă / Atelier / Masura/Control / Generator de impulsuri

Generator de impulsuri

Vreau să prezint un aparat uşor de construit, dar destul de util într-un laborator. De asemenea, poate fi bun ca proiect pentru şcoală. Ca amator, ori de cîte ori aveam nevoie de impulsuri, trebuia să construiesc un multivibrator cu tranzistoare sau cu 555. Totuşi în astfel de montaje factorul de umplere şi frecvenţa sînt dependente şi dificil de controlat separat. Asa că am vrut să construiesc un generator de impulsuri care să indeplineasca urmatoarele:

> Generare de semnal dreptunghiular compatibil TTL

> Factor de umplere („duty cycle”) reglabil, cu precizie bună, în procente

> Perioada semnalului de la ieşire să se regleze pe o plajă foarte largă. Perioada maximă am vrut să fie de ordinul minutelor, iar perioada minimă, cel putin 10uS.

> Posibilitate de trigger extern (funcţionare ca monostabil)

> Compact şi uşor

> Realizabil din componente vechi şi usor de gasit, eventual romîneşti sau ruseşti, FĂRĂ microcontroller şi fără a programa nimic.

Partea care dă perioada semnalului de la ieşire este oscilatorul. Pentru a fi cît mai simplu, şi din cauză că oricum aveam nevoie de nişte inversoare în schemă, am ales un oscilator foarte simplu cu un inversor Schmitt-Trigger (К155ТЛ2), o rezistenţă şi un condensator.

Pentru a permite reglajul, am pus un comutator rotativ care selectează unul din urmatoarele condensatoare:

1000uF; 100uF; 10uF; 1uF; 100nF; 10nF; 1nF; 100pF. Valorile fiind puteri ale lui 10, rezultă că raportul dintre frecvenţele a două poziţii apropiate este de asemenea 10.

 

Dacă şi rezistenţa se pune variabilă, astfel incît să atingă valori de genul R…10R, atunci oscilatorul poate să lucreze pe orice frecvenţă, pe toate decadele date de comutatorul rotativ. În loc de rezistenţă, am pus un rezistor fix de 100 ohmi în serie cu un potenţiometru de 1Kohm. Astfel am obţinut şi o uşoară întrepătrundere a gamelor.

Cu această configuraţie am obţinut o bandă de frecvenţe de oscilaţie între 0,3Hz şi 15MHz, ceea ce duce la o perioadă a semnalului de la ieşirea aparatului de 100 de ori mai mare; între 300s si 6uS.

TEORETIC, pentru obţinerea unui factor de umplere variabil, am preferat o abordare digitală. Ideea de bază este urmatoarea: Un contor decadic numără de la 0 la 99; pînă la o anumită valoare specificată de pe panoul frontal, ieşirea este „1”. Începînd de la acea valoare, ieşirea devine „0”.

Compararea cu valoarea de referinţă se poate face în mai multe moduri. Cel mai mic consum ar fi cu un comparator de egalitate, cu 8 porti XOR şi o poartă NOR cu 8 intrări. Altă soluţie ar fi cu un comparator pe 8 biţi (cu două 7485/К155СП1), care consumă mai mult, dar nu am acest integrat. Altă solutie ar fi cu un circuit de scădere realizînd operaţia:

adder_result = bcd_counter – duty_cycle

unde adder_result este rezultatul operaţiei, duty_cycle este valoarea citită de pe panoul frontal, şi bcd_counter este valoarea din numărătorul decadic.
Cît timp nu are loc depăşire(Overflow), inseamnă că bcd_counter are o valoare mai mică decît duty_cycle, deci iesirea este „1”. După ce bcd_counter devine mai mare ca duty_cycle, ieşirea devine „0”.
Ştim că diferenţa se poate face de fapt prin adunare cu complementul faţă de 2 al scăzătorului. Complementul faţă de 2 se obţine negînd bit cu bit, şi adunînd 1:

adder_result = bcd_counter + ~duty_cycle + 1

Pentru o înţelegere mai bună mi s-a părut interesant să scriu codul funcţional echivalent în Verilog. Nu are nici o legătură cu proiectul, nu trebuie programat nici un integrat cu acesta.

module pulse_generator(
input[3:0] rotary_encoder1, rotary_encoder2,
input ext_trigger, ext_trig_e, clk
output reg sq_out);
reg[7:0] bcd_counter;
wire[9:0] duty_cycle;
wire set_counters9;
wire[8:0] adder_result;
assign duty_cycle = {rotary_encoder1, rotaty_encoder2}
assign set_counters9 = (ext_trig_en & !sq_out & ext_trig_en);
assign adder_result = bcd_counter – duty_cycle;

always @(posedge clk or negedge set_counters9)
begin
sq_out<=adder_result[8];

if (!set_counters9) bcd_counter[7:0]<=8’d99;else
if (bcd_counter[3:0]==4’d9) begin
bcd_counter[3:0]<=4’h0;
if (bcd_counter[7:4]==4’d9) bcd_counter[7:4]<=4’d0;else
bcd_counter[7:4]<=bcd_counter[7:4]+1;
end
else
bcd_counter[3:0]<=bcd_counter[3:0]+1;
end
endmodule

 

PRACTIC, ca sumator am folosit un CDB483 (7483), care avantajează din mai multe puncte de vedere. În primul rînd, negarea se face foarte uşor, legînd pinul comun al dispozitivului de intrare decadic de pe panoul frontal la „0” (adică GND) în loc de „1” (adică +5V). Din cauză că o intrare TTL are tendinţa naturală să stea în „1”, nu a mai fost nevoie de rezistoare de pull-up. În al doilea rînd, termenul „+1” din relaţia de mai sus se obţine uşor legînd intrarea de Carry In a primului sumator (LSB) la „1”. (practic lasînd-o în aer). La ieşirea sumatorului am legat un bistabil. În lipsa acestuia, hazardul combinaţional rezultat în timpul comutărilor porţilor din CLC-ul sumatorului, poate da oscilaţii nedorite la ieşire. Cu bistabilul conectat, ieşirea este sincronizată cu ceasul intern, şi această problemă nu mai apare. Trigger-ul extern se realizează atunci cînd comutatorul este în poziţia ‘deschis’. Astfel, numărătoarele decadice sînt ţinute în 99 pînă cînd apare un impuls pe linia de trigger extern. După aceea numărătoarele trec în 00, şi numără pînă cînd ating valoarea dată ca factor de umplere, timp în care semnalul de trigger extern
este ignorat. După palierul de ‘1’, numărătorul este din nou ţinut la 99 în aşteptarea următorului impuls de trigger extern. Atunci cînd comutatorul este în poziţia ‘închis’, numărătoarele parcurg permanent 0…99, apoi revin la 0 etc.

Schema electronică o prezint în figura de mai jos:

schma

Nu am făcut cablaj, că erau prea multe trasee într-un spaţiu prea mic, trebuia dublu strat, si n-am vrut să mă complic. Sursa am luat-o dintr-un încărcător de Ericsson. Din fericire scotea deja 5V stabilizat si n-a fost nevoie s-o mai modific. Astfel, tot aparatul’ a fost proiectat, construit şi documentat intr-o singură zi. Aplicaţiile sînt multe, eu l-am facut în primul rand ca să observ de mai aproape comportarea surselor flyback/forward. (comportarea transformatoarelor, regim discontinuu, timpi de comutaţie, snubbere, etc; chestii care altfel se explică printr-o matematică teribilă.)
Se poate face mai compact şi cu consum infim cu integrate CMOS din seria 4000, SMD.
POZE:
img1

 

img2

 

img3

 

img4

Despre Cristian Grecu

Mă numesc Cristi, şi uneori sînt student la facultatea de electronică din Bucureşti. Consider electronica un domeniu infinit, cu cît învăţ mai mult, cu atît văd că marginile sale sînt tot mai departe.

Un comentariu

  1. parerea e foarte buna si cred ca ar trebui sa fie si foarte util ptr. cei interesati de exemplu as vrea sa iau legatura cu dl. Ciprian Grecu poate cumpar generatorul de semnal dreptunghiular caci eu nu am timp sa-l execut

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *