Elektroda.pl
Elektroda.pl
X
Serwerowe OpowieściSerwerowe Opowieści
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Skalowanie enkodera na mm w środowisku programistycznym

23 Maj 2010 17:50 2128 7
  • Poziom 20  
    Witam

    Mam pewne zadanie do wykonania a wiec sterowanie żaluzjami o to
    kod
    Code:
    '''
    
    #*===========================================================================*#
    #*                Copyright (c) 1997-2004 by miControl. All rights reserved. *#
    #* File     : mcDSA-A1 (can-dc-position controller-encoder).py               *#
    #*                                                                           *#
    #* Project  : Python for mPLC                                                *#
    #* System   : Python                                                         *#
    #* Version  : 1.00                                                           *#
    #* Company  : miControl                                                      *#
    #*                                                                           *#
    #* Author   : dariusz Parma (dP)  mailto:dp@miControl.de                     *#
    #* Date     : 29.01.2004                                                     *#
    #*===========================================================================*#
    #* Description:   mcDSA-A1 - DEMO                                            *#
    #*                                                                           *#
    #* This program configures the mcDSA-A1 Servo controller as follows:         *#
    #*                                                                           *#
    #* - interface:               CAN (miCan50 PC interface)                     *#
    #* - motortype:               DC motor (afflicted with brushes)              *#
    #* - numbers of motorpoles:   4                                              *#
    #* - Operation mode:          position controller                            *#
    #* - Refeeding of speed:      incl. encoder                                  *#
    #* - encoder resolution:      2000[count/rev] (Counts per revolution)        *#
    #* - speed:                   1000[rpm]       (Revolutions per minute)       *#
    #*                                                                           *#
    #*---------------------------------------------------------------------------*#
    #* History:                                                                  *#
    #*                                                                           *#
    #*===========================================================================*#
    '''
    from mc.dsa import *             # to import the module mc.dsa with it's class DSA
    import time                      # to import module time
    import Gnuplot                   # importujemy funkcje rysujaca wykres

    d = Dsa(127)                       # Node-Id = 1, CAN interface

    # pobranie wersji oprogramowania
    print "DSA firmware version =",  d.VersionSwString()

    # d to obiekt i dla niego deklarujemy parametry:
    d.Disable()                               # disable power stage
    d.ClrError()                              # erase potential errors
    d.DefaultParam()                          # set default parameter

    d.MotorTypeDC()                           # motortype          = DC
    d.VelFeedbackEnc()                        # refeeding          = encoder
    d.MotorEncResolution(2000)                # encoder resolution = 2000

    # MotorPolarity - Conformity of the direction of rotation and the direction of counts
    # of the hallsensors. Please adjust d.MotorPolarity(1) if the control circuit is uncontrolled
    # (the engine shaft rotates at max speed)
    d.MotorPolarity(0)

    d.ModeVPos()                              # Operation mode = position controller


    d.FctPosNotationIndex(0)
    time.sleep(2)                          # wait for 2 seconds

    d.FctControl(3)                           # activates Fct parameter (Factorgroup)
                                              # It converts the position units
                                              # in [rev]
                                              # (revolutions of the engine shaft

    d.Enable()                                # enable power stage
    d.ActPos(0)                               # Actual position = 0

    print d.FctPosScale([1,1])

    d.Vel(500)                               # adjust speed

    d.VelKp(10)
    d.VelKi(16)
    d.VelKd(0)

    print "VelKp =", d.VelKp()
    print "VelKi =", d.VelKi()
    print "VelKd =", d.VelKd()


    d.Movr(200)

    Wykr=Gnuplot.Gnuplot()
    time.clock()           # czas od momentu uruchomienia procesu
       
    Wykr.title("zaluzje")
    Wykr.xlabel("czas [s]")
    Wykr.ylabel("pozycja [mm]")
    x = ["d.ActPos()"]
    y = ["time.clock()"]
    Wykr.plot[0:1500]("x") 
    Wykr.plot[0:1500]("y")
    Wykr.hardcopy("wykres_w_przod.jpg")



    while (d.DinP0()==0):
          time.sleep(0.001)
          print "Actual position =", d.ActPos(), "( in counts =", d.ActPos_cnt(),")"

    d.Disable()
    print "Reached starting position"
    d.ActPos(0)                               # Actual position = 0

    d.Vel(500)                               # adjust speed

    d.VelKp(50)
    d.VelKi(500)
    d.VelKd(0)

    print "VelKp =", d.VelKp()
    print "VelKi =", d.VelKi()
    print "VelKd =", d.VelKd()

    # every x seconds measure
    timeout = 0.1

    d.Enable()                                # enable power stage
    d.Mova(-30)                             # move to position 10 (relatively)

    for n in range(100):                               # neverending loop
       # output to screen
       print "Actual position =", d.ActPos(), "( in counts =", d.ActPos_cnt(),")"
       print d.Ain(0), "mV"
       print "P0=", d.DinP0()

       time.sleep(timeout)
       Wykr=Gnuplot.Gnuplot()
       time.time()
       
       Wykr.title("zaluzje")
       Wykr.xlabel("czas [s]")
       Wykr.ylabel("pozycja[mm]")
       x = ["d.ActPos()"]
       y = ["time.clock()"]  # czas od momentu uruchomienia procesu
       Wykr.plot[0:1500]("x") 
       Wykr.plot[0:1500]("y")
       Wykr.hardcopy("wykres_powrot.jpg")


    Mój problem jest następujący że, chciałbym zamiast liniowego wykresu który się rysuje (2 sztuki ponieważ ruch jest w przód i w tył) chciałbym przeskalować enkoder o rozdzielczości 2000 (zapisane w kodzie) na mm tzn. jeśli zadam sobie że, chce przesterować silnikiem o 5 cm w prawo albo w lewo to mam na wykresie to że w czasie 20 s od uruchomienia procesu to silniczek przejechał ta odległość.
    Pozdrawiam

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • Serwerowe OpowieściSerwerowe Opowieści
  • Pomocny post
    Poziom 25  
    Witam,

    nic prostrzego, musisz znać średnią średnice wałka na który nawija się sznurek podciągający żaluzje, obliczyć z tego obwód (razy PI ;) ) to pomnożyć przez rozdzielczość enkodera i będziesz wiedział o ile przesuną się żaluzje na jeden impuls z endcorera. Odpowiednio zmodyfikować kod i gotowe.

    Pozdrawiam,
    GSM
  • Serwerowe OpowieściSerwerowe Opowieści
  • Poziom 20  
    GSM napisał:
    Witam,

    nic prostrzego, musisz znać średnią średnice wałka na który nawija się sznurek podciągający żaluzje, obliczyć z tego obwód (razy PI ;) ) to pomnożyć przez rozdzielczość enkodera i będziesz wiedział o ile przesuną się żaluzje na jeden impuls z endcorera. Odpowiednio zmodyfikować kod i gotowe.

    Pozdrawiam,
    GSM


    Witam

    wiec tak wałek to tak naprawdę to jest elektryczna szpilka taka jak do montażu elektrycznego nie mierzyłem ale wyglądała mi na fi 6 aktualnie jest to odczytywana tylko pozycja i podstawiona jako zmienna wiec trzeba stworzyć klasę funkcje licząca 6*pi*2000 i potem podstawić to jako zmienna na wykresie jak się gdzieś myle to prosił bym o korekcje punkciki już lądują na twoje konto

    Pozdrawiam
  • Poziom 25  
    Pamiętaj jeszcze o tym, że gdy materiał nawija się na wałek jego średnica rośnie, materiał z którego się robi rolety jest dość gruby, a szczególnie przy małym fi wałka będzie to dość duży błąd wprowadzało. Wystarczy po każdym obrocie do średnicy wałka dodawać 2 grubości materiału - to tak zgrubnie, ale wystarczające do takich zastosowań.

    Pozdrawiam,
    GSM
  • Poziom 20  
    GSM napisał:
    Pamiętaj jeszcze o tym, że gdy materiał nawija się na wałek jego średnica rośnie, materiał z którego się robi rolety jest dość gruby, a szczególnie przy małym fi wałka będzie to dość duży błąd wprowadzało. Wystarczy po każdym obrocie do średnicy wałka dodawać 2 grubości materiału - to tak zgrubnie, ale wystarczające do takich zastosowań.

    Pozdrawiam,
    GSM


    Witam

    Nie musze uwzgledniać grubości nawijanego materiału ponieważ nie jest to fizyczny model(tzn nie nawija się tam zaden materiał tylko obraca się się szpilka wokól swojej osi dołączam pogladowy schemat na to stanowisko w laboratorium.
    Skalowanie enkodera na mm w środowisku programistycznym

    Pozdrawiam
  • Poziom 25  
    Aaa, jasne. Karetka z nakrętką porusza się po nagwintowanej szpilce. To zamiast obwodu szpilki trzeba uwzględnić przy skalowaniu skok gwintu - o ile się przesunie karetka po jednym obrocie dla gwintu o fi=6 z reguły skok wynosi 1mm.
    Czy są jeszcze jakieś problemy? Bo jak nie to temat można zamknąć.

    Pozdrawiam,
    GSM
  • Poziom 20  
    GSM napisał:
    Aaa, jasne. Karetka z nakrętką porusza się po nagwintowanej szpilce. To zamiast obwodu szpilki trzeba uwzględnić przy skalowaniu skok gwintu - o ile się przesunie karetka po jednym obrocie dla gwintu o fi=6 z reguły skok wynosi 1mm.
    Czy są jeszcze jakieś problemy? Bo jak nie to temat można zamknąć.

    Pozdrawiam,
    GSM


    Witam

    No teraz to juz sensowniej to wydzodzi zamiast pi( 1 mm) i pewnie bedzie ok
    Innych problemów nie ma to tylko do przeslanego kodu na maila musze podstawic 1 mm zamiast pi i bedzie wszystko ok innych problemow nie zauwazylem.
    No chyba że czegoś nie widze.
    czyli teraz bedzie to postac 6*1*2000
    Temat zamkniety

    Pozdrawiam GSM dziekuje za pomoc
  • Poziom 25  
    pawel_konin napisał:
    (...)
    czyli teraz bedzie to postac 6*1*2000


    Raczej 1*2000 [1mm/2000impulsów], w takiej konfiguracji sprzętowej średnica szpilki nie ma znaczenia, tylko skok gwintu.

    Pozdrawiam,
    GSM