Elektromotor en regelaars

Zolang de TS niks vrijgeeft over die machine kan ik daar niks op zeggen.
Ze kan er wel veel aan doen door lichte materialen te gebruiken, bv plastiekbuizen.

Veel ruimte heb ik niet om een ramp te maken omdat ik gebonden ben aan een 200µS cyclustijd en ik vraag mij ook af of de pause van 1.5mS (start ramp)zoveel verschil zal maken met 1mS (bij 1kHz base)?
Je moet wel binnen de 1sec starten en stoppen en volgens mij is die tijd te kort om een redelijk bruikbare ramp te maken die het verschil zal maken, ook al zou je zo'n ramp kunnen implementeren.

Maar wie zal het zeggen of het zal werken of niet?
Niets om mij druk over te maken ;)
LDmicro user.
Bij die 12V steppers van vroeger (die jij kennelijk in je opstelling hebt), werd toen gezegd dat je 300 steps per seconde kon doen en IETS meer als je een ramp-up/ramp-down deed. En minder als je hoge inertie had.

Maartegenwoordig haal je echt VEEL meer als je een echte ramp doet. Al is het maar heel kort. Waar een 3D printer "zoef" in 200ms o.i.d. van A naar B gaat, zit echt een complete ramp up ramp down.
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Als de ramp startfrequentie ook de basisfrequentie is, zie ik geen probleem ;)

edit: laat ons eens de praktisch kant van de zaak bekijken vooraleer in superlatieven te rekenen.

Rol transportdiameter 5cm = ~15cm omtrek wat gelijk zou staan aan 2tr/sec.
200 steps/tr * 2 = 400steps/s max

Impulstijd zou dan op 1/400 = 2.5mS ofte 400 Hz, dat is minder dan de helft van het voorbeeld, wat dan weer andere mogelijkheden schept.

Extra belasting door de folie is praktisch nihil en als je de motor rechtstreeks op de as monteert zijn de verliezen van de overbrenging ook weg en je gaat mij nu niet zeggen dat zo'n Nema motor met een goede driver dat niet aankan...kieper die dan maar in de container (en zeg mij waar ergens). ;)

En waarom geen 3.6° stepper?

Dus zonder meer info is het gissen voor iedereen!
LDmicro user.
Ik denk dat die folie toch wel een beetje strak gehouden moet worden, en de hele rol moet steeds versnelt en weer vertraagd worden. De TS komt misschien niet voor niets met die 2kg kracht aan.

Ik heb net even een stappenmotor (NEMA 23, een stap groter dan die van MGP als ik het goed zie) en driver aangesloten; zonder ramp-up komt ik niet betrouwbaar voorbij ongeveer 1250Hz, met ramps kan ik voorbij de 3000Hz komen zonder stappen te missen. Dit is allebei zonder mechanische belasting; die gaat beide grenzen natuurlijk fors omlaag trekken.
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Op 5 oktober 2018 11:12:16 schreef MGP:
Zoals beloofd een filmpje, het heeft meer tijd gekost om het 'bewijs' te leveren dan de opbouw ;)
Filmpje.

Leuk filmpje MGP. :)

@Lambiek, ik heb een kristal/resonator van 20Mhz van doen ;)
En je hebt alle tijd en voel je absoluut tot niets verplicht en als het niet gaat ook geen probleem hoor...

Eigenlijk hoef ik niets te maken, want ik heb het al. Dat filmpje wat ik laatst geplaatst heb, doet precies wat het moet doen.

Op 5 oktober 2018 14:39:51 schreef MGP:
En waarom geen 3.6° stepper?

Dat zou ik niet doen, die stappen zijn veel te groot, zeker met hele of halve stappen. Gewoon een 200 of een 400 staps hybride motor gebruiken, loopt veel mooier en veel rustiger.

Dus zonder meer info is het gissen voor iedereen!

We wachten af wat de TS er van vindt en denkt. :)

Op 5 oktober 2018 21:57:59 schreef SparkyGSX:
Ik denk dat die folie toch wel een beetje strak gehouden moet worden, en de hele rol moet steeds versnelt en weer vertraagd worden. De TS komt misschien niet voor niets met die 2kg kracht aan.

Ik denk ook dat we ons nog in de kracht die er nodig is vergissen, zeker als die folie ook nog een beetje kleeft.

Dit is allebei zonder mechanische belasting; die gaat beide grenzen natuurlijk fors omlaag trekken.

Je hebt soms meer koppel nodig dan je denkt.
Als je haar maar goed zit, GROETEN LAMBIEK.
Ik denk, zoals ik al eerder schreef, dat de TS de sturing beter zou kopen maar ik geloof niet dat ze kan inschatten wat ze nodig heeft, als ik al moeite heb ;)

@Lambiek, aangezien de TS niet meer reageert stop ik met dit project, alle testen worden uitgesteld en ga aan iets anders beginnen.

Het werkt en dan is de kick eraf...zo blijven we bezig :)
LDmicro user.
Lambiek

Special Member

Op 6 oktober 2018 11:07:55 schreef MGP:
....., alle testen worden uitgesteld en ga aan iets anders beginnen.

Ik ben helemaal niet nieuwsgierig hoor, maar wat ga je doen. :)
Als je haar maar goed zit, GROETEN LAMBIEK.
Heb uit de familie de vraag gekregen om een IR schietgame te maken.
Er loopt hier al een topic over maar wilde mij toen niet engageren.

Moet wel alles nog eens bekijken hoe moet werken.
Maw. hoeveel keren moet je geraakt worden voordat je het loodje legt (groen, geel, rood).
-Hoeveel groepen.
-Hoeveel schietkansen of "kogels".
-Schot per schot en/of automatisch en mogelijk nog andere dingen al of niet instelbaar.

Moest er iemand een link weten hoe dat normaal gezien werkt, geef maar door.

Eerst goed bedenken, als je weet wat je wilt is dat programmeren maar een paar uurtjes werk.

Edit: zal het drukpers programma wat aanpassen en compileren voor een F887 dat kun je toch eens proberen.
LDmicro user.
Lambiek

Special Member

Off topic:

Leuk project, ga het volgen als je een topic aanmaakt.
Als je haar maar goed zit, GROETEN LAMBIEK.
Hier heb je uw programma om eens te proberen als je goesting hebt ;)

Elke druk op de knop is 200steps erbij/eraf met een max van 8000 (40x200) zodat jij met uw motor juistgeteld 1 omwenteling hebt.

Het werkt met en zonder CA display en het onthoudt ook de laatste ingegeven stand.
De knoppen zijn autorepeat pas dus op als je lang drukt.

Er is een led toegevoegd die oplicht als de uitersten 8000 en 0 zijn bereikt wat goed is als je zonder display test.

pinbezetting met hetzelfde bovenstaand schema en 20MHz kristal/resonator!

Ledminmax = 30 (nieuw)

UP = 34
DWN = 35
Start = 33

display common anode
a = 19
b = 20
c = 21
d = 22
e = 27
f = 28
g = 29

digit1 = 15
digit2 = 16
digit3 = 17
digit4 = 18

Puls OUT = 26

Veel plezier :)
LDmicro user.
Lambiek

Special Member

Ik krijg alleen maar fouten, werkt dus niet op deze manier.

Ik heb hier ook LD-micro, misschien kun je het bestand van het ladder diagram sturen, dan compileer ik het hier wel.
Als je haar maar goed zit, GROETEN LAMBIEK.
Ik begrijp niet goed hoe jij fouten kunt krijgen van een gecompileerd programma, maar hier heb je de source als je er iets mee bent, heb er nog wat commentaar bijgeschreven.

Ik gebruik LDmicroV4420 omdat er volgens het forum nog kleine fouten in versie V4.4.3.0 staan maar het zou evengoed met de laatste versie moeten werken.
LDmicro user.
Lambiek

Special Member

Op 6 oktober 2018 17:20:27 schreef MGP:
Ik begrijp niet goed hoe jij fouten kunt krijgen van een gecompileerd programma,...

Ik kreeg een heel regiment aan fouten, waarschijnlijk omdat de klok op 20MHz stond, maar dat weet ik niet zeker.

Ik heb het met een paar ledjes getest en het werkt gedeeltelijk.

Alleen klopt dit niet bij mij.

Ledminmax = 30 (nieuw)

UP = 34
DWN = 35
Start = 33


Ledmimax doet het niet bij mij "uitgang RD7", Start doet het wel.
UP werkt hier op "ingang RB2", en DOWN zit hier op "ingang RB1". Dat lijkt dus omgedraaid.

En zo'n display heb ik niet. :)

EDIT:
Of loopt de UP/DOWN teller soms door en stop die niet op de hoogste en laagste waarde?
Als je haar maar goed zit, GROETEN LAMBIEK.
Het enige wat ik kan bedenken is dat uw eeprom geheugen niet leeg is en dan telt hij 200+x en komt hij nooit aan de 8000 of de 0.

Er zit nu een een lijntje bijgeprogrammeerd die de steps op 0 zet, je moet enkel eens pin 37 aan de GND leggen, dan zou de led moeten branden (op 0).

RBports zijn allemaal interne pullups.

Je moet ook een 20MHz kristal gebruiken anders werkt het ook niet want je moet al die instructies binnen de 200µS kunnen verwerken.

Bijgevoegd het aangepaste programma.

edit:

Op 6 oktober 2018 17:59:43 schreef Lambiek:

En zo'n display heb ik niet. :)..

Dat zou toch niet mogen voor een ouwe rat in 't vak, ik heb ze allebei CA en CC(zelfgemaakt) en kan dus alle kanten uit.
Maar om anderen te helpen gebruik ik liever makkelijk verkrijgbare modules.
Daarom schrijf ik er ook altijd bij, ik verkoop en verzend niks ;)

[Bericht gewijzigd door MGP op 6 oktober 2018 18:57:19 (29%)]

LDmicro user.
Lambiek

Special Member

Op 6 oktober 2018 18:47:14 schreef MGP:
RBports zijn allemaal interne pullups.

Aha, dat verklaart veel. Ik heb aan mijn poort-pinnen allemaal pull-down weerstanden van 10K zitten, zo is het board ontworpen en dat ga ik niet veranderen. Ik werk alleen met positieve signalen op de ingangen. :)

Je moet ook een 20MHz kristal gebruiken anders werkt het ook niet want je moet al die instructies binnen de 200µS kunnen verwerken.

Ik had de controller op 10MHz gezet en de cycle time op 0.4.

Ik ga er dus geen ander kristal op solderen. :)

Maar op het filmpje van jou hebben we gezien dat het werkt.
Als je haar maar goed zit, GROETEN LAMBIEK.
Als je een tekening ziet moet je dat ook zo doen, dat zou je toch ook al moeten weten. ;)

Maargoed, het werkt bij mij en ging bij u ook zeker werken.

edit: bij 10MHz en 0.4mS zou het ook moeten werken zij het dat de pulsen wat trager komen.
LDmicro user.
Lambiek

Special Member

Op 6 oktober 2018 19:33:17 schreef MGP:
Als je een tekening ziet moet je dat ook zo doen, dat zou je toch ook al moeten weten.

Ik heb die hele tekening over het hoofd gezien.
Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Op 5 oktober 2018 21:57:59 schreef SparkyGSX:
Ik heb net even een stappenmotor (NEMA 23, een stap groter dan die van MGP als ik het goed zie) en driver aangesloten; zonder ramp-up komt ik niet betrouwbaar voorbij ongeveer 1250Hz, met ramps kan ik voorbij de 3000Hz komen zonder stappen te missen. Dit is allebei zonder mechanische belasting.

Heb ook even een testje gedaan met een zelfgebouwde stappenmotordriver en een unipolaire stappenmotor, en ik kom met ramp-up en ramp-down op 2146Hz uit. Motor draait behoorlijk snel moet ik zeggen, gebruik halve stappen.

Document logic analyzer:

Als je haar maar goed zit, GROETEN LAMBIEK.
De uiteindelijke frequentie die je kunt halen is natuurlijk afhankelijk van de motor, driver, ingestelde stroom, voedingsspanning, etc. Ik kon serieus harder op 32V t.o.v. 12V, met dezelfde ingestelde stroom, omdat je met die hogere spanning de stroom sneller kunt opbouwen.

Met welke code heb je dat gedaan? Die van mij, of had je zelf iets geschreven? In dat laatste geval ben ik wel nieuwsgierig hoe jij het hebt gedaan.
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Ik heb de code zelf geschreven met Proton pic-basis. Ik heb grote moeite met c++, zal morgen in de loop van de dag de code posten.
Als je haar maar goed zit, GROETEN LAMBIEK.
@Lambiek: niet vloeken, het is C, geen C++. Ik dacht dat ik er genoeg commentaar bij geschreven had. Voor de registers moet je de datasheet lezen, en ik ga er vanuit dat je weet hoe interrupts werken. Het heeft echt grote voordelen om C te leren, voornamelijk dat je daarmee voor elke denkbare microcontroller kunt programmeren.

[Bericht gewijzigd door SparkyGSX op 8 oktober 2018 22:53:42 (24%)]

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Op 8 oktober 2018 22:50:45 schreef SparkyGSX:
@Lambiek: niet vloeken, het is C, geen C++.

O sorry. :) Maar zoals ik al zei, ik ben geen C man.

Voor de registers moet je de datasheet lezen, en ik ga er vanuit dat je weet hoe interrupts werken.

Ja zeker, maar nu heb ik ze niet gebruikt.

Het heeft echt grote voordelen om C te leren, voornamelijk dat je daarmee voor elke denkbare microcontroller kunt programmeren.

Ja ik weet het, maar ik krijg het er niet in. Ik ben bijna 63 en heb een aantal jaar geleden een hele zware burn-out gehad, en sindsdien heb ik moeite met zulke dingen. Maar je hebt gelijk, met C kun je meer.

Maar ik houd het lekker bij basic, daar kan ik me prima mee redden.

Hier het programma zoals ik het opgezet heb, jij zal het wel niets vinden denk, maar het werkt prima en daar gaat het om.

Ik heb drie drukknoppen, één om de stappenmotor te starten en twee drukknoppen om het aantal stappen in te geven. Voor de rest eigenlijk niets, buiten een display om het aantal ingegeven stappen af te lezen.

pic basic code:
 
Device 16F887                        ; Processor type
 
Xtal 10                              ; Cristal 10Mhz
 
Asm                                  ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
 
All_Digital true                     ; Alle poorten digitaal
 
Declare LCD_RSPin PORTD.2            ; Reset display poort D.2
Declare LCD_ENPin PORTD.3            ; Enable display poort D.3
Declare LCD_DTPin PORTD.4            ; Data display poort D.4 t/m D.7
 
Symbol FREQUENTIE = 30               ; Stap frequentie stappenmotor
 
Symbol STEP_HOLD = PORTC.0           ; Uitgang step hold stappenmotor driver
Symbol DIR = PORTC.1                 ; Uitgang richting stappenmotor driver
Symbol PULS = PORTC.2                ; Uitgang puls voor stappenmotor driver
 
Symbol S1 = PORTA.0                  ; Ingang start stappenmotor
Symbol S_UP = PORTA.1                ; Ingang aantal stappen omhoog
Symbol S_DOWN = PORTA.2              ; Ingang aantal stappen omlaag
 
Dim RAMP_DOWN_TELLER As Byte         ; Variabele ramp-down teller
Dim RAMP_UP_TELLER As Byte           ; Variabele ramp-up teller
Dim PULS_TELLER As Word              ; Variabele puls teller
 
Dim WAARDE As Word                   ; Variabele waarde aantal stappen
 
Cls                                  ; Wis display
 
DelayMS 500                          ; Pauze 0.5 sec 
 
Clear                                ; Wis geheugen
 
         ;543210                     ; Hulpregel poort A
PORTA  = %000000                     ; Maak poort A laag
TRISA  = %111111                     ; Poort_A I/O
 
         ;543210                     ; Hulpregel poort B
PORTB  = %000000                     ; Maak poort B laag
TRISB  = %000001                     ; Poort_B I/O
 
         ;76543210                   ; Hulpregel poort C
PORTC  = %00000000                   ; Maak poort C laag
TRISC  = %00000000                   ; Poort_C I/O
 
         ;76543210                   ; Hulpregel poort D
PORTD  = %00000000                   ; Maak poort D laag
TRISD  = %00000000                   ; Poort_D I/O
 
         ;210                        ; Hulpregel poort E 
PORTE  = %000                        ; Maak poort E laag
TRISE  = %000                        ; Poort_E I/O
 
         ;76543210                   ; Hulpregel analoog
ADCON0 = %00000001                   ; ADCON0 register analoog 8 bit
 
         ;76543210                   ; Hupregel analoog
;ADCON1 = %10000000                  ; ADCON1 register analoog 10 bit
 
         ;76543210                   ; Hulpregel analoog poort_B
;ANSELH = %00000000                  ; ANSEL register analoog poort_B
 
;-----------------------------------------------------
; PROGRAMMA STAPPENMOTOR BESTURING RAMP-UP RAMP-DOWN.
;-----------------------------------------------------
 
;----------------------------------
; TELLERS EN WAARDE OP NUL ZETTEN.
;----------------------------------
 
RAMP_DOWN_TELLER = 0
RAMP_UP_TELLER = 0
PULS_TELLER = 0
 
WAARDE = 0
 
;-----------------------------------------------
; STAPPENMOTOR HOUD FUNCTIE ACTIEF LAGE STROOM.
; AFVRAGEN S1, S_UP EN S_DOWN.
;-----------------------------------------------
 
START:
 
    STEP_HOLD = 0                    
 
    If S1 = 1 Then
     If WAARDE > 19 Then
      DelayMS 500
      GoTo RAMP_UP
     EndIf
    EndIf
 
    If S_UP = 1 Then
     WAARDE = WAARDE + 1
     DelayMS 100
    EndIf
 
    If S_DOWN = 1 Then
     WAARDE = WAARDE - 1
     DelayMS 100
    EndIf
 
    Print At 1,1,"INGAVE STAPPEN"
    Print At 2,1,Dec5 WAARDE
 
GoTo START
 
;-----------------------------------------------
; STAPPENMOTOR DRAAI FUNCTIE ACTIEF HOGE SRTOOM.
; STAPPENMOTOR RICHTING RECHTSOM.
; 10 STAPPEN RAMP_UP.
;-----------------------------------------------
 
RAMP_UP:
 
    STEP_HOLD = 1
    DIR = 1
 
    RAMP_UP_TELLER = RAMP_UP_TELLER + 1
 
    DelayUS 400
 
    If RAMP_UP_TELLER = 1 Then
     PULS = 1
      DelayUS 2000
      PULS = 0
     DelayUS 2000
    EndIf
 
    If RAMP_UP_TELLER = 2 Then
     PULS = 1
      DelayUS 1800
      PULS = 0
     DelayUS 1800
    EndIf
 
    If RAMP_UP_TELLER = 3 Then
     PULS = 1
      DelayUS 1600
      PULS = 0
     DelayUS 1600
    EndIf
 
    If RAMP_UP_TELLER = 4 Then
     PULS = 1
      DelayUS 1400
      PULS = 0
     DelayUS 1400
    EndIf
 
    If RAMP_UP_TELLER = 5 Then
     PULS = 1
      DelayUS 1200
      PULS = 0
     DelayUS 1200
    EndIf
 
    If RAMP_UP_TELLER = 6 Then
     PULS = 1
      DelayUS 1000
      PULS = 0
     DelayUS 1000
    EndIf
 
    If RAMP_UP_TELLER = 7 Then
     PULS = 1
      DelayUS 800
      PULS = 0
     DelayUS 800
    EndIf
 
    If RAMP_UP_TELLER = 8 Then
     PULS = 1
      DelayUS 600
      PULS = 0
     DelayUS 600
    EndIf
 
    If RAMP_UP_TELLER = 9 Then
     PULS = 1
      DelayUS 400
      PULS = 0
     DelayUS 400
    EndIf
 
    If RAMP_UP_TELLER > = 10 Then
     PULS = 1
      DelayUS 200
       PULS = 0
      DelayUS 200
     GoTo RUN
    EndIf
 
GoTo RAMP_UP
 
;------------------------------------------------------------------------
; STAPPENMOTOR DRAAI FUNCTIE ACTIEF HOGE SRTOOM.
; STAPPENMOTOR RICHTING RECHTSOM.
; AANTAL INGEGEVEN STAPPEN OP HOGE SNELHEID MIN DE RAMP_UP EN RAMP_DOWN.
;------------------------------------------------------------------------
 
RUN:
 
    STEP_HOLD = 1
    DIR = 1
 
    PULS_TELLER = PULS_TELLER + 1
 
    DelayUS 400
 
    PULS = 1
    DelayUS FREQUENTIE
    PULS = 0
    DelayUS FREQUENTIE
 
    If PULS_TELLER > = WAARDE - 20 Then
     RAMP_UP_TELLER = 0
      PULS_TELLER = 0
      RAMP_DOWN_TELLER = 0
     GoTo RAMP_DOWN
    EndIf
 
GoTo RUN
 
;-----------------------------------------------
; STAPPENMOTOR DRAAI FUNCTIE ACTIEF HOGE SRTOOM.
; STAPPENMOTOR RICHTING RECHTSOM.
; 10 STAPPEN RAMP_DOWN.
;-----------------------------------------------
 
RAMP_DOWN:
 
    STEP_HOLD = 1
    DIR = 1
 
    RAMP_DOWN_TELLER = RAMP_DOWN_TELLER + 1
 
    DelayUS 400
 
    If RAMP_DOWN_TELLER = 1 Then
     PULS = 1
      DelayUS 200
      PULS = 0
     DelayUS 200
    EndIf
 
    If RAMP_DOWN_TELLER = 2 Then
     PULS = 1
      DelayUS 400
      PULS = 0
     DelayUS 400
    EndIf
 
    If RAMP_DOWN_TELLER = 3 Then
     PULS = 1
      DelayUS 600
      PULS = 0
     DelayUS 600
    EndIf
 
    If RAMP_DOWN_TELLER = 4 Then
     PULS = 1
      DelayUS 800
      PULS = 0
     DelayUS 800
    EndIf
 
    If RAMP_DOWN_TELLER = 5 Then
     PULS = 1
      DelayUS 1000
      PULS = 0
     DelayUS 1000
    EndIf
 
    If RAMP_DOWN_TELLER = 6 Then
     PULS = 1
      DelayUS 1200
      PULS = 0
     DelayUS 1200
    EndIf
 
    If RAMP_DOWN_TELLER = 7 Then
     PULS = 1
      DelayUS 1400
      PULS = 0
     DelayUS 1400
    EndIf
 
    If RAMP_DOWN_TELLER = 8 Then
     PULS = 1
      DelayUS 1600
      PULS = 0
     DelayUS 1600
    EndIf
 
    If RAMP_DOWN_TELLER = 9 Then
     PULS = 1
      DelayUS 1800
      PULS = 0
     DelayUS 1800
    EndIf
 
    If RAMP_DOWN_TELLER > = 10 Then
     PULS = 1
      DelayUS 2000
       PULS = 0
      DelayUS 2000
     GoTo START
    EndIf
 
GoTo RAMP_DOWN
 
End
 
Als je haar maar goed zit, GROETEN LAMBIEK.
Ik ben niet bepaald een voorstander van delays, maar voor zo'n simpele toepassing die verder niets hoeft te doen begrijp ik dat wel.

Waarom gebruik je geen array voor de ramp-up en ramp-down, en waarom heb je die apart gemaakt? Die had je m.i. gemakkelijk kunnen samenvoegen. Daarbij gaat het nu mis als je een paar stappen wilt zetten (omdat je een stukje folie tekort komt of het begin beschadigd is of zo), want je kunt nooit minder dan 20 stappen zetten.

Als je een array maakt, van 10 stappen (of welk ander aantal je wilt), die je gebruikt voor de interval tussen de stappen, en je die handig indexeert, kun je het hele programma terugbrengen tot een paar simpele regels.

Stel dat StapTotaal het totale aantal stappen is dat je moet zetten, en StappenGedaan het aantal stappen tot dusver, dan kun je die array indexeren met de kleinste waarde van StappenGedaan, StapTotaal - StappenGedaan, en de lengte van de array (10, in dit geval).

Stel dat je 30 stappen moet doen, dus StapTotaal = 30. Je begint bij 1 (of 0, geen idee waar arrays beginnen in PICbasic), en voor de eerste 10 stappen is StappenGedaan de kleinste waarde van die 3, want hij hij gaat in stappen van 1 omhoog, maar is nog steeds kleiner dan 10. Na de eerste 10 stappen is de lengte van de array de kleinste waarde; StappenGedaan is groter dan 10, en je moet nog meer dan 10 stappen tot het eind. De index in de array blijft dus op 10 staan; de hoogste snelheid. Als je, na 20 stappen, nog 10 stappen te gaan hebt, wordt de laatste term, "StapTotaal - StappenGedaan" kleiner dan 10, en dat is vanaf dat moment dus de kleinste term. Je stapt dan dus achteruit door de array, vanaf 10, om precies bij element 1 aan te komen op het moment dat je de laatste stap moet zetten.

In C kun je dat zo schrijven:
code:
#define ARRAYSIZE 10
unsigned short Intervals[ ARRAYSIZE ] = { 2000, 1880, 1600, 1400, 1200, 1000, 800, 600, 400, 200 };

unsigned short Min( unsigned short a, unsigned short b )
{
  if( a < b )
    return a;
  return b;
}

void Move( unsigned short NrSteps )
{
  unsigned short StepCount, DelayLength;

  for( StepCount = 0; StepCount < NrSteps; StepCount++ )
  {
    <output high>
    DelayLength = Intervals[ MIN( MIN( StepCount, NrSteps - SetCount ), ARRAYSIZE ) ];
    delay( DelayLength );
    <output low>
    delay( DelayLength );
  }
}
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Op 9 oktober 2018 23:18:47 schreef SparkyGSX:
Ik ben niet bepaald een voorstander van delays, maar voor zo'n simpele toepassing die verder niets hoeft te doen begrijp ik dat wel.

Zo dacht ik ook, als je meer wil doen dan dit zou ik ook met interrupts werken natuurlijk.

Waarom gebruik je geen array voor de ramp-up en ramp-down, en waarom heb je die apart gemaakt?

Ja dat weet ik eigenlijk niet, dit was het eerste wat in me opkwam. Maar dat wil niet zeggen dat het niet beter kan, in mijn ogen is software nooit klaar. :)

Daarbij gaat het nu mis als je een paar stappen wilt zetten (omdat je een stukje folie tekort komt of het begin beschadigd is of zo), want je kunt nooit minder dan 20 stappen zetten.

Van die 20 stappen als minimum klopt, maar waar hebben we het over. In mijn geval "bij de test" halve stappen is dat 0.9 X 20 = 18 graden, en dat zonder vertraging. Stel dat je nog een vertraging nodig hebt van 1:4, dan wordt het 4.5 graad.
En als je met een gekochte driver microstepping gaat doen wordt het nog een stuk minder, dus ik zie dat niet als probleem. Maar je hebt gelijk, je kan hem niet bij nul laten beginnen.

Als je een array maakt, van 10 stappen (of welk ander aantal je wilt), die je gebruikt voor de interval tussen de stappen, en je die handig indexeert, kun je het hele programma terugbrengen tot een paar simpele regels.

Als ik tijd heb zal ik daar eens naar kijken.
Als je haar maar goed zit, GROETEN LAMBIEK.
Op 10 oktober 2018 09:28:15 schreef Lambiek:En als je met een gekochte driver microstepping gaat doen wordt het nog een stuk minder, dus ik zie dat niet als probleem.
Als je een driver met microstepping gaat gebruiken, heb je niet meer genoeg aan 10 stappen ramp-up en ramp-down...

Wederom, voor deze toepassing goed genoeg, maar ik streef er altijd naar om software binnen redelijke grenzen generiek te schrijven. Als je code een willekeurig aantal stappen kan zetten, kun je dezelfde functie ook gebruiken om te joggen; stel dat je 8 stappen per millimeter folie nodig hebt, dan kun je gewoon Move( 8 ) uitvoeren voor een millimeter extra als je het dat knopje drukt. Bij je huidige code kun je het aantal stappen aanpassen, en moet je hem een cyclus laten maken om te kijken of de lengte nu wel goed is. Op zich niet zo erg, maar met mijn voorstel is dat veel gemakkelijker aan te passen.
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken