LinuxCNC, varvtalsstyrning av spindel

Robot, CNC, Pneumatik, Hydraulik, mm
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

LinuxCNC, varvtalsstyrning av spindel

Inlägg av Wise »

Tanken var först att bara läsa av varvtalet på kressen och visa det i GUI't. Men eftter lite klantigheter med mätningarna av interna varvtalsavkänningen i kressen så gick varvtalsregleringen sönder i motorn...

Så.. Tanken poppade upp rätt snabbt att bygga sin egen triacdrivare och varvtalsåterkoppling till LinuxCNC. Sen låta LinuxCNC stå för PID reglering av varvtalet.
Flera fördelar med detta:
* Man kan känna av att spindeln verkligen är påslagen innan man börjar fräsa
* Sätta ett deterministiskt varvtal i CAM berednigen
* Konstant skärhastighet
* Möjligtvis komma ner lite i varvtal på fräsen
* Roligt projekt

Tänkt lösning
* Läsa av spindelvarvtal på något sätt, optiskt eller hall-givare. Möjligtvis använda givaren som redan sitter i fräsmotorn om jag lyckas lurka ut hur den fungerar.
* Inkoppling av varvtalsgivare mot PC via optokopplare
* Inläsning av varvtal mha ENCODER modul i LinuxCNC
* PID regulator i LinuxCNC styr en PWM generator för hastighetsreglering av motorn enl: 555 triac styrning

Förstudier
Mjukvara, LinuxCNC har PWM, encoder samt PID moduler direkt tillgängliga, inga konstigheter. Började kolla så att PWM signalen kan genereras och skickas via optokopplare utan för mycket förvrängning. Inga problem att få iaf 1kHz med bra upplösning. Sätter man "dither-pwm" biten i PWM modulen så får man i princip oändlig teoretisk upplösning. Testade sedan encoder modulen. 30krpm ska min spindel kunna snurra i (Kress800FME), 500Hz, inga problem genom optokopplaren och LinuxCNC läser av korrekt frekvens.

Testrigg
Innan jag bygger en triacmodul tänkte jag att jag behöver testa konceptet lite. Har därför byggt en liten testrigg. En vanlig borstad DC motor styrs via PWM utgången mha en MOSFET. 12V externt labbagg. Magnet limmad på axeln och en hall-givare för att läsa av varvtalet. Slabbar ihop kretskorten och skriver ut ett fäste till motorn på 3D-skrivaren:
2014-04-29.jpg
Testar PWM'en och motorn snurrar igång. Läser av encoder velocity och verifierar att rätt varvtal avläses med oscilloskopet.

PID koppling
Dags att koppla ihop loopen. Lägger på en SCALE på encoder.velocity för att få RPM och inte Hz på varvtalet. Utgången från scale in på feedback på PID. Kopplar PID output till PWM in. Har inte kopplat PID börvärde till någon spindle speed signal ännu, utan kör den manuellt för uttestning av PID värdena. Såhär ser min .hal fil ut med de berörda delarna än så länge.

Kod: Markera allt

# PWM OUTPUT ----------------------------------------------------------------------------------
loadrt pwmgen output_type=0
addf pwmgen.make-pulses base-thread
addf pwmgen.update servo-thread

setp pwmgen.0.dither-pwm 1
setp pwmgen.0.value 0
setp pwmgen.0.enable 1

net spindle_pwm pwmgen.0.pwm parport.0.pin-01-out
# ---------------------------------------------------------------------------------------------

# ENCODER INPUT -------------------------------------------------------------------------------
loadrt scale count=1
addf scale.0 servo-thread
setp scale.0.gain 60

loadrt encoder num_chan=1
addf encoder.update-counters base-thread
addf encoder.capture-position servo-thread

setp encoder.0.counter-mode 1
setp encoder.0.index-enable 0
setp encoder.0.position-scale 1

net spindle_encoder parport.0.pin-13-in => encoder.0.phase-A
net spindle_scale encoder.0.velocity => scale.0.in 
# ---------------------------------------------------------------------------------------------

# SPINDLE PID ---------------------------------------------------------------------------------
loadrt pid num_chan=1
addf pid.0.do-pid-calcs servo-thread
setp pid.0.maxoutput 1

setp pid.0.Pgain 0.0004
setp pid.0.Igain 0.003
setp pid.0.Dgain 0
setp pid.0.index-enable 0
setp pid.0.enable 1

net spindle_feedback scale.0.out => pid.0.feedback
net spindle_pid pid.0.output => pwmgen.0.value
# ---------------------------------------------------------------------------------------------
PID tuning
Att mäta är att veta! Därför finns det ett inbyggt "oscilloskop" i LinuxCNC, HALSCOPE, med detta kan man kolla på alla parametrar och signaler som finns i systemet. Plottar varvtalets BÖR och ÄR värde, PID.output(PWM signalen) och PID.saturated. Saturated indikerar om PID regulatorn har nått sitt maxvärde (inställd till 1, 100% PWM duty).

Stegsvar 0-10000rpm:
0-10000.png
Stegsvar 0-20000rpm:
0-20000.png
Stegsvar 0-30000rpm:
0-30000.png
Stegsvar 0-10000-20000rpm:
0-10-20.png
Stegsvar 20000-10000rpm:
20-10.png
Här varierar jag inspänningen till motorn, man ser iaf att regulatorn jobbar:
15k_voltage.png
Lägger inte ner mycket mer tid på att justera konstanterna nu, riggen är ju bara för test. Helt olastad och liten massa i motorn, inte så realistiska förhållanden för ändamålet. Men fungerar så långt gör det, vilket känns riktigt roligt. Nästa steg blir nog att göra en test med 555 och triacstyrning.

Tankar eller tips såhär långt mottages gärna :)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
swapper
Inlägg: 1076
Blev medlem: 14 augusti 2012, 23:18:15
Ort: Helsingborg

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av swapper »

Riktigt snyggt det där, hoppas du får till en bra styrning med triacarna.

När du får det hela att fungera och skall fräsa måste du ha nedan så kommer den inte börja fräsa fören spindeln är "at speed"

http://linuxcnc.org/docs/html/examples/ ... at_speed_a

Kod: Markera allt

# load a near component and attach it to a thread
loadrt near
addf near.0 servo-thread

# connect one input to the commanded spindle speed
net spindle-cmd => near.0.in1

# connect one input to the encoder-measured spindle speed
net spindle-velocity => near.0.in2

# connect the output to the spindle-at-speed input
net spindle-at-speed motion.spindle-at-speed <= near.0.out

# set the spindle speed inputs to agree if within 1%
setp near.0.scale 1.01
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

Re: Sv: LinuxCNC, varvtalsstyrning av spindel

Inlägg av Wise »

Tackar! Ja det kommer behövas en sån koppling. Det jag har funderat lite på ang fasvinkelstyrningen är om man kan få till kompenseringen av det olinjära effekttillskottet över en halvpension i linuxcnc. Om det ens är lönt att tänka på?
Användarvisningsbild
swapper
Inlägg: 1076
Blev medlem: 14 augusti 2012, 23:18:15
Ort: Helsingborg

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av swapper »

Nu snackar du iaf över min nivå med halvpensioner :)
Men skall jag gissa så menar du att linuxcnc inte är snabbt tillräcklig för att kunna hinna justera loopen tillräckligt snabbt mellan zero-cross och peak ?

Här står det lite om vilka latenser man kan förvänta sig.
http://linuxcnc.org/docs/html/common/In ... cepts.html

Det är egentligen denna du vill bygga fast använda linuxcnc som motorn för PID delen.
http://www.vhipe.com/product-private/SuperPID.htm

Vad jag vet är linuxcnc ganska långsam på att räkna pulser om man inte har hårdvara för att räkna dessa (mesa kort).
Vet inte vad frekvensen blir vid 24krpm när du väl läser av den men värt att tänka på så du inte missar pulser.
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av Wise »

Ja tänk vad en grogg och automatisk stavningskontroll i telefonen kan ställa till det :)

Nej, jag tänker att effekttillförseln till motorn inte är linjär under varje halvperiod. Om du tänker en rent resistiv last för enkelhetens skull, så är effekten P=U*I. Momentaneffekten blir då sin^2(x). Integralen av sin^2(x) är inte linjär. Integralen från 0 till pi/4 är inte lika med pi/4 till pi/2. Jag vill alltså linjärisera utsignalen från PID regulatorn med avseende på effekten. Så 1% i duty cycle motsvarar 1% av effekten under en halvperiod. Men jag vet inte riktigt hur man får till trigonimetriska beräkningar i HAL ännu.

Ja precis, SuperPID fixar samma biff som detta, känns dock bättre att LinuxCNC har koll på allt :)

Pulserna från varvtalet räknar jag i base-thread som går i 25kHz. Vid maxvarv 30krpm blir det 500Hz, bör inte vara någon risk att missa pulser
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av Wise »

Får nog skriva en egen komponent för att göra linjäriseringsberäkningarna. Bygga vidare på detta.
Användarvisningsbild
swapper
Inlägg: 1076
Blev medlem: 14 augusti 2012, 23:18:15
Ort: Helsingborg

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av swapper »

Tur att det finns de som är bra på matte! (inte jag :) )
Dock hittade jag denna sidan
https://sites.google.com/site/klaasdc/c ... controller

Kan säkert ha lite matnyttigt om du skall skriva en rutin.
Han nämner ett bra ställe att montera en IR givare bla.

En sak undrar jag dock är hur du skall hantera zero-cross ingångssignalen? eller du använder inte det alls som feedback?
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av Wise »

Jag kopplar inte in zero-cross till datorn alls. Den signalen kopplas istället till en 555-timer(monostabil) som reset signal. PWM signalen från PID regulatorn filtreras till en DC spänning som matas in på pinne 5 på 555-timern. Denna pinne kan man alltså lägga en yttre spänning på för att modifiera triggertiden på 555-timern. När den timat ut, sätter den på triacen. När nollpunkten kommer igen, resetas 555 och triacen slås av. Står mer detaljerat i länken i första inlägget hur detta ska fungera. Har simulerat denna koppling och det ser ut att kunna fungera.
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

Re: LinuxCNC, varvtalsstyrning av spindel

Inlägg av Wise »

Har nu lagt till upprampning av spindelvarvtalet samt en NEAR komponent så LinuxCNC vet när spindeln är tillräckligt nära önskat varvtal för att börja fräsa. Tillräckligt nära är inställt på 5%. Lade även in en begränsning i PID regulatorn på maxerror, annars blev regulatorn satturated vid upprampningens start pga tröghet i motorn innan den började snurra. I bilden syns önskat varvtal(röd), upprampat önskat varvtal(mint), verkligt varvtal(grön) och "varvtal tillräckligt nära"(lila). Upprampning till 15krpm och sedan till noll.
spindle_ramp.png
Roddat om lite i .hal filen:

Kod: Markera allt

loadrt scale count=1
loadrt encoder num_chan=1
loadrt pid num_chan=1 debug=1
loadrt pwmgen output_type=0
loadrt limit2 names=spindle-ramp
loadrt near names=spindle-at-speed

addf encoder.update-counters base-thread
addf pwmgen.make-pulses base-thread

addf spindle-ramp servo-thread
addf spindle-at-speed servo-thread
addf encoder.capture-position servo-thread
addf scale.0 servo-thread
addf pid.0.do-pid-calcs servo-thread
addf pwmgen.update servo-thread


# LIMIT2 --------------------------------------------------------------------------------------
setp spindle-ramp.min 0
setp spindle-ramp.max 45000
setp spindle-ramp.maxv 10000
# ---------------------------------------------------------------------------------------------

# ENCODER INPUT -------------------------------------------------------------------------------
setp scale.0.gain 60
setp encoder.0.counter-mode 1
setp encoder.0.index-enable 0
setp encoder.0.position-scale 1
# ---------------------------------------------------------------------------------------------

# SPINDLE PID ---------------------------------------------------------------------------------
setp pid.0.maxoutput 1
setp pid.0.maxerror 500
setp pid.0.Pgain 0.0004
setp pid.0.Igain 0.003
setp pid.0.Dgain 0
setp pid.0.index-enable 0
setp pid.0.enable 1
# ---------------------------------------------------------------------------------------------

# PWM OUTPUT ----------------------------------------------------------------------------------
setp pwmgen.0.dither-pwm 1
setp pwmgen.0.value 0
setp pwmgen.0.enable 1
# ---------------------------------------------------------------------------------------------

# SPINDLE-AT-SPEED NEAR -----------------------------------------------------------------------
setp spindle-at-speed.scale 1.05
# ---------------------------------------------------------------------------------------------

net spindle_encoder 	parport.0.pin-13-in		=> encoder.0.phase-A
net spindle_scale 	encoder.0.velocity		=> scale.0.in 
net spindle_cmd		motion.spindle-speed-out	=> spindle-ramp.in	spindle-at-speed.in1
net spindle_feedback 	scale.0.out 			=> pid.0.feedback	spindle-at-speed.in2
net spindle_ramped	spindle-ramp.out		=> pid.0.command
net spindle_pid 	pid.0.output			=> pwmgen.0.value
net spindle_pwm 	pwmgen.0.pwm 			=> parport.0.pin-01-out
net spindle-ready	spindle-at-speed.out 		=> motion.spindle-at-speed
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar