Jump to content
gsabac

Frecven?a maxim? a unui osciloscop USB+HID cu PIC18F2550

Recommended Posts

Sunt multe proiecte de osciloscop cu PIC, unele cu LCD altele cu afi?are ?i control din PC.

Primul poate fi portabil, miniatur?, u?or de manipulat ?i alimentat din baterii. Al doilea tip poate

 fi mult mai complex datorit? puterii de calcul ?i facilitatilor din mediile de programare,

Visual C++, Visual C# sau Visual Basic.

Pentru ?nceput o schem? simpl? cu PIC18F4550 ?i un LCD de 240 pe 120 de pixeli.

  post-24607-0-09539700-1500644599_thumb.png

Aceste tipuri de osciloscoape erau in voga acum 8-10 ani si se faceau bani buni pe proiecte

 sau chituri, in prezent softul si circuitele pot interesa pe cei care doresc sa invete programare,

 sau pe cei care doresc vizualizari de frecvente joase, audio, cardiograf, encefalograf, auto, etc.

Softul complet, functional este in atasament. Se foloseste pentru simulare MikroC si Proteus 8.

 

Simulare placuta !

 

@gsabac

3 Osciloscop mikroC si Proteus LCD240-120 functional.zip

  • Like 2

Share this post


Link to post
Share on other sites

Dupa cum am aratat in prima postare, interesul este softul si circuitele care pot interesa pe cei care doresc sa invete programare,

 sau pe cei care doresc vizualizari de frecvente joase, audio, cardiograf, encefalograf, auto, etc.

Mi-am propus, ca pe parcursul postarilor, sa arat cum se folosesc setarile uC-ului la bit,

 pentru conversii ADC (Analog Digital Convertor) optimale, dar si cum sa se realizeze practic

 comanda bidirectionala USB-HID (Human Interface Device) dintre PIC si PC.

Rezultatul este proiectul unui osciloscop virtual care arata asa:

  post-24607-0-25944600-1500788760_thumb.png

 

Raspunsul sec este 25 KHz si provine din frecventa maxima de esantionare de circa 60KHz cu 10 biti.

 

@gsabac

Edited by gsabac
  • Like 1

Share this post


Link to post
Share on other sites

Microcontrolerele PIC18Fx4550 au inclus un convertor analog digital (ADC) si un numar de 10(13)
intrari ce pot fi selectate pentru a fi esantionate cu 10 biti (zecimal maxim 1023) ca in poza.
Aceste valori asigura o deplasare verticala la un osciloscop de circa +/- 500pixeli,
deci o imagine exceptionala. Pe orizontala, in formatul 10/8 cm ar rezulta 625 de pixeli.

  post-24607-0-15986000-1501045622_thumb.png

PIC18Fx4550 are 5 registre pentru configurarea modulului ADC (Analog Digital Convertor)
-   (ADRESH) pentru rezultatul High Register 8 biti
-   (ADRESL)  pentru rezultatul Low Register  8 biti
-   (ADCON0) Registru de control 0, 8 biti
-   (ADCON1) Registru de control 1, 8 biti
-   (ADCON2) Registru de control 2, 8 biti
Registrul  ADCON0  controleaza operatiile Analog/Digitale,
ADCON1 configureaza functiile pinilor de porturi
ADCON2 configureaza sursa clock-ului A/D, timpul de achizitie si justificarea (aranjarea HIGH si LOW)

Setari generale pentru functionarea ADC-ului
  CMCON  = CMCON or 7                  ' Deconecteaza comparatorii
  TRISA=0xFF                                    ' pinii PORTA sunt intrari, se poate extinde si la PORTB,etc

Selectarea unui canal ADC prin intermediul registrilor
  La initializare se aduc toti registrii la zero, setari implicite iar in mikroBasic numerele binare incep cu %
  ADCON0 = %00000001                  'canal 0 RA0       selectia canalului ADC
  ADCON0=  %00000101                  ?canal 1 RA1
  ADCON0 = %00001101                  'canal 3 RA3
  ADCON0 = %00001001                  ?canal 4 RA4, etc

  ADCON1 = %XXXXXXXX                    ?registru de control , 8 biti

 

ADCON2.ADFM=1                          ? bit 7  1 = justificare dreapta. HIGH(000000XX) & LOW(XXXXXXXX)
  ADCON2                                         ? bit 6         nu este implementat
  ADCON2.ACQT0=0,1                     ? bit 5
  ADCON2.ACQT1=0,1                     ? bit 4
  ADCON2.ACQT2=0,1                     ? bit 3
  ADCON2.ADCS0=0,1                     ? bit 2
  ADCON2.ADCS1=0,1                     ? bit 1
  ADCON2.ADCS2=0,1                     ? bit 0
  ADCON2= %1XXXXXXX                ? model de setarea tuturor bitilor simultan

Pentru extragerea numerica a unui esantion MikroBasic dispune de 3 functii dedicate:
- ADC_Get_Sample(canal) 
- ADRESH si ADRESL
- ADC_Read(canal), unde "canal? este numarul canalului de la 0 la 10 sau 0 la 13.
Acestea se folosesc in modul urmator:
*********Functia de esantionaare ADC_Get_Sample(canal)  extrage o valoare pe 10 biti ******
  ADCON0.ADON = 1                                     'deschide ADC
  ADC_Init()                                                     ?initializeaza ADC
  ADCON0 = %00000001                                ' selectia intrarii RA0 de ex. si conectarea ei la ADC
               ADCON0.GO_DONE = 1                 'start ADC pentru ADC_Get_Sample(0)
               Intirziere fixa sau variabila pina la  ADCON0.GO_DONE = 0
               adcVal =  ADC_Get_Sample(0)
******Functia de esantionare ADRESH si ADRESL rezulta doua valori pe 8 biti************
  ADCON0.ADON = 1                                    'start ADC pentru ADC_Get_Sample(0)
  ADC_Init()                                                    ?initializeaza ADC        
  ADCON0 = %00000001                               ' selectia intrarii RA0 de ex. si conectarea ei la ADC
               ADCON0.GO_DONE = 1                'start esantionare pentru ADRESH si ADRESL
               Intirziere fixa sau variabila pina la   ADCON0.GO_DONE = 0
               writebuff=ADRESH
               writebuff[i+1]=ADRESL               'adread = (ADC_get_sample(0)/4)   '(ADC_Read(0)/4 )

***********************Functia de esantionare ADC_Read(canal) da o valoare pe 10 biti*********
    adcVal=ADC_Read(canal)  automat citeste canalul si nu are nevoie de setarea ADC_Init()
In cazul unui osciloscop se achizitioneaza rapid un 964 de esantioane, apoi se transmit spre afisare.
'******************** acumuleaza datele RA0 in doua variabile ********
        for i=1 to 964 step 2                      
               ADCON0.GO_DONE = 1                   'start ADC
                for j=1 to nCicle                                 ?intirzierea constanta ncicle=6 valoare minima
                next j
               writebuff=ADRESH
               writebuff[i+1]=ADRESL  
        next i
Concatenarea ADRESH & ADRESL da valoarea esantionului sau alternativ ADRESH*256 + ADRESL

 

@gsabac

Edited by gsabac
  • Like 1

Share this post


Link to post
Share on other sites

Cea mai complexa parte a unui osciloscop este blocul de sincronizare.
La acest model am ales o sincronizare de tipul soft implementata la PIC.
In poza este aratata metoda:
Click pentru marire.

  post-24607-0-13012900-1502645050_thumb.png

Dupa startul canalului CH1 si citeva esantioane neglijate, se cauta 2 secvente succesive intre care
sa se afle nivelul de sincronizare. Acest nivel este transmis de la PC la PIC la fiecare inceput de baleaj.
In acest moment se trece la achizitia propriuzisa prin instructiunea de salt ?break? apoi urmeaza

 transmisia USB si afisarea pe ecran.
Codul in mikroBasic este urmatorul:
'****************** sincronizare soft si secventa de start pentru achizitie ************
         ADCON0 = %00000001                    ' selactarea canalului RA0
         sincroCH1=0
         for i=1 to 465                                     'sincronizarea pentru achizitionarea canalului CH1
             ADCON0.GO_DONE = 1               'start ADC pentru ADC_Get_Sample(0)
               adcVal =  ADC_Get_Sample(0)
               if i > 3 then
                 select case sensSincro                 ' 0 front pozitiv 1 front negativ
                  case 0
                    If (adcVtmp <= Vsincro) and (adcVal >= Vsincro) then   'front pozitiv
                     sincroCH1=1
                     break
                    end if
                  case 1
                    If (adcVtmp >= Vsincro) and (adcVal <= Vsincro) then    'front negativ
                      sincroCH1=1
                      break
                    end if
                 end select
               end if
               adcVtmp = adcVal
         next i
'******************** acumuleaza datele RA0 in doua variabile si le transmite la PC ********
        for i=1 to 964 step 2                       ?achizitionarea datelor PCM se face in 2 locatii consecutive
               ADCON0.GO_DONE = 1          'start ADC selectat mai inainte drept RA0
                for j=1 to nCicle
                next j
               writebuff=ADRESH
               writebuff[i+1]=ADRESL              
        next i
In acelasi mod se procedeaza si cu canalul CH2.

 

@gsabac

 

  • Like 2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We use cookies and related technologies to improve your experience on this website to give you personalized content and ads, and to analyze the traffic and audience of your website. Before continuing to browse www.tehnium-azi.ro, please agree to: Terms of Use.