O zi buna!
Reprezentările hexazecimale ale numerelor sunt scrise între paranteze.
În sfârșit, m-am maturizat înainte de a scrie următoarea postare.
Astăzi voi încerca să scriu un generator de impulsuri. Da, nu doar pe frunte printr-o schimbare banală a stării fiecărui picior după un anumit timp, ci „frumos”, adică. prin întreruperi. Vom folosi overflow-ul cronometrului TMR0 ca sursă de întrerupere.
Începem debriefing-ul
Să încercăm să înțelegem ce este acest temporizator misterios TMR0.
Și acest cronometru pur și simplu numără numărul de impulsuri primite. Mai mult, sursa impulsului poate fi fie un dispozitiv extern, fie un generator intern. Alegerea sursei pulsului este efectuată de un bit al registrului OPTION_REG. Și anume, al cincilea bit, T0CS.
De asemenea, pare a fi întrerupt în mod înțeles. A venit un impuls, valoarea din registru a fost crescută (creștetă cu unu). Și așa mai departe până când cronometrul depășește. Depășirea se datorează adâncimii de biți a controlerului. Controlerul nostru este deja pe 8 biți. Și în 8 cifre, puteți stoca numere în intervalul 0..255 inclusiv (total 256). Aceasta înseamnă că depășirea va avea loc atunci când contorul / cronometrul conține deja numărul 255, la care controlerul va încerca să mai adauge unul. Și de aici încep minunile. Valoarea din registrul de contor va deveni egală cu 0 (0x00), iar controlerul va începe procesarea întreruperilor, în timp ce ridică steagul pentru apariția acestei întreruperi.
Se pare că și-au dat seama. Acum, cum am face un generator de impulsuri din el? Da, este mai ușor decât un nap la abur. Concluzia este că puteți scrie un număr în registrul TMR0. Și va fi incrementat nu de la zero, ci de la acest număr. Astfel, trebuie doar să ridicați (bine, sau să numărați) ce număr trebuie să punem în registrul TMR0 pentru a face durata pulsului dorită.
Aici am încercat să descriu o imagine de diagramă bloc, dar am descărcat un program foarte complicat și nu am avut prea mult timp să mă ocup de el. Deși s-a dovedit, în ceea ce mă privește, este suficient de clar. Ne uitam:
Acolo unde săgețile dintre blocuri nu sunt afișate, ele merg una după alta.
Codul s-a dovedit a fi destul de mic, ne uităm. Comentat la maxim:
#include p16F84A.inc ; conectați antetul
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC ; Configurație MK
;----
; Registre de uz general
;---
; Dar nu le vom avea, este ca și cum ne vom descurca cu o baterie
;---
;Program
;---
ORG 0x00 ; specificați adresa programului principal
GOTO Main
;---
; Întreruperi și subrutine
;---
ORG 0x04 ; defini vectorul de întrerupere
NOP ; calibrare NOP
COM PORTA ; inversați toți pinii portului A
NOP ; din nou calibrare NOP
movlw .152 ; Întârziere 255-152=103 pus în W
MOVWF TMR0 ; În TMR0 punem valoarea întârzierii
BCF INTCON,2 ; resetează steag de întrerupere
RETFIE ; înapoi la principal. program
;---
;Bucla principală
;---
STARE BSF principală,5 ; Du-te la prima bancă
movlw.0 ; Punem acumulatorul 0
MOVWF TRISA ; Marcam tot portul A pentru iesire
BCF OPTION_REG,5 ; Semnal de ceas intern pentru TMR0
STARE BCF,5 ; Merg la Zero Bank
BSF INTCON ; Activați întreruperile
BSF INTCON,5 ; Activați întreruperile la depășire TMR0
CLRF PORTA ; Zero logic pe întregul port A
movlw .152 ; Trimiterea unui număr la acumulator
MOVWF TMR0 ; 256-1-148=107 mt rămas înainte de preaplin
buclă ; Așteptând întrerupere
GOTO Loop
Sfârşit
Asta este de fapt tot 🙂 și funcționează așa.
Acest proiect se bazează pe circuitul generator de funcții descris pe site-ul Mondo. Am făcut doar modificări foarte minore și am corectat unele greșeli evidente în schema. Cod rescris pentru sintaxa Microchip.
Specificații generator:
Raspuns in frecventa: 11Hz - 60kHz
Control digital al frecvenței cu 3 trepte diferite
Forma de undă: sinusoidală, triunghiulară, pătrat, puls, rafală, măturare, zgomot
Gama de tensiune de ieșire: ±15V pentru sinus și delta, 0-5V pentru altele
Sincronizare: ieșire pentru semnal de impuls.
Dispozitivul este alimentat de un transformator de 12 volți, care asigură o tensiune DC suficient de mare (mai mult de 18 V) necesară pentru funcționarea normală a stabilizatorilor 78L15 și 79L15. Este necesară o sursă de ±15 V pentru ca amplificatorul operațional LF353 să emită o gamă completă de semnale la o sarcină de 1 kΩ. Când se utilizează o sursă de ±12 V, acest rezistor trebuie să fie de cel puțin 3 kΩ.
Senzorul de rotație (encoder rotativ) pe care l-am folosit este ALPS SRBM1L0800 sub forma a două întrerupătoare într-un cerc pe diagramă. Autorul probabil a folosit unul diferit, așa că au fost necesare unele modificări la codul programului controlerului. Senzorul meu are două seturi de contacte: OFF și ON (când rotorul se mișcă în direcția corespunzătoare). Prin urmare, o întrerupere de schimbare a PORTB trebuie să fie generată dacă una dintre perechile de pini este scurtcircuitată. Acest lucru se realizează prin conectarea ambelor grupuri de contacte la contactele PIC16 (RB4 - RB7), care sunt verificate de program pentru o schimbare de stare. Din fericire, RB4 nu a fost folosit în designul original, așa că am redirecționat RB3 către RB4. O altă modificare se datorează folosirii unui encoder rotativ, așa că am schimbat puțin întreruperile firmware-ului. Am făcut ca regulatorul să păstreze starea pentru 100 de măsurători consecutive în loc de 10 în designul original. Rețineți că unii pini PIC sunt folosiți pentru a redirecționa +5V pentru a simplifica aspectul PCB, deci sunt configurați ca intrări de port.
Placa de circuit imprimat oferă trei ansambluri de rezistență. Unul - R / 2R - pentru DAC din seria Bourns 4310R. Ansamblul rezistențelor DAC poate fi construit și pe rezistențe discrete conform diagramei de mai sus. Trebuie utilizate rezistențe cu o toleranță de ±1% sau mai bună. Rezistoare de limitare LED Bourns seria 4306R. Luminozitatea LED-urilor poate fi mărită prin modificarea rezistenței rezistențelor de limitare până la 220 - 330 ohmi.
Generatorul este asamblat într-o carcasă din plastic de 179x154x36 mm cu panouri frontale și posterioare din aluminiu. Nivelul semnalului de ieșire este reglat de un rezistor variabil seria Alfa 1902F. Toate celelalte componente sunt montate pe panourile din față și din spate (butoane, conectori, ansambluri LED, conector de alimentare). Plăcile sunt atașate la carcasă cu șuruburi de 6 mm cu distanțiere din plastic.
Generatorul produce 9 forme de undă diferite și funcționează în trei moduri, care sunt selectate cu ajutorul butonului „Selectare”, iar indicarea lor este afișată pe primele trei LED-uri (conform diagramei). Senzorul de rotație corectează parametrii semnalului conform următorului tabel:
Modul\Formă |
triunghi |
||||||||
Modul 1 |
|||||||||
Modul 2 |
|||||||||
Modul 3 |
Imediat după pornire, generatorul intră în modul 1 și generează o undă sinusoidală. Cu toate acestea, frecvența de pornire este destul de scăzută și cel puțin un clic al butonului este suficient pentru a o crește.
P.S. Voi adăuga pe cont propriu: la repetarea dispozitivului cu placa de circuit imprimat a autorului, dispozitivul a refuzat să pornească (poate că există o eroare pe placa de circuit imprimat), iar atunci când este montat pe o placă, generatorul a început să funcționeze imediat.
Mai jos puteți descărca surse asm, firmware și fișiere PCB ()
Lista elementelor radio
Desemnare | Tip | Denumire | Cantitate | Notă | Magazin | Blocnotesul meu | |
---|---|---|---|---|---|---|---|
Circuitul generatorului. | |||||||
microcontroler | PIC16F870 | 1 | La blocnotes | ||||
Registrul de deplasare | CD74HC164 | 1 | La blocnotes | ||||
Amplificator operațional | LF353 | 1 | La blocnotes | ||||
Multiplexor/Demultiplexor | CD4053B | 1 | La blocnotes | ||||
Regulator liniar | LM7805 | 1 | La blocnotes | ||||
Regulator liniar | LM78L15 | 1 | La blocnotes | ||||
Regulator liniar | LM79L15 | 1 | La blocnotes | ||||
dioda redresoare | 1N4002 | 3 | La blocnotes | ||||
Condensator | 22 pF | 2 | La blocnotes | ||||
Condensator | 51 pF | 1 | La blocnotes | ||||
Condensator | 100 pF | 1 | La blocnotes | ||||
Condensator | 1000 pF | 1 | La blocnotes | ||||
Condensator | 0,1 uF | 1 | La blocnotes | ||||
1 uF | 2 | La blocnotes | |||||
condensator electrolitic | 4,7 uF | 1 | La blocnotes | ||||
condensator electrolitic | 100uF | 2 | La blocnotes | ||||
condensator electrolitic | 500uF | 1 | La blocnotes | ||||
Rezistor | 470 ohmi | 6 | La blocnotes | ||||
Rezistor variabil | 1 kOhm | 1 | La blocnotes | ||||
Rezistor | 2,7 kOhmi | 1 | La blocnotes | ||||
Rezistor | 4,7 kOhmi | 1 | La blocnotes | ||||
Rezistor | 10 kOhm | 4 | La blocnotes | ||||
Rezistor | 15 kOhm | 1 | La blocnotes | ||||
Rezistor | 22 kOhm | 1 |
Scurte caracteristici:
· Trei moduri de setare a duratei impulsului: tensiune (inclusiv potențiometru); USART; setările din memoria flash.
Domenii de frecvențe generate:
– după tensiune – de la mai puțin de 1 Hz la 10 kHz (trei intervale);
– prin USART/Flash – de la 0,11 Hz la 7,246 kHz.
· Activare/dezactivare generare; managementul repausului.
· Complet autonom, nu necesită componente suplimentare (rezonator de cuarț, surse de frecvență de referință etc.).
Aplicatii posibile:
· Unitate de setare a frecvenței gestionată sau neadministrată încorporată în echipamentul electronic (oscilator principal).
· Managementul indicarii luminoase cu un mod de operare intermitent.
· Sintetizator de frecvențe sonore.
· Simulator de semnal pentru depanarea echipamentelor electronice.
DESCRIEREA GENERALĂ A GENERATORULUI DE IMPULS
Generatorul de impulsuri bazat pe microcontrolerul PIC12F675 este proiectat să genereze impulsuri logice dreptunghiulare cu durată reglabilă.
Are setări flexibile, o gamă largă de frecvențe de ieșire și control, ceea ce face ca utilizarea acestui microcircuit să fie convenabilă pentru o gamă largă de sarcini. Datorită compactității și autonomiei sale, poate simplifica semnificativ circuitele electronice cu unități de generare a frecvenței, le poate face mai precise, le oferă funcții suplimentare și poate reduce suprafața plăcilor de circuite imprimate.
Scopul pinii microcircuitului (vezi figura de mai sus):
Concluzie | Desemnare | Tip | Descriere |
1 | vdd | Pete. | Alimentare (intervalul de tensiune de alimentare prezentat mai jos). |
2 | Pulsuri | Ieșire | impulsuri generate. |
3 | IdleState | Intrare | Setarea stării de repaus a ieșirii impulsuri (când generarea este oprită): 0 – când generarea este oprită, ieșirea impulsurilor este în starea „0”; 1 – când generarea este oprită, ieșirea de impulsuri este în starea „1”; conectat la ieșirea Pulses– când generarea este oprită, ieșirea Pulses va rămâne în starea în care se afla la momentul în care a fost oprită (după pornirea alimentării, starea Pulses va fi nedefinită). Schimbarea stării intrării IdleState atunci când generarea este oprită duce la o schimbare imediată a stării impulsurilor de ieșire (funcționează ca un repetor). În acest caz, timpul de reacție pentru modificarea semnalului IdleState este de până la 100 µs. |
4 | Alerga | Intrare | Permisiune de generare a impulsurilor: 1 – activat, 0 – dezactivat. Când Run se schimbă de la 0 la 1, ieșirea Pulses își schimbă imediat starea în opus (marginea primului impuls). Când Run se schimbă de la 1 la 0, ieșirea Impulsurilor intră imediat în repaus (impulsul curent nu se termină în durată). Timpul de răspuns la o modificare a semnalului Run este de până la 100 µs, în „modul lent” - până la 500 µs. |
5 | M1 | Intrare | Selectarea modului de operare (M1:M0): 0:0 – tensiune, mod rapid. 0:1 - tensiune, mod mediu. 1:0 – tensiune, mod lent. 1:1 – USART/Flash. Modul de funcționare poate fi schimbat „din mers”, în timp ce este de dorit ca picioarele M0 și M1 să își schimbe starea în același timp. Timpul de răspuns la schimbarea semnalelor M1 și M0 de obicei nu depășește câteva microsecunde. Dacă oscilatorul este folosit întotdeauna în același mod, pinii M0 și M1 pot fi trasi la Vdd și Vss în funcție de modul dorit. |
6 | M0 | Intrare | |
7 | Ur/RX | Intrare | În modul de tensiune– intrare analogică Ur (setează durata impulsului: Vss – minim, Vdd – maxim). În modul USART– intrare digitală RX (linie de comunicație). În modul bliț– intrare digitală RX, trebuie trasă la Vdd. |
8 | Vss | Pământ | „Pământul” hranei și logicii. |
Se recomandă (nu este obligatoriu) să instalați un condensator de 1-10 uF între liniile Vdd și Vss în imediata apropiere a microcircuitului, mai ales când controlați durata impulsului folosind tensiune (ajută la reducerea zgomotului pe linia de alimentare).
CONTROLUL DURATA IMPULSULUI CU TENSIUNE
În modul de control al duratei impulsului folosind tensiune, tensiunea de control este aplicată la intrarea Ur, care în acest mod funcționează ca o intrare ADC care convertește valoarea tensiunii într-o valoare de 10 biți (0...1023). Valoarea 0 (Ur=Vss) corespunde duratei minime a impulsului, valoarea 1023 (Ur=Vdd) corespunde maximului.
Un potențiometru (de exemplu, 10-20 kΩ) poate fi folosit ca sursă de tensiune pentru a seta manual durata impulsului, așa cum se arată în diagrama din dreapta. Deoarece intrarea Ur nu consumă practic nici un curent, potențiometrul va oferi o ajustare liniară a duratei impulsului pe întregul interval. În același timp, pentru a reduce zgomotul la intrarea ADC și a crește stabilitatea frecvenței generate, se recomandă împământarea intrării Ur printr-un condensator de 1–10 μF instalat în imediata apropiere a microcircuitului.
Ciclul de lucru al impulsurilor pentru controlul tensiunii este întotdeauna de 50%.
Reglarea tensiunii se realizează în trei domenii, selectate de intrările M1:M0:
Denumirea „(0...1023)” din tabel este valoarea ADC obținută după conversia tensiunii de intrare Ur (Vss...Vdd).
CONTROLUL DURATA PULSULUI USART
Modul USART/Flash este selectat prin aplicarea celor logice la ambele intrări M0 și M1. În acest caz, intrarea RX este o intrare digitală a liniei de comunicație USART.
Atenţie! Nivelurile de tensiune la intrarea RX sunt logice (Vss și Vdd)! Pentru a vă conecta la linia RS-232, utilizați cipuri de driver (de exemplu, MAX232). Aplicarea unui semnal de linie RS-232 direct la intrarea RX îl poate deteriora!
Comunicarea cu controlerul este unidirecțională (numai recepția). Parametri de comunicare: baud rate 4800, 8 biți, 1 bit de oprire, fără paritate. Starea inactivă a liniei (fără transmisie) este considerată ridicată. Transmiterea simbolurilor de-a lungul liniei poate fi efectuată în orice moment și prin ea însăși nu afectează generarea de impulsuri, inclusiv nu creează fluctuații suplimentare („jitter”) ale fronturilor.
Când este controlat prin USART, ciclul de lucru al impulsurilor poate fi modificat în mod arbitrar (durata impulsurilor și pauzele dintre ele sunt setate separat).
Generarea poate fi controlată atât folosind intrările Run și IdleState, cât și folosind comenzi USART, în timp ce utilizarea fiecăreia dintre aceste două intrări este configurată individual.
Un apel către generatorul de impulsuri prin USART are întotdeauna următoarea formă:
Toate caracterele din paranteze sunt cifre hexazecimale (0...F, literele A...F sunt strict majuscule!). Pentru toate câmpurile de doi octeți, cea mai semnificativă cifră este transmisă prima și cea mai puțin semnificativă cifră ultima.
Pachetul este transmis fără spații, lungimea pachetului este întotdeauna de 14 caractere (inclusiv paranteze). Toate caracterele înainte de „” sunt ignorate. Pachetele de lungime mai mică sau mai mare sunt ignorate (nu sunt executate). Dacă în timpul recepționării pachetului a avut loc o schimbare a semnalelor M1:M0, un astfel de pachet este și el ignorat. Execuția comenzii conținute în pachetul corect are loc imediat după primirea caracterului „>”.
Scopul câmpurilor pachetului:
Camp | Descriere | |
KK | Comanda (valori hexazecimale): 22 – setarea parametrilor de generare; 2D– setarea parametrilor de generare și scrierea acestora în memoria Flash (setarea modului Flash). Modificările parametrilor de generare au efect imediat (pulsul curent sau pauza de durată nu se termină). Pachetele cu alte comenzi sunt ignorate (nu sunt executate). |
|
SS | Configurarea PIN Run și IdleState. Biți de valoare: C7 C6 C5 C4 C3 C2 C1 C0. Bit C0: 0 = activare generare la intrarea Run; 1 = activare generare pe valoarea bitului C3. Bit C1: 0 = stare de repaus după valoarea intrării IdleState; 1 = stare inactiv conform valorii bitului C4. Bit C3: la C0 = 1: 1 – generarea impulsurilor este activată, 0 – generarea impulsurilor este dezactivată. Bit C4: cu C1 = 1: valoarea ieșirii impulsurilor în repaus (când generarea este oprită). Restul biților sunt ignorați. |
|
LLL | Durată impulsuri. |
Definit prin formula: durata = [valoare+1]*69 µs. Durată minimă (valoare = 0): 69 µs. Durata maximă (valoare = 65535): 4,521984 s. Rezoluție de setare a duratei: 69 µs. Valorile din formulă sunt zecimale, când sunt transferate sunt hexazecimale. |
PPPP | Durata pauzei între impulsuri. |
Exemple de configurare a parametrilor CC (valori binare, valori hexazecimale între paranteze):
· 00000000 (00) – generarea este activată de intrarea Run, starea inactivă este determinată de intrarea IdleState.
00000010 (02) – generarea este activată de intrarea Run, starea de repaus este 0.
00010010 (12) – generarea este activată de intrarea Run, starea de repaus este 1.
· 00001001 (09) – generarea este mereu activă (starea de odihnă nu contează).
· 00000001 (01) – generarea este dezactivată permanent (starea inactivă este determinată de intrarea IdleState).
· 00000011 (03) – generarea este dezactivată permanent (ieșirea este întotdeauna 0).
· 00010011 (13) – generarea este dezactivată permanent (ieșirea este întotdeauna 1).
Durata perioadei pulsului este determinată de formula TTTT = LLLL+PPPP și variază de la 138 µs (aproximativ 7246 Hz) la 9,044 s (aproximativ 0,11 Hz). Rezoluția de setare a perioadei este de 69 µs (sau 138 µs cu un ciclu de lucru de 50%).
La intrarea în modul USART, generarea impulsurilor începe în conformitate cu setările stocate în memoria Flash. Prin urmare, cu anumite setări care diferă de cele din fabrică, generarea poate începe chiar înainte ca comanda corespunzătoare să fie trimisă prin USART (vezi mai jos pentru setările memoriei flash).
Cometariu. După o comandă validă Write to Flash (“2D”), parametrii de nouă generație intră în vigoare imediat (ca după comanda „22”). Cu toate acestea, aceasta este urmată de o pauză, în timpul căreia microcircuitul scrie parametrii în memoria nevolatilă și nu răspunde la modificările semnalului extern și la noile caractere USART (generarea continuă în modul specificat). Durata pauzei este de aproximativ 23 ms. Cu toate acestea, deoarece timpul de scriere în memoria nevolatilă poate varia, se recomandă să așteptați 25-30 ms înainte de a trimite comenzi noi prin USART.
CONTROLUL DURATA IMPULSULUI PRIN MEMORIA FLASH
Modul USART/Flash este selectat prin aplicarea celor logice la ambele intrări M0 și M1. În același timp, pentru a funcționa în modul Flash, intrarea RX trebuie să aibă și o unitate logică continuă.
Setările stocate în memoria Flash corespund constantelor CC (configurație pin), LLLL (durata impulsului) și PPPP (durata pauzei pulsului) din tabelul de mai sus, care sunt setate de producător sau programate prin modul USART.
Dacă constanta CC are biții C0=1 și C3=1, generarea va începe imediat după trecerea la modul Flash și va continua pe toată perioada în care se află în el. Dacă bitul C0=0, generarea va fi activată/dezactivată de intrarea Run, starea inactivă fiind configurată de biții C1 și C4 (vezi exemplele de mai sus).
Modul Flash este convenabil pentru crearea de generatoare autonome de frecvență constantă care nu necesită reglaj extern (prin tensiune sau USART) și are o stabilitate de frecvență mai mare decât cu controlul tensiunii (datorită absenței interferenței la intrarea Ur).
Setări implicite din fabrică în memoria flash:
CC = 00 (generarea de control a semnalelor Run și IdleState);
LLLL = zecimală 7245 (corespunde la 500 ms);
PPPP = 7245 zecimale (corespunde la 500 ms).
Astfel, în mod implicit, microcircuitul este configurat ca un generator de frecvență de 1 Hz (50% duty cycle), controlat de intrările Run și IdleState.
La livrare, putem configura microcircuitul în funcție de dorințele dumneavoastră (mai multe detalii mai jos), sau îl puteți reconfigura independent o dată sau de mai multe ori prin USART (necesită echipament adecvat). Memoria nevolatilă încorporată a microcircuitului oferă cel puțin 100.000 de cicluri de rescriere (de obicei până la 1.000.000).
GENERATOR DE BURST
Un generator de impulsuri poate fi implementat folosind două cipuri identice generatoare de impulsuri, cu ieșirea de impulsuri a primului cip conectată la intrarea Run a celui de-al doilea, iar intrarea IdleState a primului cip fiind legată la pământ (vezi diagrama din dreapta).
Activarea și dezactivarea generării exploziilor de impulsuri se realizează utilizând intrarea Run a primului microcircuit, iar starea de repaus când generarea este oprită este realizată de intrarea IdleState a celui de-al doilea microcircuit.
Intrările Ur / RX, M0 și M1 ale primului microcircuit determină parametrii exploziilor, iar intrările Ur / RX, M0 și M1 ale celui de-al doilea microcircuit determină parametrii impulsurilor din interiorul exploziilor. În acest caz, dacă este necesar, primul și al doilea microcircuit pot funcționa în moduri diferite (de exemplu, unul de la potențiometru, iar celălalt în funcție de setările memoriei Flash).
Aplicarea posibilă a generatoarelor de explozie: semnalizare sonoră intermitentă, indicare luminoasă intermitentă cu control al luminozității și multe altele.
ALTE CARACTERISTICI
Caracteristicile electrice și termice ale microcircuitului corespund microcontrolerului PIC12F675, a cărui descriere poate fi găsită în limba rusă (format PDF).
Principalele caracteristici electrice ale generatorului de impulsuri sunt următoarele:
· Tensiune de alimentare Vdd: de la 2,5 la 5,5 V (inclusiv 3,3 V, 5 V).
· Interval de temperatură de funcționare: -40 până la +85 °C.
· Curent maxim de scurgere/sursă la ieșirea Pulses: 25 mA.
· Consum de curent: 4 mA sau mai puțin (de obicei 1 mA) plus curent la ieșirea Pulses.
Trageți pinii neutilizați la Vdd pentru a reduce consumul de curent.
COMANDAREA UNUI MICROCONTROLLER CU SOFTWARE
ATENŢIE! Aici puteți achiziționa un microcontroler PIC12F675 cu un program de generare a frecvenței deja afișat la un preț fix - 250 de ruble!
La comanda a mai mult de 5 bucati pretul este redus; pentru loturile en-gros, pretul este de cateva ori mai mic (in functie de marimea lotului: completati formularul de mai jos pentru a afla pretul).
Dacă doriți, puteți achiziționa și dvs. un controler PIC12F675 gol într-o rețea de vânzare cu amănuntul și să comandați numai firmware-ul acestuia de la noi (costul este la tariful general).
La comanda, puteți specifica setările cusute în memoria Flash (durata pulsului, modul de funcționare, configurația pin Run și IdleState) pentru ca generatorul de impulsuri să funcționeze în modul Flash. Configurarea cipului conform dorințelor dumneavoastră se realizează complet gratuit pentru orice cantitate de comandă (de la 1 bucată).
COMANDA
Utilizați formularul de mai jos pentru a trimite o comandă pentru un microcontroler cu firmware-ul de mai sus. Vă rugăm să completați cât mai complet posibil.
Pentru a genera un semnal video, sunt suficiente doar un microcontroler și două rezistențe. Adică, puteți face literalmente un generator de semnal video de buzunar de dimensiunea unui breloc. Un astfel de dispozitiv este util telemasterului. Poate fi folosit la amestecarea kinescopului, ajustarea purității și liniarității culorii.
Funcționarea generatorului și caracteristicile acestuia.
Generatorul este conectat la intrarea video a televizorului, de obicei un conector „lalea” sau „SCART”.
Instrumentul generează șase câmpuri:
- câmp text de 17 rânduri;
- grila 8x6;
- grila 12x9;
- teren mic de sah 8x6;
- teren mare de sah 2x2;
- câmp alb.
Comutarea între câmpuri se realizează prin apăsarea scurtă (mai puțin de 1 s.) a butonului S2. Menținerea acestui buton apăsat mai mult timp (mai mult de 1 s.) oprește generatorul (microcontrolerul intră în starea „SLEEP”). Generatorul este pornit prin apăsarea butonului S1. Starea dispozitivului (pornit / oprit) este semnalizată de LED.
Caracteristicile tehnice ale dispozitivului:
- frecventa de ceas - 12 MHz;
- tensiune de alimentare 3 - 5 V;
- consum de curent în regim de funcționare:
- la o tensiune de alimentare de 3V - aproximativ 5mA;
- la o tensiune de alimentare de 5V - aproximativ 12mA;
- frame rate - 50 Hz;
- numărul de linii într-un cadru - 625.
Sistem.
Circuitul este foarte simplu.
Toate lucrează la formație
semnal video
executate de program
cusut în microcon-
troler. Două rezistențe
împreună cu rezistenţa
Intrare video TV
asigura necesarul
nivelurile mele de tensiune
semnal video:
- 0 V - nivel de sincronizare;
- 0,3 V - nivel de negru;
- 0,7 V - nivel de gri;
- 1 V - nivel alb.
Pentru a forma un semnal video, se utilizează bitul zero al PORTA și întregul PORTB. (Acest port operează în modul shift. Chiar dacă este semnalat doar bitul său zero, programul îl folosește pe tot. Prin urmare, toți biții PORTB sunt configurați ca ieșiri.) Primul bit al PORTA este folosit pentru a indica starea generatorului. Când dispozitivul este pornit, LED-ul este aprins. Când dispozitivul este oprit, LED-ul este stins. Al treilea bit al PORTA este folosit pentru a comuta modurile de funcționare a generatorului și pentru a-l opri. O apăsare scurtă a butonului S2 vă permite să treceți de la un câmp al generatorului la altul. Ținând apăsat acest buton mai mult de 1 s. dispozitivul se oprește (microcontrolerul intră în starea „SLEEP”). Pentru a porni generatorul, trebuie să efectuați o resetare. Acest lucru se face prin apăsarea butonului S1. Tensiunea de alimentare a dispozitivului poate fi selectată în intervalul 3 - 5 V. În acest caz, valorile rezistenței trebuie selectate în mod corespunzător.
3V...– R5=456Ω și R6=228Ω
3.5V - R5=571Ω și R6=285Ω
4V...– R5=684Ω și R6=342Ω
4,5 V - R5 \u003d 802 Ohm și R6 \u003d 401 Ohm
5V...- R5=900Ω și R6=450Ω
Iată valorile calculate. În realitate, puteți instala rezistențe din gama standard, de exemplu, pentru 5V - 910Ohm și 470Ohm și pentru 3V - 470Ohm și 240Ohm.
Tensiunea de alimentare a generatorului poate fi mai mică de 3V. Pentru fiecare PIC specific, minimul ar trebui determinat experimental. De exemplu, PIC-ul meu de 20 MHz, fabricat în 2001, a funcționat la 2,3 V.
Program.
Programul generează 6 câmpuri. Fiecare câmp este format din 301 de linii (300 de linii de informații + una neagră). În general, numărul calculat este 305 (625 de linii raster - 15 linii de încadrare = 610. Informațiile din cadru sunt afișate în fiecare linie (pentru mai multe despre aceasta, vezi aici), deci 610 / 2 = 305). Dar cu acest număr de linii, dimensiunea verticală a rasterului se dovedește a fi puțin mai mare decât ceea ce formează semnalul video transmis de centrul de televiziune.
Prima linie din fiecare câmp este neagră. În acest moment, se interoghează starea butonului S2, se calculează timpul de menținere a acestuia și se determină necesitatea trecerii dintr-un câmp în altul.
Există o ușoară distorsiune verticală a liniilor în câmpurile grafice. Acest lucru se datorează faptului că lungimea unor linii este cu câteva cicluri mai mare decât a celorlalte din cauza necesității de a seta contoare de bucle. În general, subrutinele care formează câmpurile grafice sunt foarte simple, deci nu este nevoie să le comentați.
Să aruncăm o privire mai atentă la partea din program care formează câmpul de text. Aceasta este cea mai complexă secțiune a programului, ocupă cea mai mare parte, folosește resursele maxime ale microcontrolerului (toată memoria de date și o parte semnificativă a RAM). Aceasta folosește fragmente de cod luate din jocul Pong scris de Rickard Gunee.
Câmpul de text este format din 17 rânduri, fiecare dintre acestea putând conține cel mult opt caractere. Caracterele sunt afișate prin linie, adică o linie de text ocupă 17 linii ale rasterului. (Acest afișaj se datorează limitărilor PIC-ului.) Informațiile despre diagrama caracterelor sunt stocate în memoria programului în secțiunea tabel. Informațiile despre textul liniilor sunt stocate în memoria de date (64 de cuvinte = 8 rânduri de 8 caractere). De exemplu, în linia 08h (cu adrese de la 08h la 0Fh) se scrie următoarele: .20.60.48.50.90.58.20 20. Fiecare valoare este o coordonată (offset de la început) a unui caracter din tabel. Valoare.20. se potrivește cu un spațiu, .60. - litera „B”, .48. - litera „I”, și așa mai departe. Și toate împreună formează „_VIDEO__”.
Să ne uităm la un exemplu despre modul în care este afișat textul. Conform programului, în a 12-a linie de text a ecranului, este necesară afișarea informațiilor la care se referă linia de memorie de date 28h (A0 B8 68 C8 D8 70 E0 D0). Astfel, în următoarele 17 rânduri ale rasterului, textul ar trebui să fie afișat: " p i c 1 6 f 8 4 ". Se întâmplă în felul următor. Prima dintre cele 17 linii afișează doar nivelul de negru. În acești 64 µs, în timp ce pe ecran este afișată o linie neagră, „valorile superioare” ale caracterelor sunt scrise în registrele RAM: 00h din „p”, 08h din „i”, 00h din „c” 18h din „ 1" și așa mai departe. Pe parcursul liniei următoare, aceste date sunt transferate secvenţial la PORTB, adică la ieşirea video. A treia linie este din nou neagră. În timpul execuției sale, valorile caracterului „a doua din partea de sus” sunt scrise în buffer: 00h din „p”, 00h din „i”, 00h din „c” 1Ch din „1” ... În a patra linie , aceste date sunt afișate pe ecran. Și așa mai departe, până când este afișată întreaga linie.
Subrutina de încadrare este preluată în întregime din jocul Pong scris de Rickard Gunee. Această subrutină este scurtă, dar destul de complicată. Dacă explicați cum funcționează, atunci se va dovedi și mai lung și mai confuz. Cel mai bine este să puneți unul lângă altul textul subrutinei și desenul formei de undă de sincronizare verticală și să vă faceți timp pentru a analiza fiecare linie de cod. Pot spune doar că subrutina începe să ruleze nu de la linia de sus, ci de la mijloc (:-)), de la eticheta „vertsync”.
Overclocking PIC16F84.
După cum se poate observa din diagrama din acest proiect, microcontrolerul funcționează la o frecvență de 12 MHz. Până în prezent, sunt disponibile trei versiuni ale PIC16F84: la 4MHz, la 10MHz și la 20MHz. (De la 1/1/2002, raportul de preț este de aproximativ 3,5 USD, 5,3 USD și 6,3 USD) În proiectul său Pong, Rickard Gunee pretinde că a folosit un PIC16F84 de 4MHz și a funcționat ore în șir la 12MHz fără probleme. L-am încercat și într-adevăr PIC-ul de 4MHz funcționează bine la o frecvență de trei ori (!!!) mai mare decât frecvența permisă (deși nu am tentat soarta și am pornit generatorul doar pentru câteva minute). Totodată, PIC-ul de 4 MHz a consumat curent cu 10 .. 20% mai mult decât cel de 20 MHz (de aici, aparent, limitarea frecvenței). Cred că un microcontroler de 10 MHz poate fi overclockat la 12 MHz fără risc, dar acest lucru, desigur, nu merită făcut în proiecte comerciale.
De fabricație.
Specificații generator:
Raspuns in frecventa: 11Hz - 60kHz
Control digital al frecvenței cu 3 trepte diferite
Forma de undă: sinusoidală, triunghiulară, pătrat, puls, rafală, măturare, zgomot
Gama de tensiune de ieșire: ±15V pentru sinus și delta, 0-5V pentru altele
Sincronizare: ieșire pentru semnal de impuls.
Dispozitivul este alimentat de un transformator de 12 volți, care asigură o tensiune DC suficient de mare (mai mult de 18 V) necesară pentru funcționarea normală a stabilizatorilor 78L15 și 79L15. Este necesară o sursă de ±15 V pentru ca amplificatorul operațional LF353 să emită o gamă completă de semnale la o sarcină de 1 kΩ. Când se utilizează o sursă de ±12 V, acest rezistor trebuie să fie de cel puțin 3 kΩ.
Senzorul de rotație (encoder rotativ) pe care l-am folosit este ALPS SRBM1L0800 sub forma a două întrerupătoare într-un cerc pe diagramă. Autorul probabil a folosit unul diferit, așa că au fost necesare unele modificări la codul programului controlerului. Senzorul meu are două seturi de contacte: OFF și ON (când rotorul se mișcă în direcția corespunzătoare). Prin urmare, o întrerupere de schimbare a PORTB trebuie să fie generată dacă una dintre perechile de pini este scurtcircuitată. Acest lucru se realizează prin conectarea ambelor grupuri de contacte la contactele PIC16 (RB4 - RB7), care sunt verificate de program pentru o schimbare de stare. Din fericire, RB4 nu a fost folosit în designul original, așa că am redirecționat RB3 către RB4. O altă modificare se datorează folosirii unui encoder rotativ, așa că am schimbat puțin întreruperile firmware-ului. Am făcut ca regulatorul să păstreze starea pentru 100 de măsurători consecutive în loc de 10 în designul original. Rețineți că unii pini PIC sunt folosiți pentru a redirecționa +5V pentru a simplifica aspectul PCB, deci sunt configurați ca intrări de port.
Placa de circuit imprimat oferă trei ansambluri de rezistență. Unul - R / 2R - pentru DAC din seria Bourns 4310R. Ansamblul rezistențelor DAC poate fi construit și pe rezistențe discrete conform diagramei de mai sus. Trebuie utilizate rezistențe cu o toleranță de ±1% sau mai bună. Rezistoare de limitare LED Bourns seria 4306R. Luminozitatea LED-urilor poate fi mărită prin modificarea rezistenței rezistențelor de limitare până la 220 - 330 ohmi.
Generatorul este asamblat într-o carcasă din plastic de 179x154x36 mm cu panouri frontale și posterioare din aluminiu. Nivelul semnalului de ieșire este reglat de un rezistor variabil seria Alfa 1902F. Toate celelalte componente sunt montate pe panourile din față și din spate (butoane, conectori, ansambluri LED, conector de alimentare). Plăcile sunt atașate la carcasă cu șuruburi de 6 mm cu distanțiere din plastic.
Generatorul produce 9 forme de undă diferite și funcționează în trei moduri, care sunt selectate cu ajutorul butonului „Selectare”, iar indicarea lor este afișată pe primele trei LED-uri (conform diagramei). Senzorul de rotație corectează parametrii semnalului conform următorului tabel:
Imediat după pornire, generatorul intră în modul 1 și generează o undă sinusoidală. Cu toate acestea, frecvența de pornire este destul de scăzută și cel puțin un clic al butonului este suficient pentru a o crește.
P.S. Voi adăuga pe cont propriu: la repetarea dispozitivului cu placa de circuit imprimat a autorului, dispozitivul a refuzat să pornească (poate că există o eroare pe placa de circuit imprimat), iar atunci când este montat pe o placă, generatorul a început să funcționeze imediat.
Mai jos puteți descărca surse asm, firmware și fișiere PCB (Eagle)
Descărcați arhiva:
Nu aveți acces pentru a descărca fișiere de pe serverul nostru