Jump to content
ELFORUM - Forumul Electronistilor

gsabac

Membru activ
  • Content Count

    1,216
  • Joined

  • Last visited

Community Reputation

374 core_reputation_level_5

6 Followers

About gsabac

  • Rank
    User Elforum
  • Birthday 12/18/1946

core_pfieldgroups_2

  • core_pfield_6
    Bucuresti

Recent Profile Visitors

1,605 profile views
  1. Poate pozitia dvs. este corecta, de ce sa inventam roata cand ea exista si mai mult ca sigur eu am ramas cu handicapul tineretii cand nu aveam acces la documentatii, la componente de top si aparatura si eram obligat sa inventez ceva functional. Vremurile s-au schimbat, dar totusi in legatura cu topicul mi-ar fi placut o trecere sumara in revista a procedeului oversampling aplicat la ADC. Dar se pare ca teoria si circuitele avansate depasesc cadrul acestui forum, asa cum mi-au mai spus si alti useri direct sau printre randuri, asa ca trec mai departe la circuitul LTC2440 ADC delta sigma, de 24 biti, care se afla in librariile programelor. O schema initiala de aplicatie este in poza. Click pentru marire. Circuitul LTC2440 are un amplificator diferential intern, de aceea sensibilitatea schemei este de 100mV si practic a treia cifra dupa punctul zecimal este la nivelul microvoltilor si este influentata de zgomotul propriu al circuitelor, care este implementat in modelul Proteus. Exista si circuitul LTC2400 cu intrare fata de masa dar nu are librarii pentru studiu. Circuitul LTC2440 comunica cu uC-ul prin SPI, prin 4 grupe de semnal de cate 8 biti. Grupa 4 este complexa si doar un singur bit este utilizat pentru valoarea citita, restul sunt prezentati in documentatie si se pare ca se pot seta prin program. Nu am aprofundat, doar am preluat un program, l-am convertit in mikroC si sunt utilizati doar 23 de biti din cei 24 disponibili. http://www.steveluce.com/24bits/Applications of the LTC 24 bit ADC.html#reference_source Pe global, desi ultimele doua cifre sunt fluctuante, se obtin aaproape 6 cifre semnificative constante si programele sunt in atasament. PS. Pretul acestor circuite ADC este in jur de 50 de lei. @gsabac MiliVoltmetru cu 6 cifre cu LTC2440 si PIC16F877A.rar
  2. In viziune mea, procedura prezentata de @Thunderer este tot oversampling, deoarece se refera de ex. la o esantionare finala de 100Hz. Chestia este cum se vede procedeul, de la cap la coada sau de la coada la cap. Pentru ca tot disecam ce si cum, as fi foarte curios, bineanteles daca doriti sa ne aratati, care ar fi in viziunea dvs. procedeul de oversampling cu ajutorul unui uC, printr-o schema bloc sau un flow-chart posibil de realizat si fizic. Am sa continui topicul cu un milivoltmetru inedit, care anuleaza erorile rail to rail, prezentate de producator de circa 100mV fata de masa. Click pentru marire. Aceasta se realizeaza prin introducerea unei tensiuni pozitive de circa 120mV la modul comun, in circuitul diferential format din U4 si U5 si translatarea modului diferential la modul monopolar fata de masa. Grupul divizor de intrare poate fi de tipul CADDOK 1776-6101 cu o precizie de 0,1% si comutatorul unul de calitate. Partea de simulare este in atasament si prezentarea ca drept cu 6 cifre este exagerata si limitata de precizia componentelor si inexistenta unor proceduri de reglaj pe zero. @gsabac MiliVoltmetru cu MCP3551 si PIC16F877A cu amplificator si comutator.rar
  3. Asa este, dar in mod normal, frecventa de esantionare este la maximum posibil, de ex. 100KHz si nu se mai poate mari, dar daca se micsoreaza voit la 100Hz, o fecventa utila pentru aplicatii vizuale, ca apoi sa se faca oversampling, cred ca este o complicatie inutila. La acest procedeu, pentru rezultate bune, trebuie sa se foloseasca si niste filtraje pe iesire corespunzatoare, dar si rejectia semnalelor perturbatoare de 50 sau 60Hz, asa cum o fac circuitele ADC de 22 saau 24 de biti. In alta ordine de idei, eu am aplicat oversampling la reconstructia unui semnal analogic digitalizat cu rezultate bune pana la circa 90% din frecventa Nyquist prin folosirea metodei simple spline, dar si prin metoda ferestrelor Rectangle, Blackman, Hanning si Hamming. Frecventa de esantionare a uC-ului era la maximum, dar procesarea am facut-o pe PC deoarece are potenta, cu transmisie prin USB a esantioanelor. @gsabac
  4. Nu cresterea frecventei de esantionare fata de o esantionare data duce la marirea rezolutiei ci cresterea numarului de esantioane intre doua masuratori, cu conditia esentiala ca procesele sa fie pur aleatorii, ceea ce nu se intampla in cazul unui ADC unde precizia de +/- 1/2 LSB depinde de precizia imbinarilor rangurilor binare, unde apar discontinuitati. In cazul unui ADC intern sau extern comandat de uC frecventa de esantionaare se poate seta in program, dar trebuie privit cum este mai avantajos, sa avem o frecventa de esantionare mica, de ex. 100 Hz pentru utilizare si 1024x100Hz=102,400 KHz pentru oversampling sau ADC-ul sa lucreze constant la 102,400KHz si sa se faca o mediere pe 1024 esantioane. Mie mi se pare ca procedeele cam sunt identice. Un alt procedeu interesant, este jonglarea analogica cu tensiunea de referinta, la uC-urile care permit aceasta procedura si se castiga astfel un bit, din 10 creste precizia la 11, adica in loc de 1024 de trepte se pot utiliza 2048. www.elektronikbilim.wordpress.com www.profahmet.wordpress.com Codul original este C si Proteus-ISIS si este in atasament. Am verificat monotonia la jonctiuni si este perfecta. @gsabac PIC16F886 smecherie LCD cu 11Bit_ADC precizie in loc de 10.rar
  5. Am prevazut mai multe exemple si aplicatii pe care le voi prezenta gradual, dar pentru inceput voi aminti un program realizat de colegul nostru de forum @Thunderer, care reuseste sa cresca precizia unui ADC cu cativa biti. Nu am testat procedura, dar mi se pare interesanta si as dori niste explicatii din partea autorului, daca se poate. https://forum.allaboutcircuits.com/threads/how-to-improve-adc-resolution.126934/page-2 'Code: ************************************************************************************************ ' * Project name: ' ADC Oversampling (up to 16 bit) ' * Copyright: ' (c) Thunderer (07/2014) ' * Revision History: ' 0 - 1st issue ' * Description: ' See Mikrobasic forum: Florin YO2LIO post (Mikrobasic and Mikropascal) ' * Test configuration: ' MCU: PIC16F690 ' Oscillator: INTOSC 8 MHz ' Ext. Modules: - ' * program _16F690_ADC_Oversampling ' Declarations section dim adc_rd0, adc_rd1,adc_rd2, adc_rd3 as longword dim adc_res1, adc_res2, adc_res3 as longword dim ch0, ch1, ch2, ch3 as byte ' Lcd module connections dim LCD_RS as sbit at RC5_bit LCD_EN as sbit at RC4_bit LCD_D4 as sbit at RC3_bit LCD_D5 as sbit at RC2_bit LCD_D6 as sbit at RC1_bit LCD_D7 as sbit at RC0_bit LCD_RS_Direction as sbit at TRISC5_bit LCD_EN_Direction as sbit at TRISC4_bit LCD_D4_Direction as sbit at TRISC3_bit LCD_D5_Direction as sbit at TRISC2_bit LCD_D6_Direction as sbit at TRISC1_bit LCD_D7_Direction as sbit at TRISC0_bit ' End Lcd module connections ' Set-up the PIC sub procedure InitMain() OPTION_REG = 0x80 ' Pull-up disabled PORTB INTCON = 0x00 ' No INT CM1CON0 = 0x00 ' No COMP CM2CON0 = 0x00 ' No COMP CM2CON1 = 0x00 ' No COMP ANSEL = 0x0F ' PORTA Analog I/Os on AN0, 1, 2 and 3 ANSELH = 0x00 ' No Analog I/Os TRISA = 0x17 ' Inputs RA0, 1, 2 and 4 TRISB = 0x00 ' All outputs TRISC = 0x00 ' All outputs PORTA = 0x00 ' Clear PORTA PORTB = 0x00 ' Clear PORTB PORTC = 0x00 ' Clear PORTC end sub sub function Adc_Read_Ext_Res(dim resolution, ch_ as byte) as longword dim i as longword j as byte result = 0 if resolution < 11 then exit end if ' minimum resolution is 11 bits resolution = resolution - 10 j = resolution - 1 i = 4 while j > 0 i = i << 2 dec(j) wend while i > 0 result = result + Adc_Read(ch_) dec(i) wend result = result >> resolution end sub ' Main program Main: InitMain() Lcd_Init() ' Initialize Lcd Lcd_Cmd(_LCD_CLEAR) ' Clear display Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off ADC_Init() ' Initialize ADC module ' Display static text Lcd_Out(1,1," 0:") Lcd_Out(1,9," 2:") Lcd_Out(2,1," 4:") ' Lcd_Out(2,9," 6:") ' The measurement Measure: while (TRUE) ' Voltage ADC_10b ADC0: adc_rd0 = ADC_read(0) * 48.82813 ch0 = adc_rd0 div 10000 Lcd_Chr(1, 4, 48+ch0) ch0 = (adc_rd0 div 1000) mod 10 Lcd_Chr(1, 5, 48+ch0) ch0 = (adc_rd0 div 100) mod 10 Lcd_Chr(1, 6, 48+ch0) ch0 = (adc_rd0 div 10) mod 10 Lcd_Chr(1, 7, 48+ch0) ch0 = (adc_rd0 div 1) mod 10 Lcd_Chr(1, 8, 48+ch0) Delay_ms(100) ' Voltage ADC_12b ADC1: adc_res1 = Adc_Read_Ext_Res(12,1) ' 12 bit resolution, channel 1 adc_rd1 = adc_res1 * 12.20703 ch1 = adc_rd1 div 10000 Lcd_Chr(1, 12, 48+ch1) ch1 = (adc_rd1 div 1000) mod 10 Lcd_Chr(1, 13, 48+ch1) ch1 = (adc_rd1 div 100) mod 10 Lcd_Chr(1, 14, 48+ch1) ch1 = (adc_rd1 div 10) mod 10 Lcd_Chr(1, 15, 48+ch1) ch1 = (adc_rd1 div 1) mod 10 Lcd_Chr(1, 16, 48+ch1) ' Voltage ADC_14b ADC2: adc_res2 = Adc_Read_Ext_Res(14,2) ' 14 bit resolution, channel 2 adc_rd2 = adc_res2 * 3.05176 ch2 = adc_rd1 div 10000 Lcd_Chr(2, 4, 48+ch2) ch2 = (adc_rd2 div 1000) mod 10 Lcd_Chr(2, 5, 48+ch2) ch2 = (adc_rd2 div 100) mod 10 Lcd_Chr(2, 6, 48+ch2) ch2 = (adc_rd2 div 10) mod 10 Lcd_Chr(2, 7, 48+ch2) ch2 = (adc_rd2 div 1) mod 10 Lcd_Chr(2, 8, 48+ch2) '' Voltage ADC_16b 'ADC3: ' adc_res3 = Adc_Read_Ext_Res(16,3) ' 16 bit resolution, channel 3 ' adc_rd3 = adc_res3 * 0.76294 ' ch3 = adc_rd3 div 10000 ' Lcd_Chr(2, 12, 48+ch3) ' ch3 = (adc_rd3 div 1000) mod 10 ' Lcd_Chr(2, 13, 48+ch3) ' ch3 = (adc_rd3 div 100) mod 10 ' Lcd_Chr(2, 14, 48+ch3) ' ch3 = (adc_rd3 div 10) mod 10 ' Lcd_Chr(2, 15, 48+ch3) ' ch3 = (adc_rd3 div 1) mod 10 ' Lcd_Chr(2, 16, 48+ch3) wend '*************************************************************************************** Prima aplicatie este un Voltmetru 6 1/2 cu PIC16F877_MCP4921 cu schema prezentata in poza Click pentru marire. Pe schema este prevazut un generator cu crestere lenta, pentru a se vedea evolutia masuratorilor la ultimele cifre mai putin semnificative. Intrarea in acest caz este diferentiala, de impedanta mica, dar aceasta se poate mari sau transforma intr-o intrare fata de masa. Deasemenea sensibilitatea se poate creste cu amplificatoare de intrare adecvate, ca in aplicatiile ce vor urma. In atasament se afla proiectul complet, functional in mikroC si Proteus. Spor la clicaiala si comentarii! @gsabac MiliVoltmetru cu 6 cifre cu MCP3551 si PIC16F877A - Elforum.rar
  6. In topic sunt exemple complete, functionale, cu circuitele de precizie ADC MCP3551 22 biti si ADC LTC2440 24 biti precum si DAC MCP4921 12 biti si DAC LTC1655 16 biti, activate de catre microcontrolere PIC16Fxxxx sau PIC18Fxxxx si pot fi si in combinatie cu dispozitive USB. Circuitele externe tip ADC sau DAC se pot cupla cu uC prin intermediul procedurii seriale cu trei fire SPI si pe un uC se pot grupa cateva asemenea circuite, dar si mai multe afisoaare cu LCD simultan, care sa indice date diferite. Un exemplu complex de circuit este in poza. Click pentru marire. Circuitele sunt utile pentru studiu sau constructia unor instrumente de precizie voltmetre, ampermetre, termometre, surse de precizie dar se pot folosi si cu diversi senzori in modul de lucru diferential sau monopolar. Mentionez ca nu am construit fizic circuite cu aceste componente, dar am studiat diverse surse cu exemple functionale sau nefunctionale si nu am gasit nici macar o aplicatie cu PIC care sa fie completa si propozabila de a fi aplicata. Sunt aplicatii cu alte tipuri de uC, dar si ele sunt incomplete. @gsabac
  7. Cam asa ar putea sa arate o sursa digitala de 25V si 2A. Click pentru marire. @gsabac
  8. Sursa digitala cu PIC18F45K22_MCP4921 este spre finalizare, acum are multe facilitati si este destul de stabila. Click pentru marire. La pornire tensiunea si curentul sunt zero si cu butonul RECALL se cheama ultima memorare a tensiunii si curentului Comenzile sursei: V-SET - seteaza tensiunea cu claviatura A-SET, ENTER - valideaza tensiunea si curentul CANCEL - anuleaza setarea gresita si se revine la valorile initiale +V STEP - creste tensiune in pasi de circa 10mV -V STEP SET +5V SET +12V STORE - memoreaza tensiunea si curentul preferat RECALL OUT OFF - pune iesirea in 0V OUT ON CURENT - semnalizare cand este generator de curent TENSIUNE Are rezolvata problema erorilor de tastare, over, mai multe cifre, CANCEL RESET sistem. Pentru setarea tensiunii se tasteaza V SET si asa arata display-ul. Claviatura nu are punct zecimal, dar el se introduce automat prin soft si este intuitiva introducerea datelor. Valorile de pe ecran vor rezulta si la iesire. Daca se depaseste 25.00V sau 2.00A softul genereaza un mesaj indicator si se revine la valorile initiale. Procedura este identica pentru setarea curentului si cu tasta ENTER se introduce noua valoare. Arhiva proiectelor Proteus si mikroC este in atasament si dupa dezarhivare, la pornirea simularii cu Proteus 8.7 SP3 sau mai recent, trebuie reincarcata calea fisierului HEX din directorul de lucru. La teste vor apare inevitabil unele probleme, mai ales in situatii imposibile, de aceea va rugam sa le semnalati. Proiectul fizic va cuprine mai multe adaugiri de condensatori de decuplare, diode de protectie, sigurante fuzibile, comutatori, alimentator, etc. si poate va dori cineva sa il experimenteze si chiar sa faca un produs finit. Asteptam sugestii pentru functionalitate si pentru imbunatatiri. Succes! @gsabac Sursa_ PIC18F45K22_MCP4921-Versiunea 5.02 cu Claviatura si Protectii.rar
  9. Diferenta dintre un aparat performant si unul obisnuit, printre altele, consta si in detalii. @aetius, in cazul sursei cu PIC a rezultat o tensiune continua de 9,0136 mV generata de convertorul DAC-MCP4921 la setarea initiala pe LSB=0000 si MSB=0000, care are ca efect o tensiune initiala de iesire de circa 100mV. Dupa cum ati vazut, am incercat sa compensez aceasta cu un reglaj cu trimer, dar la masuratori mai atente au rezultat trepte de tensiune nelineare la iesire, in portiunea de pana la 0,500V. Masurarea am facut-o cu voltmetrele interne din Probe Mode, care au 9 cifre semnificative (prin calcul). Nu am gasit o explicatie, desi am incercat sa corectez acest comportament, poate gasiti dumneavoastra. PS. Am incercat diverse sarcini pe MCP, dar rezultatul este acelasi. @gsabac
  10. @sesebe, documentatia de firma a fost dintodeauna sursa mea de inspiratie si unde am putut am demontat aparatele sa mai "ciupesc" si ceva detalii constructive. Evident niciodata nu m-am putut apropia de performantele lor si pot sa afirm ca am realizat ca profesionist doar niste caricaturi functionale, cu diversele componente pe care le-am am avut la dispozitie, dar imbinate armonios. De cativa ani am citit topicul amintit, dar acesta Aici este varianta folosita de mine nu functioneaza, probabil ca este foarte elaborat si precis. Desigur, am facut de mai multe ori testele indicate de dvs. in decursul timpului si pe simulator am reaalizat si cateva teste la sursa digitala. Am vizualizat cu osciloscopul frontul de crestere si am masurat supracresterea (5%), dar si frontul de descrestere care m-a nemultumit prin lentoarea sa, totul cu diverse sarcini sau in scurtcircuit, dar faza finala a masuratorilor se poate face doar pe un model experimental. Asa cum este constrita sursa, partea digitala seteaza doar niste tensiuni fixe, deci partea cu procesele tranzitorii cu modificarea dinamica a sarcinii este data doar de partea analogica, care este aproape clasica. Prin informarea lui @UDAR din 28 sept. si studiul prospectelor si am gasit tabele de curenti "negativi" utilizate in diverse surse profesionale de la 30% din curentul maxim pana la 130%, care in final realizeaza o descrestere doar dinamica a tensiunii pana la valoarea nou setata. Sa vedem cum poate fi implementata la sursa digitala, banuiesc ca este ceva asemanator circuitului amplificator simetric de putere. Pentru mine, modelul ideal in aceasta faza, este in poza, simplu si cu comenzi care se pot realiza, eventual as adauga surse fixe de +/-5V si +/-12V flotante. Click pentru marire. PS. Am transpus proiectul si codul si este functional, pentru PIC18F45K22, setat la 48MHz, care are 32K in loc de 8K. si acum sunt la faza de a adauga cat mai multe comenzi din cele prezente in sursa Siglent din poza. Cand voi fi multumit, de o varianta sigura si stabila il voi pune pe topic. @gsabac
  11. Zis si facut, rapid pe bradboard si functional, ati alergat de la idee la produsul experimental cu succes. Circuitele au iesit bine si remarc ca aveti tehnologie pentru trasee de circa 0,2mm, utila si pentru densitati mari de componente. Versiunea 3.03, la care am postat schema, este functionala pe simulatoare si are comenzi in plus, buton de ZERO la iesire si buton de REVENIRE. Deasemenea controlul tensiunii si curentului este digital iar protectia si limitarea de curent analogica. Tensiune 0-25V si curent 0-2A si se pot folosi radiatori cu 10-12 aripioare, neventilati, montati vertical la spatele sursei, cu dimensiuni de circa 200*100*50mm. Proiectele complete sunt in atasament, cu Proteus 8.7-SP3 sau mai sus si mikroC cred ca oricare versiune. @gsabac Sursa_PIC16F877_MCP4921-Versiunea 3.03.rar
  12. @aetius a realizat cu succes primele experimentari pe breadboard cu PIC-ul, afisajul si convertorii DAC din versiunea 1.04 si daca doreste, poate ne pune si noua o poza. Schema versiunii 1.04, cu modificarile necesare pentru o functionare mai buna si sigura in practica, descoperite de autorul topicului, revizia 1. Click pentru marire. Reamintesc ca versiunea 1.04 are control digital de tensiune si control analogic rapid pentru reglajul, pe modul de lucru, generator de curent. Deasemenea are controlul temperaturii cu ventilator comandat. Modificarile sunt: - alimentarea circuitului MCP1541 la 5V in loc de 12V; - alimentarea circuitului OP07 intre pinii 4 si 7, cu tensiune negativa de -5V in loc de 0V pe pinul 4. Pe simulari, experimentarile au evoluat in felul urmator: - 2.02 cu control digital al tensiunii si curentului si protectie rapida, sugerata de @informer, cu doua circuite DAC; - 3.03 modificarea conectarii senzorului de curent in serie cu sursa de alimentare, nu cu sarcina; Click pentru marire. - 4.02 introducerea comenzilor pentru setarea tensiunii si curentului de la o claviatura. Am scos protectia si controlul temperaturii deoarece PIC-ul a ajuns la limita si compilatorul indica eroarea "stack overflow" si la cateva rinduri de cod in plus. Deci este necesar un "ciocan" mai mare cu de la 16K la 128K • Linear Program Memory, de ex. PIC18F45K22, dar si o claviatura construita din butoane ergonomice. @gsabac
  13. Multumim pentru observatie, doar o mica neadvertenta, poate chiar o greseala si s-ar putea sa merga sau sa nu mearga. Codul l-am scris pentru PIC10F320 si intradevar PIC10F200 nu are comanda ANSELA, dar cine nu risca nu castiga si in acest caz o experimentare de catre cei interesati se face rapid si poate nu are riscuri, ramane de vazut. Am facut acest compromis datorita cunostintelor mele limitate si mediului mikroC care nu are suport pentru seria 10F2xx dar in MPLAB, pentru cine cunoaste, este suport complet pentru aceasta serie. @gsabac
  14. Daca aveti Proteus 8.7 SP3 decomprimati fisierul RAR si utilizati proiectul facut de mine., musai sa inlocuiti fisierul HEX cu acela din directorul decomprimat. De fapt Proteus schimba doar calea de cautare. Postat 12 ore în urmă pai exact asta am simulat si eu in proteus 8 ,schiema este cu pic10f200 si codul este cel care mi-lati facut pentru pic10f320 si cand dau start la simulare primesc eroarea Cred ca v-am explicat foarte clar, puneti in proiect 10F320 si schimbati numele in 10F200, ceea ce nu ati facut! Pe schema dvs. circuitul arata asa: Dar schema din proiect este diferita. Modificati si veti obtine rezultatele ca in proiect, adica un puls de 500mS la inchiderea intrerupatorului si un puls de 500 mS la deschiderea sa. Daca nu merge postati proiectul dvs. din Proteus, doar un singur fisier, ca sa vad ce ati facut. PS. Mai este ceva, utilizati o tensiune acceptata de 3.3V care este default in Proteus. @gsabac
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.