DIY DRO

Aloittaja jussi, 15.05.11 - klo:20:57

« edellinen - seuraava »

0 Jäsenet ja 3 Vieraat katselee tätä aihetta.

jussi

Tässä olis nyt ihmeteltäväksi jos jotain kiinnostaa.


/* This file has been prepared for Doxygen automatic documentation generation. */
/*! \file *********************************************************************
*
* \brief The XMEGA Quadrature Decoder example source code.
*
*      This file contains example code that demonstrate the quadrature
*      decoder. It shows how to set up the event system and the Timer/Counter
*      to decode the angle of rotation from a quadrature encoder.
*
* \par Application note:
*      AVR1600: Using the XMEGA Quadrature Decoder

*****************************************************************************/
#include <stdio.h>
#include <util/delay.h>
#include "avr_compiler.h"
#include "qdec_driver.h"
#include "lcd.h"

bool    dir  = 0;
int TIMER_valuex = 0;
int TIMER_valuey = 0;
int TIMER_valuez = 0;
uint16_t lineCount = 0 ;
uint8_t DIR;
/*
*  Hardware setup:X
*   - PC0 - QDPH0
*   - PC1 - QDPH90
*   - PC2 - QDINDX
*  Hardware setup:Y
*   - PD0 - QDPH0
*   - PD1 - QDPH90
*   - PD2 - QDINDX
*  Hardware setup:Z
*   - PE0 - QDPH0
*   - PE1 - QDPH90
*   - PE2 - QDINDX
*
*  Peripherals used:
*   - PORTD[2:0] signal input.
*   - Event channel 0: quadrature signal.
*   - Event channel 1: index signal.
*   - TCC0: Quadrature counter.
*/
int main( void )
{
 
   /* Setup PORTD with pin 0 as input for QDPH0, dont invert IO pins.
    *
    * Setup event channel 0, pin 0 on PORTD as input, don't enable index.
    * if index used then state 00 is set as the index reset state.
    *
    * Setup TCC0 with Event channel 0 and lineCount.
    */
   
   
   QDEC_Total_Setup(&PORTC,                    /*PORT_t * qPort*/              //    Qdec laskureiden XYZ asetukset
                    0,                         /*uint8_t qPin*/ 
                    false,                     /*bool invIO*/
                    0,                         /*uint8_t qEvMux*/
                    EVSYS_CHMUX_PORTC_PIN0_gc, /*EVSYS_CHMUX_t qPinInput*/
                    false,                     /*bool useIndex*/
                    EVSYS_QDIRM_00_gc,         /*EVSYS_QDIRM_t qIndexState*/
                    &TCC0,                     /*TC0_t * qTimer*/
                    TC_EVSEL_CH0_gc,           /*TC_EVSEL_t qEventChannel*/
                    lineCount);                /*uint8_t lineCount*/

    QDEC_Total_Setup(&PORTD,                    /*PORT_t * qPort*/
                    0,                         /*uint8_t qPin*/
                    false,                     /*bool invIO*/
                    2,                         /*uint8_t qEvMux*/
                    EVSYS_CHMUX_PORTD_PIN0_gc, /*EVSYS_CHMUX_t qPinInput*/
                    false,                     /*bool useIndex*/
                    EVSYS_QDIRM_00_gc,         /*EVSYS_QDIRM_t qIndexState*/
                    &TCD0,                     /*TC0_t * qTimer*/
                    TC_EVSEL_CH2_gc,           /*TC_EVSEL_t qEventChannel*/
                    lineCount);                /*uint8_t lineCount*/

    QDEC_Total_Setup(&PORTE,                    /*PORT_t * qPort*/
                    0,                         /*uint8_t qPin*/
                    false,                     /*bool invIO*/
                    4,                         /*uint8_t qEvMux*/
                    EVSYS_CHMUX_PORTE_PIN0_gc, /*EVSYS_CHMUX_t qPinInput*/
                    false,                     /*bool useIndex*/
                    EVSYS_QDIRM_00_gc,         /*EVSYS_QDIRM_t qIndexState*/
                    &TCE0,                     /*TC0_t * qTimer*/
                    TC_EVSEL_CH4_gc,           /*TC_EVSEL_t qEventChannel*/
                    lineCount);                /*uint8_t lineCount*/

   long int murtox = 0;
   unsigned int murto2x = 0;
   long int long_T_valuex = 0;
   int high_valuex = 0;
   unsigned int low_valuex = 0;

   long int murtoy = 0;
   unsigned int murto2y = 0;
   long int long_T_valuey = 0;
   int high_valuey = 0;
   unsigned int low_valuey = 0;

   long int murtoz = 0;
   unsigned int murto2z = 0;
   long int long_T_valuez = 0;
   int high_valuez = 0;
   unsigned int low_valuez = 0;

    lcd_init(LCD_DISP_ON);
    lcd_clrscr();

   
   while (1) {
             
       
            TIMER_valuex=TCC0_CNT;                     //laskurimuuttujien päivitykset
            TIMER_valuey=TCD0_CNT;
            TIMER_valuez=TCE0_CNT;
   //********************************************************************************************//
            long_T_valuex = TIMER_valuex;
            long_T_valuex = long_T_valuex * 2774;     // kerroin 2774

            lcd_gotoxy(3,0);
            if (TIMER_valuex < 0)
            {
            lcd_putc('-');
            long_T_valuex = -long_T_valuex;
            }
             else
            lcd_putc('+');

              low_valuex = long_T_valuex & 0xffff;
            high_valuex = long_T_valuex >> 16;         // oikealle shiftaus
            murtox = low_valuex;
            murtox = murtox*100;
            murto2x = murtox >>16;
       
   //********************************************************************************************//
           
            long_T_valuey = TIMER_valuey;
            long_T_valuey = long_T_valuey * 2774;     // kerroin 2774

            lcd_gotoxy(3,1);
            if (TIMER_valuey < 0)
            {
            lcd_putc('-');
            long_T_valuey = -long_T_valuey;
            }
             else
            lcd_putc('+');

              low_valuey = long_T_valuey & 0xffff;
            high_valuey = long_T_valuey >> 16;         // oikealle shiftaus
            murtoy = low_valuey;
            murtoy = murtoy*100;
            murto2y = murtoy >>16;

   //********************************************************************************************//

            long_T_valuez = TIMER_valuez;
            long_T_valuez = long_T_valuez * 2774;     // kerroin 2774

            lcd_gotoxy(3,2);
            if (TIMER_valuez < 0)
            {
            lcd_putc('-');
            long_T_valuez = -long_T_valuez;
            }
             else
            lcd_putc('+');

              low_valuez = long_T_valuez & 0xffff;
            high_valuez = long_T_valuez >> 16;         // oikealle shiftaus
            murtoz = low_valuez;
            murtoz = murtoz*100;
            murto2z = murtoz >>16;
       
   //********************************************************************************************//     

            lcd_gotoxy(0,0);
         lcd_puts_P("X");
         lcd_gotoxy(4,0);                          
            PutNumber(high_valuex);                  //kokonaisluvun tulostus
            lcd_putc(0x2e);
            lcd_gotoxy(8,0);
            PutNumber2(murto2x);                     //murto-osan tulostus
  //********************************************************************************************// 
 
            lcd_gotoxy(0,1);
            lcd_puts_P("Y");
            lcd_gotoxy(4,1);
         PutNumber(high_valuey);                  //kokonaisluvun tulostus
         lcd_putc(0x2e);
            lcd_gotoxy(8,1);
            PutNumber2(murto2y);                     //murto-osan tulostus
  //********************************************************************************************// 
           
            lcd_gotoxy(0,2);
         lcd_puts_P("Z");
         lcd_gotoxy(4,2);                          
            PutNumber(high_valuez);                  //kokonaisluvun tulostus
            lcd_putc(0x2e);
            lcd_gotoxy(8,2);
            PutNumber2(murto2z);                     //murto-osan tulostus

  //********************************************************************************************// 

            _delay_ms(10);
            lcd_clrscr();
           

           DIR=QDEC_Get_Direction(&TCC0);              //laskurin suunta C0 X

         switch(DIR)
         {
              case 1:
             
               lcd_gotoxy(14,0);
                lcd_puts_P("->");
               break;
            case 0:
             
               lcd_gotoxy(12,0);
               lcd_puts_P("<- ");
            break;

         }

         DIR=QDEC_Get_Direction(&TCD0);              //laskurin suunta D0 Y

         switch(DIR)
         {
              case 1:
             
               lcd_gotoxy(14,1);
                lcd_puts_P("->");
               break;
            case 0:
             
               lcd_gotoxy(12,1);
               lcd_puts_P("<- ");
            break;

         }


         DIR=QDEC_Get_Direction(&TCE0);              //laskurin suunta E0 Z

         switch(DIR)
         {
              case 1:
             
               lcd_gotoxy(14,2);
                lcd_puts_P("->");
               break;
            case 0:
             
               lcd_gotoxy(12,2);
               lcd_puts_P("<- ");
            break;

         }


   }
}





jussi

Vähän edistystä tähänkin rojektiin. Nyt näyttö pelaa ja näyttää kaikki 3 akselia
osat on kaikki. pitää vaan viimeistellä ja tiivistellä jotenkin nuo mittasauvat

jussi

#17
Taitaa tämäkin valmistua. ensimmäinen encoderi kiinni koneessa. ja näyttää vieläpä oikein. :)  Vielä vois koittaa tuota glcd:n kirjastoa tutkia jos sais tehtyä isommat fontit.

jussi

Jyrsin käytössä noi digitaalit on kyllä mahtavat. Nyt kun täälläkin on ollut puhetta noista sorvin digeistä ajattelin tehdä tuohon pikkusorviinkin nuo digit.
noissa "oikessa" kun on noita muistpaikkoja. onko niille mitään käyttöä jos ei ole pikavaihtoteriä??. ajattelin ,että pärjäis R/D vaihto ja mitatun lukeman syöttö 4x3 näppäinmatriisilla. ja tietysti nollausnapit

pomit

ni millaista tuo teippi on?
harkitsitko tämän toteutusta arduinolla ?

jyrki.j.koivisto

Kerran kävi mielessä etsata noita digitaalitönäreissä olevaa liuskaa (teipin alla piilossa), saisi sen pituisia kuin haluaisi. Rakenteeltaanhan se liuska on melko yksinkertainen. Ajattelin jollain pikku moottorilla enkooderin ohjaamana pyörittää nauhaa ja stanssata maskia... Jos ymmärsin tuon digitaalitönärin toiminnan oikein niin siinä mitataan kapasitiivisesti tiheämmällä kammalla tuota liuskaa ja saadaan ilmeisesti siniaaltoprofiililla lukemat näistä mittapään antureista, pienet poikkeamat suodattuu kun näistä aina yksi on kapasitiivisempi kuin muut ja lukemat keskiarvoistetaan. Tuossa saattaisi toimia jokin muukin rakenne kuin etsattu liuska, esim 1mm korkeita ja sopivan levyisiä paloja jos liimasi, vaihtelis materiaalia aina palikoitten välissä (alumiini/kupari ja muovi/lasikuitu) Joo, mulla on liikaa aikaa...

Alpha12


miksi suotta kapasitiivisesti mittaamaan?
tulostaa suoraan tarkalla tulostimella vaikka kalvolle tai muulle kestävälle matskulle tämmönen, laittaa 2 optista lukupäätä niin saadaan 4 bittiä mittadataa jota voi vertailla 2bit/2bit.
perus laserit tulostaa vähintään 600x600dpi (600 pistettä tuumalla) joten jos lukupää vain pystyy lukemaan vaikka yhtä pistettä niin mittatarkkuuden saa tulostamalla 0.001 tuumaa?

kunhan näin lauantai tärinöissä funtsailen  ;D

a12

jussi

Tuo 600dpi encoderinauha on niin halpaa ettei paljon kannata ite tulostella. Noilla pääsee tosiaan "vaan" 4 satkun tarkkuuteen.
Digitönärin stripin syövyttäminen oli mullakin mielessä. en vaan keksinyt miten sen jaon mittais luotettavasti.Luultavasti se on joku piirilevyn suunitteluohjeman vakio mitta.
ja noista tönäreistä saa sarjadatan ulos.
Xmegaa käytän noihin, koska niissä on rautatasolla hoidettu tuo encoderin luku. Saattaa löytyä jo arduinoistakin tuota xmegaa

jussi

No niin pitihän sitä sitten alkaa jalostamaan :)
kuvan mukainen lukija ja 80 cm encoder nauha. Nyt on sitten satkun tarkkuus. Ja periaatteessa mittaan 999.99 asti mahdollinen, kun laittaa tuota nauhaa lisää toisen perään. sen jälkeen laskuri pyörähtää ympäri.Nyt vaan pitää alkaa kokeileen sarjadataa tuosta ottaan ulos xmegalle ja tulostaa isompaan näyttöön.

Stoppari

Eikä kestä leikkuunestettä.... ::)

jussi

#25
No eihän sitä noin ole tarkoituskaan asentaa koteloinnistahan se kii on. sen voi vaikka valaa epoksiin kun noita nappeja ja näyttöä ei tarvi käyttää. ne voi vaikka irrottaa tuosta.
Muok.  Tuo encoderinauha on lasikuitua ja kuparia ja lakka päällä ja voi senkin suojata niinkun tavallisen digitönärin.

Tapani Honkanen

Keskuudessamme  taitaa olla valtaosa ihmisiä, joiden taidoilla ei synny tuollaisia diginäyttöjä joita "jussikin"tuossa esittelee. Itse on osaa mitään mutta haluaisin silti hyötyä tuollaisesta mahdollisuudesta että taitajat suuntaisivat potentiaalinsa hetkeksi tuollaisen "tee se itse" diginäyttölaitteen kehittämiseen. Olen katsellut käytettyjä laitteita mutta vähissä on ja ikivanhoista ei rohkene maksaa puolta uusien hinnoista. Kun uudetkin maksaa kiinanmalleinakin itse ulkomailta tilattuna aika paljon, niin heräsi ajatus kokeilla yhteisömme terävän pään voimavarojen yhdistämistä kehittääkseen halvan ja kuitenkin toimivan diginäytön. Toisessa jyrsinkoneessani (bridgeport) on näytöt kahdelle akselille mutta yleisjyrsinkone ja moposorvi huutavat näyttöjä. Olen jo tuhlannut varallisuutta kohtuuttomasti työkalujen ostoon. Ilman niitäkään ei lastua synny. En varsinaisesti ole köyhä mutta tulorajoitteinen eläkeläinen kuitenkin, joten tuollainen halpaversio kiinnostaisi.

jyrki.j.koivisto

#27
Hommasitko jostain tuota irtoliuskaa? Tuo lukupää menee melko pieneen tilaan, siitä voi surutta poistaa näytön, nappulat ja patterin, syöttö sitten näytöstä. Jyrsii pienen alumiini latan ja epoksoi sinne, anturankin voinee päällystää ohuen ohuella hartsikeroksella.

jussi

#28
LainaaTuo lukupää menee melko pieneen tilaan, siitä voi surutta poistaa näytön, nappulat ja patterin, syöttö sitten näytöstä. Jyrsii pienen alumiini latan ja epoksoi sinne, anturankin voinee päällystää ohuen ohuella hartsikeroksella

Lainasin tuon kun se on lähes ajatusten lukua :) noin sen juuri toteutan.
http://www.machine-dro.co.uk/ Tuossa linkki mistä saa liuskaa ja lukupäätä. Eikä hinta huimaa 27€ rahteineen.Taaskaan ei voi kun ihmetellä kotimaista hinnoittelua. Tämä tuli lontoon pohjoispuolelta tampereelle noin 3€ postikuluilla. Verrokkina juuri laitoin pienemmän ja kevyemmän paketin helsinkiin itellalla 7.20€ Pakollinen avautuminen aiheesta.;D

jussi

Tuostä näytöstä tuli mieleeni,että varmaan helpoin tapa saada isompaa numeroa olisi laittaa 7 sekmentti näyttöjä.
Ei vaan viittis alkaa askarteleen.Eli tietääkö kukaan onko olemassa noita 7 sekmenttinäyttöjä missä olis ajuripiirit integroitu. pikainen googletus ei vielä tuottanut tulosta.

Powered by EzPortal
SMF spam blocked by CleanTalk