Hjælp til signal konvertering (Læst 6430x)

Offline Henrik R

  • Modstanden
  • **
  • Indlæg: 21
  • Antal brugbare Indlæg: 0
    • Vis profil
Hjælp til signal konvertering
« Dato: September 14, 2011, 12:09:13 »
Jeg skal have konverteret et encoder signal om fra 11μApp (ca 1Vpp "savtakket") til 5Vpp square wave quadrature signal.

Det er til min gamle CNC fræser som har Heidenhain linear encoderer til position givning (google:"linear encoder ls-303").

Jeg har snakket med nogen der siger at jeg skal bruge en OP amp kreds, Men jeg har kun meget dårlig grundlæggende viden om de der trekanter :(

jeg har fået foreslået at bruge en RC4157 kreds "High Performance Quad Operational Amplifier", men disse er åbenbart meget dyre og svære at få fat i.
Kan i øvrigt nøjes med en "Dual" version da hver encoder har 2 signal 90grader forskudt som skal konverteres.

Signalet skal herefter sendes til en PIC kreds.

Men er der en der kan hjælpe mig med at lave et diagram over konverterings kredsløbet eller anbefale evt en anden og billigere OP-amp ?
Jeg bruger iøvrigt Eagle. ;)

MVH
Henrik

 

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #1 Dato: September 15, 2011, 02:18:51 »
Jeg skal have konverteret et encoder signal om fra 11μApp (ca 1Vpp "savtakket") til 5Vpp square wave quadrature signal.

Har du prøvet med en transistor og nogle modstande ? :)

Citér
Jeg har snakket med nogen der siger at jeg skal bruge en OP amp kreds, Men jeg har kun meget dårlig grundlæggende viden om de der trekanter :(

Jeg er heller ikke ferm til dem, men det nemmeste er at finde en OpAmp du mener kan bruges, derefter åbn dens datablad. Et stykke nede finder du garanteret et "application circuit", som du kan kopiere direkte ind i dit diagram.

Citér
jeg har fået foreslået at bruge en RC4157 kreds "High Performance Quad Operational Amplifier", men disse er åbenbart meget dyre og svære at få fat i.

OK, her er et rigtig godt tip, du aldrig bør glemme:
Gå ind på PC-Elektronik.dk og klik i søgefeltet i venstre top.
Dér skriver du IKKE RC4157, men RC 4157 (med mellemrum mellem bogstaver og tal).

Du skulle nu have et resultat der hedder ca. 10 kr. for sådan en OpAmp, hvilket jeg vil påstå er rimelig billigt. ;)

Derefter finder du et datasheet..
I Google's søgefelt skriver du følgende...
RC4157 filetype:pdf
...og søg.
Det allerførste resultat skulle gerne være et datablad, og det indeholder også nogle kredsløbseksempler.
Selvfølgelig ikke nøjagtigt det du skal bruge.
Kigger du på side 4 har du et meget simpelt kredsløb; vi kan gå ud fra at dette er en grundlæggende opstilling.

Jeg tror ikke du behøver noget der er så væmmelig indviklet; du skal jo bare have forstærket et signal.
Mit gæt er at næsten enhver OpAmp vil kunne gøre dette (det kommer selvfølgelig an på hvor præcist og hvor støjfrit det skal være.

Citér
Men er der en der kan hjælpe mig med at lave et diagram over konverterings kredsløbet eller anbefale evt en anden og billigere OP-amp ?
Jeg bruger iøvrigt Eagle. ;)

Hos PC-Elektronik finder du også en ganske kendt OpAmp, nemlig TL072 (Low Noise JFET-input OpAmp).
Når du alligevel køber en af de andre, så tag nogle stykker med på vejen; så har du lidt at øve med.
(husk igen at skrive TL 072 og ikke TL072 i PC-Elektronik's søgefelt).

Diagram-tegning kan jeg ikke klare; jeg bruger selv Osmond PCB til Mac.

... Søg igen med Google efter datablad på TL072:
TL072 filetype:pdf
På side 9 finder du lidt 'application circuits', der er mere på side 17 og 18.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #2 Dato: September 17, 2011, 06:26:01 »
... har kun meget dårlig grundlæggende viden om de der trekanter...

Jeg kom liiige forbi bogen OpAmps for everyone - den er skrevet af Texas Instruments. Det er muligvis noget for både dig og mig. ;)

 

Offline Henrik R

  • Modstanden
  • **
  • Indlæg: 21
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #3 Dato: September 18, 2011, 08:29:05 »
Tusind tak for svarene.
Det vil jeg da lige kigge på.
OG nej 10 kr er ikke det store, de priser jeg fandt var > 25$ + shipping 

 

Offline Henrik R

  • Modstanden
  • **
  • Indlæg: 21
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #4 Dato: Oktober 21, 2011, 22:11:38 »
Fik løst opgaven med LM301/LM201 comparator, tilsluttet en smith trigger.

Har dog fået at vide at jeg nok løber ind i støj problemer senere hen, når jeg får lavet motor styring til DC servo motorerne.

Henrik

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #5 Dato: Oktober 21, 2011, 23:12:33 »
Med støjproblemer, ved du om der da menes 'prel' ?

Hvis det er prel, er det ikke noget problem, for det kan løses med programmering.

Der er to forskellige modeller.

1: Et program, der ikke bruger interrupts. Dette program er lettest at forstå, men er ikke så godt til høje hastigheder.
2: Et interrupt-drevet program. Dette er som indirekte nævnt lidt sværere at forstå/overskue, da det er mere avanceret, men til gengæld er det mere robust.

Jeg kan kun fortælle om principperne, for jeg selv bruger AVR. Men det kan være at Kenn kan give nogle bedre tips, da han er PIC specialist. :)

Program-type 1:
1: Vent på at signalet fra encoderen ændrer tilstand (dvs. går fra høj til lav eller fra lav til høj).
2: Vent et forudbestemt antal millisekunder. Her bør vi have fat i noget lignende 5 millisekunder hvis encoderen drejer langsomt, men hvis encoderen giver mere end 200 pulser i sekundet, så bør du sætte tallet ned. Dette tal kan beregnes.
3: Se om tilstanden er den samme som i punkt 1. Ér den det, har vi fat i en gyldig værdi; altså en værdi vi stoler på, ellers er der tale om prel.

Ventetiden kan beregnes på denne måde:
ventetid = rund op((1000000 / (Maksimale antal pulser per sekund)) / 2) mikrosekunder

Fx. Hvis du har maks 3000 pulser per sekund: 1000000 / 3000 / 2 = 167 mikrosekunder

Et program-eksempel i C kunne være...

Kode:

uint8_t oldState;
uint8_t newState;

newState = 0;
oldState = newState;
while(1)
{
    while(newState == oldState)
    {
        newState = PORT_BITS & (1 << PIN_NUMBER);  /* read port value */
    }
    oldState = newState;
    wait_us(500);    /* max. 1000 pulses per second  */
    newState = PORT_BITS & (1 << PIN_NUMBER);  /* read port value */
    if(newState == oldState)
    {
        /* we have a new valid pin value, take appropriate action here */
    }
}

Interrupt-udgaven kan jeg ikke give et uddybende kode-eksempel på, for dér er PIC og AVR nok lidt for forskellige.
Men det går ud på at man kan sætte PIC'en op til at køre en interrupt-rutine, hver gang dit i/o-ben ændrer værdi.
I interruptet starter du så en timer, som tæller ned, og når den rammer 0, udføres et andet interrupt; et timer-interrupt..
Du sætter dette interrupt til kun at køre én gang, dvs. det må ikke repetere.
Når du kommer ind i timer-interruptet, har værdien af i/o-benet været den samme i hele den tid vi har ventet på at timer-interruptet udføres. Man behøver ikke at sammenligne værdier, fordi hvis ben-værdien havde ændret sig, ville timer-interruptet's nedtælling have startet forfra.
I timer-interruptet kan du derfor kopiere den nye i/o-ben værdi over i en variabel, så du kan undersøge værdien nærmere; du bør ikke aflæse i/o-benet direkte, men i stedet bør du kopiere den værdi du gemte fra det andet interrupt.


Kode:
void pinChanged()  /* this is an interrupt-routine, which should be invoked when the i/o-pin changes */
{
    newState = PORT_BITS & (1 << PIN_NUMBER);  /* there might be an even better way to read this value */
    /* set up oneShotTimer() to be invoked N microseconds from now, but only once. */
}

void oneShotTimer()  /* this is a timer interrupt-routine, that pinChange() sets up to be invoked when time runs out */
{
    pinState = newState;
    pulses++;  /* count the number of pulses total. */
    if(pinState)
    {
        /* pin went from low to high */
    }
    else
    {
        /* pin went from high to low */
    }
}

Bemærk: De viste kode-stumper er ikke udtømmende, for du har nemlig brug for to signaler (2 i/o-ben) til en encoder.
Har du 2 signaler, kan du se på mønstret, hvilken vej encoderen kører; om den kører forlæns eller baglæns.

Desuden kan jeg ikke afprøve om der er fejl i de nævnte kodstumper; så regn dem kun for at være forklarende skitser. :)

 

Offline Henrik R

  • Modstanden
  • **
  • Indlæg: 21
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #6 Dato: Oktober 31, 2011, 11:56:01 »
Tak Pacman for den uddybende forklaring.

Men støjen jeg tænker på er omkring comparatorne, at der kan gå så meget EMC ind at det terroriserer signalet.
Ang. Encoder indgangen på min PIC, så er det ikke noget problem da jeg bruger dsPic mcu med hardware quadrature tæller, som har error correction.

Én af mine største problemmer har dog været at konverterer min tæller værdi som er 16bit til 32bit, som også skal tage hensyn til op og ned tælning der ikke kun springer med 1+-. derefter skal værdien så sendes via 8 bit SPI bus til min master mcu som er tilsluttet en 128 x 64 pixel GLCD skærm.

Mit største mareridt ligger dog forude, hvor jeg skal have lavet en PID regulering iforhold til aktuel værdi og ønsket værdi. Jeg håber ikke det bliver så svært som frygtet.

PT kæmper jeg med IGBT gate driver til min DC servo motor styring  :o    men det beskriver jeg i tråd http://elektronik-forum.dk/index.php?topic=241.0

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: Hjælp til signal konvertering
« Svar #7 Dato: Oktober 31, 2011, 12:38:06 »
Men støjen jeg tænker på er omkring comparatorne, at der kan gå så meget EMC ind at det terroriserer signalet.
Ang. Encoder indgangen på min PIC, så er det ikke noget problem da jeg bruger dsPic mcu med hardware quadrature tæller, som har error correction.

Det kan nok være en god idé at lave en guard-ring omkring dit OpAmp indgangs-ben.
-Dvs. en GND ring hele vejen rundt om indgangsbenet.

Citér
Én af mine største problemmer har dog været at konverterer min tæller værdi som er 16bit til 32bit, som også skal tage hensyn til op og ned tælning der ikke kun springer med 1+-.

Konvertering fra 16-bit til 32-bit gøres ganske let...
Jeg går ud fra at værdien er 'signed', dvs. den kan være mellem -32768 og +32767.

Med C kan det gøres meget nemt:

Kode:
int32_t newValue;

newValue = (int16_t) oldValue;    /* the C-compiler automatically sign-extends this value */

Hvis du derimod bruger assembler, kan du kigge på den øverste bit (kaldet bit15). Hvis den er 1, så sæt de 2 højeste bytes til 0xff, ellers sæt de 2 højeste bytes til 0x00.

Citér
derefter skal værdien så sendes via 8 bit SPI bus til min master mcu som er tilsluttet en 128 x 64 pixel GLCD skærm.

Dette er desværre for hardware-specifikt til at jeg kan fortælle hvordan du bruger SPI. Men der skulle være mange eksempler på nettet, som du kan kigge på. Google efter 'PIC SPI', så burde du finde både eksempler på hvordan det gøres med SPI-interrupts og med 'manuel' byte-feeding.
Ang. display, er de fleste af den slags displays baseret på HD44780-driveren fra Hitachi.
Prøv at se HD44780 databladet på side 24, 28, 40-44 og 45/46 hvordan man 'snakker' med disse displays. Der er mulighed for at bruge 4-bit eller 8-bit, alt efter hvor mange I/O-ben du har til rådighed. Det er lettest med 8-bit, men det kræver 11 i/o-ben, hvorimod 4-bit kun kræver 7 i/o-ben.

Her er en Google-søgning efter PIC kode.

Citér
Mit største mareridt ligger dog forude, hvor jeg skal have lavet en PID regulering iforhold til aktuel værdi og ønsket værdi. Jeg håber ikke det bliver så svært som frygtet.

Her må jeg tilstå at jeg ikke ved hvad PID står for. Jeg  kender mange betydninger af forkortelsen, men ikke noget der er relateret til regulering.

Citér
PT kæmper jeg med IGBT gate driver til min DC servo motor styring

Lyder som noget kraftigt grej. :)
Uhm... Sendes frekvensen ikke med lavspænding/signalspænding på din servo-motor?

Citér
men det beskriver jeg i tråd http://elektronik-forum.dk/index.php?topic=241.0

Vidste du, at du kan skrive ...
(firkantparantes-start)url=web-adresse(firkantparantes-slut)beskrivelse af link(firkantparantes-start)/url(firkantparantes-slut) - så får du en klikbar link. :)
-Knappen med jordkloden og dokumentet indsætter dette, når du trykker på den.