Sida 1 av 4

AVR servodriver för DC motorer

Postat: 20 mars 2007, 17:19:48
av JBV
Det finns flera DIY servodrivers, men dom flesta har inte öppen källkod så jag drar mig för att använda dom, då jag inte vill vara beroende av att någon ska tillhandahålla färdigprogramerade chip. Tänk om något går sönder efter något år och varken chipet eller koden finns tillgängligt! Dessutom är det kul att designa egna grejer ;)

Jag har börjat rita på en driver och "skissa" på koden. Målet är en generisk, diy driver som klarar upp till 150V och 20A och kostar 250-300 kr per enhet.

Delarna för en enhet (exklusive FETar) kostar kring 400 kr från elfa.
Köper man delar för 10 enheter kostar dom ca 300 kr styck. Elfa är ju inte direkt känt för att vara billigt så jag tror man kan komma en bit lägre utan större problem! Transistorer går att få tag riktigt billigt! Jag köpte t.ex. 200 st IRFP460LC för 5 kr styck! (dom går på 190 spänn på Elfa) :D

Jag tänkte att man får anpassa FETar och laminattjocklek beroende på vilken ström man vill drivern ska klara. Strömbegränsningen ska ställas in via mjukvara och gå upp till 20A

Detta är lite kod jag knapprat ihop för PID loopen:

Kod: Markera allt

void PID()
{
  OCR0A = 0;
  OCR0B = 0;
  
  if(!Fault)
  {
    PWM = 0;

    Error = Target - Position;
    Derivate = Error - PreviousError;
    PreviousError = Error;
    
    Integration += Error;
    if(Integration > IntegrationLimit) Integration = IntegrationLimit;
    if(Integration < (0 - IntegrationLimit)) Integration = 0 - IntegrationLimit);

    if((Error > DeadBand) || (Error < (0 - DeadBand)))
    {
      float Result = 0;

      Result = Kp * Error;
      Result += Ki * Integration;
      if((Derivate > DerivateDeadBand) || (Derivate < (0 - DerivateDeadBand)))
        Result -= Kd * Derivate;

      PWM = int(Result);
    }    

    //Direction A, negative error
    if(PWM < 0)
    {
      PWM = abs(PWM);

      PWM += Offset;
	      
      if(PWM > MaxPWM) PWM = MaxPWM;

      OCR0A = PWM;
    }

    //Direction B, positive error
    if(PWM > 0)
    {
      PWM += Offset;    

      if(PWM > MaxPWM) PWM = MaxPWM;

      OCR0B = PWM;
    }
  }
}
Den ska köras i kring 2kHz.
Variablerna som ej är initierade är globala och påverkas av andra funktioner som t.ex. step/dir input, enkoder input, USART för inställningar osv.

Edit: Här är Kopplingschemat
Har inte ritat in step/dir och enkoderingångarna ännu.

Edit: Fixat koden lite

Postat: 20 mars 2007, 17:28:59
av dar303
Trevligt! Det ska bli intressant att följa ditt projekt, kan vara ett bra alternativ till stegmotorer när det blir färdigt.
Posta bilder och annat, släng upp en tråd på CNCZone också, folk kommer säkert att bli heltokiga över en open source servodrivare!

Postat: 20 mars 2007, 17:39:49
av JBV
Japp jag får göra det om jag lyckas få ihop det hela! :)

Jag tänkte även klura lite på DIY enkoders, man får ju offra lite upplösning motför komersiella, men DIY är alltid kul! Testade lite med laserskrivare på plastfilm och 100 linjer ska inte vara något större problem, och det blir ju 400 pulser per varv, vilket motsvarar en stegmotor i halvsteg.

Postat: 20 mars 2007, 19:55:31
av Millox
Det här har jag funderat på också, men jag tog en lite enklare väg (om det inte varit för att nån käkat upp mitt labbkort) och köpte mig 2 st FSAM30SH60A samt några pwm3:or. Kommer köra med 15 kHz, 12 bitars upplösning.

Om du kan rekommenderar jag dig verkligen att köra med pwm2:or eller -3:or. 3:an har exempelvis inbyggda utgångar för 1 h-brygga och 2 halvbryggor, eller en trefasbrygga samt stöd för dödtidgenerering.

Postat: 20 mars 2007, 20:11:37
av JBV
Dom där modulerna såg trevliga ut! :) Var hittade du dom och vad gick dom på? Kanske får köra såna om det blir en BLDC driver senare! Dock tror jag att jag kör vidare som planerat här! Tack för tipsen!!

Postat: 20 mars 2007, 20:21:17
av Millox
Jag köpte dem på farnell till ett förmånligt pris, typ 230 pix eller så. Tror de går på en 450 vanligtvis. Nackdelen är att de bara klarar 350 V, men det räcker ju för en ganska häftig bldc-drivare och är dessutom ganska lagom för enfasmatning...

Postat: 21 mars 2007, 23:46:59
av Chribbe76
Den här tråden har jag väntat på.

Hmm... Du har DeadBand på Derivate... :humm:

En liten kryptisk undran:
Ska strömbegränsningen bara skydda mot för hög ström eller är tanken att motorn ska få pulserad konstant ström istället för vanlig "spännings-pwm".
Skillnaden är väldigt stor för regleringen.

Postat: 22 mars 2007, 00:08:59
av JBV
Jag tänkte sätta 2 inställningar för strömbegränsningen. tex:
MaxCurrent = 10A
MaxPeakCurrent = 15A
Om strömen går över 15A så faultar driven direkt
Om strömen är över 10A men under 15A i mindre än en sekund så händer inget och över en sekund så faultar drivern. Allt under MaxCurrent är ok.
Tänkte även faulta vid inställbart maxvärde på felet.

Jag är givetvis öppen för förslag på andra lösningar :) Du lär väl ha kommit fram till en del när du höll på med dina PID experiment!?

Derivate Dead Band är för att göra systemet mer stabilt för positioner nära målet, derivata funktionen används bara vid större förändringar!
Jag har inspererats av den här sidan/koden:
http://www.sportdevices.com/servo/servo.htm

Det "vanliga" Dead Band inte är normalt sett inte användbart i CNC appikationer, men jag tänkte att det är lika bra att implementera det utifall man vill experimentera med tex linjära enkoders och har lite backlash eller så...

Postat: 22 mars 2007, 00:19:11
av baron3d
Intressant !

Postat: 22 mars 2007, 01:29:26
av $tiff
>> JBV

Om du vill trimma regulatorn lite mer så föreslår jag viktning av börvärdet, om du vill ha mjukare svar på detta. Vidare kan man med fördel plocka bort inverkan från börvärdet i D-delen för att inte få så enorma utslag i motorn -> jämnare gång vid referensvärdesändringar.
Detta är knep som bara är nödvändiga om du ändrar börvärdet i steg, exempelvis genom digital kommunikationskanal.

Postat: 22 mars 2007, 19:23:05
av JBV
Jag får pröva lite sånt först när jag har en normal PID-reglering fungerande hehe :) Börjar man göra för mycket funktioner från början lär det inte bli nånting av det hela :P

Postat: 25 mars 2007, 14:18:55
av Chribbe76
Din motor kommer helt enkelt få PWM (spänning), Strömbegränsningen är bara ett skydd.

I mina servo-tester har PID'en bara styrt motor-strömmen (linjär-regleras med opamp) vilket ger ett korrekt resultat.
Enligt mina personliga teorier krävs det ett beräknings-steg mellan PID'en och motorns PWM-värde om man ska köra med PWM, har man ingen beräkning mellan så kommer regleringen bli väldigt dålig.
Det ska bli mycket intressant att se resultatet när du styr motorn utan denna extra beräkning.

Det är helt rätt att börja "basic" och höja ribban senare.

Postat: 25 mars 2007, 18:26:34
av JBV
Japp, jag tycker det känns mer vettigt att styra med spänningen så man får mindre förluster!

Vad tänkte du beräkningen skulle göra? Vi får väl se om det fungerar bra utan! :)

Jag funderar på att pröva skriva en genetisk algoritm för att hitta PID-parametrarna. Har länge velat pröva det, men har inte haft någon intressant användning för det! Borde gå rätt smidgt då man bara har 3 parametrar och så testar man bara för minsta medelfel på samma upprepade testsekvens!

Postat: 25 mars 2007, 18:57:32
av Chribbe76
Jag vet inte exakt hur beräkningen ska se ut, jag kanske även har fel uppfattning om problemet så det blir en senare fråga.

Postat: 25 mars 2007, 19:04:28
av JBV
Jag har en servomotor på väg och ska beställa komponenter när jag gått igenom schemat! Så snart sätts det igång :)