AVR servodriver för DC motorer

Berätta om dina pågående projekt.
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

AVR servodriver för DC motorer

Inlägg 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
Senast redigerad av JBV 22 mars 2007, 19:14:08, redigerad totalt 4 gånger.
Användarvisningsbild
dar303
Inlägg: 5979
Blev medlem: 17 december 2003, 19:54:56
Ort: Sthlm

Inlägg 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!
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg 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.
Millox
Inlägg: 559
Blev medlem: 10 december 2005, 22:10:43
Ort: Östhammar

Inlägg 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.
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg 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!!
Millox
Inlägg: 559
Blev medlem: 10 december 2005, 22:10:43
Ort: Östhammar

Inlägg 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...
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg 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.
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg 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å...
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Inlägg av baron3d »

Intressant !
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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.
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg 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
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg 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.
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg 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!
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg 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.
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg 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 :)
Skriv svar