Gå til innhold

Den lille Arduino-tråden


Anbefalte innlegg

Hadde et prosjekt jeg har hatt lit lyst på å lage så prøvde meg litt på Arduino igjen. Men så støtte jeg på litt problemer og tenkte kanskje noen her kunne ha noen løsning.

 

Jeg skal styre en børsteløs DC motor som er omviklet til en "gimball motor" (altså en vanlig 3 fase synkron AC motor i praksis) og lagde et lite program til dette. Jeg bruker ikke Arduino boards, men heller Teensy boards siden de er ekstremt mye kraftigere og har mye mer muligheter, men jeg bruker fremdeles Arduino IDE og språk for å programmere den. (se kode nederst).

 

Men problemet mitt er ikke med programmet (det fungerer fint), men med hardware.

 

Jeg har koblet 3 PWM utganger til en slik krets som jeg har koblet opp på et breadboard:

Motorkrets_zpsc1d51785.jpg

Og slik ser kaoset ut i virkeligheten:

 

 

2014-03-03234220_zps1c425ac6.jpg

Vakkert ikke sant :lol:

Funksjon foran utseende er som dere forstår mitt motto....

 

 

 

Transistorene forran MOSFET'ene er der for å øke spenninga på signalet fra 3,3 volt fra microcontrolleren til VCC som jeg har satt til 15 volt.

Og MOSFET'ene er koblet i 3 halve H-bro konfigurasjoner så det til sammen lager 3 fase vekselspenning med P-channel FET på toppen (mot VCC) og N-channel FET på bunnen (mot GND)

 

Som dere ser av bildet i spoileren er det ingen kjøleribbe på MOSFET'ene, men jeg ville ikke tru at det var nødvendig med så lite effekt som går gjennom dem når spolemotstanden i motoren er 17 ohm og innspenningen er bare 15 volt, pluss at de jo opererer rent ON OFF som en switch og dermed skulle det ikke være noe særlig effekt tap i disse.

MOSFET'ene jeg bruker er:

De er altså veldig overkill for oppgaven (men det er det jeg har)
Problemet er at MOSFET'ene blir VELDIG varme etter bare få sekunder med kjøring av motoren. Jeg har forsøkt med litt forskjellige PWM frekvenser uten at det hjalp. Hvorfor skjer dette? Og hvordan kan jeg løse det?
Jeg har en liten misstanke om at det kan ha noe med stige og falltiden på MOSFET'ene og at dette forrusaker at de et lite øyeblikk akkurat i overgangen mellom av og på kortslutter mot hverandre. Kan det være riktig? Og hva er i så fall en enkel løsning?
Koden for dem som er interessert (noen funksjoner fungerer kun på Teensy slik som "IntervalTimer" og PWM frekvens settingen "analogWriteFrequency", men dette kan løses på andre måter på Arduinoen):

 

 

/* Programm for å lage PWM tilnærming av 3 fase sinus kurve
Det er laget en funksjon for å regne om fra teller verdi til
sinus PWM utgangsverdi kallt SinusAnalogUt()
*/
int PWMpin1 = 3;  
int PWMpin2 = 4;
int PWMpin3 = 5;
int ledPin = 13;
float TellerVerdi= 0.0;
int AnalogutVerdi_1 = 0;
int AnalogutVerdi_2 = 0;
int AnalogutVerdi_3 = 0;
float fullscale = 255.0;
IntervalTimer myTimer;
const float OffsetGrader_1 = 0.0;
const float OffsetGrader_2 = 120.0;
const float OffsetGrader_3 = 240.0;


void setup(){
  analogWriteFrequency(PWMpin1, 5000);  // set PWM frequency (pin, Hz)
  analogWriteFrequency(PWMpin2, 5000);  // set PWM frequency (pin, Hz)
  analogWriteFrequency(PWMpin3, 5000);  // set PWM frequency (pin, Hz)
  analogWriteResolution(8);             // PWM oppløsning 8 = 0-255
  pinMode(PWMpin1, OUTPUT);             // erklære pinne som utgang
  pinMode(PWMpin2, OUTPUT);             // erklære pinne som utgang
  pinMode(PWMpin3, OUTPUT);             // erklære pinne som utgang
  pinMode(ledPin, OUTPUT);              // erklære pinne som utgang
  Serial.begin(9600);                   // starte seriell for debuging
  myTimer.begin(CounterTic, 200);       // timer verdi i microsekunder
}


void loop()  { 


//nullstilling av teller ved overflow/fullscale verdi 
  if(TellerVerdi >= (fullscale - 1.0)){
  TellerVerdi = 0;            
  } 


//kaller SinusAnalogUt funksjonen og skriver den til AnalogutVerdi
AnalogutVerdi_1 = SinusAnalogUt(TellerVerdi, fullscale, OffsetGrader_1);
AnalogutVerdi_2 = SinusAnalogUt(TellerVerdi, fullscale, OffsetGrader_2);
AnalogutVerdi_3 = SinusAnalogUt(TellerVerdi, fullscale, OffsetGrader_3);  
  
// lag en firkantpuls i samme frekvens som sinusen som klokkepuls for oscilloskop  
  if(AnalogutVerdi_1 >= (fullscale / 2)){                   
    digitalWrite(ledPin, HIGH);
  }
  else{
    digitalWrite(ledPin, LOW);
  }


// Skriver til analog utgang  
    analogWrite(PWMpin1, AnalogutVerdi_1);  
    analogWrite(PWMpin2, AnalogutVerdi_2); 
    analogWrite(PWMpin3, AnalogutVerdi_3);
   
}


//Teller funksjon
  void CounterTic(void){
  TellerVerdi = TellerVerdi + 1.0;            // øke tellerverdi for hver timer puls
  Serial.print(int(TellerVerdi), DEC);        // skrive ut tellerverdi for debuging 
  Serial.print("  ");
  Serial.print(AnalogutVerdi_1, DEC);         // skrive ut PWM verdi for debuging
  Serial.print("  ");
  Serial.print(AnalogutVerdi_2, DEC);         // skrive ut PWM verdi for debuging
  Serial.print("  ");
  Serial.println(AnalogutVerdi_3, DEC);       // skrive ut PWM verdi for debuging og skift linje
  }  



/* SinusAnalogUt funksjon
regner ut et PWM ut signal (integer) fra et tellerverdi inn
Har også en offset verdi for at samme funksjon skal kunne brukes
til flere faser
*/


// deklarere funksjonen
int SinusAnalogUt(float in_TellerVerdi, float in_FullScale, float in_OffsetGrader){


//deklarere lokale variabler  
float loc_AnalogMellomRegning;
const float loc_pi = 3.14159265359;
float loc_SinusLosning;
float loc_SinusEtterRegning;
float loc_grader;
float loc_radianer;
int loc_AnalogutVerdi;


//regne ut grader fra tellerverdi
  loc_grader = ((365.0 / in_FullScale) * in_TellerVerdi)+in_OffsetGrader;
  if(loc_grader >= 360){
    loc_grader = loc_grader -360;
  }


//regne om fra grader til radianer for å kunne bruke i sinus regning
  loc_radianer = (loc_grader / 180.0) * loc_pi;
  
//regne ut sinus  
  loc_SinusLosning = sin(loc_radianer);
  loc_SinusEtterRegning = (loc_SinusLosning + 1.0) / 2.0;


//regne om fra sinus flyttall (0.0 til 1.0) til en PWM verdi (integer) 
  loc_AnalogMellomRegning = loc_SinusEtterRegning * in_FullScale;
  loc_AnalogutVerdi = int(loc_AnalogMellomRegning);
  
  return loc_AnalogutVerdi;
}

 

 

Ja foreløpig kjører den bare på en fast frekvens.

Endret av flesvik
Lenke til kommentar
Videoannonse
Annonse

 

Prøve alternative varianter da? For og se om kompilatoren spiser dem?

 

Som feks?

 

AtW

 

 

Glem det, det er (nesten) garantert ikke det som er problemet. Tok og leste dokumentasjonen for Ethernet library, det burde jeg har gjort først :)

det du gjør her

if (client) {


char bokstav = client.read();
kommando += bokstav;
client.println(kommando);

}

(etter å ha sjekket at client er tilkoblet)

er å lese ett tegn fra klienten, legge det til kommando og så printe ut kommando (som bare inneholder ett tegn).

Det er vel ikke det du ønsker? Du ønsker vel å lese en hel kommando før du printer den ut?

I tillegg så burde du vel bruke server.println() istedet for client.println() siden det er serveren som skal skrive - men jeg er usikker på om det gjør noen forskjell.

 

har du sett på ChatServer eksempelet? Kanskje det hjelper?

men jeg synes eksemplene de bruker er uklare, de blander server.* og client.* funksjoner om hverandre, med kommentarer som noen ganger er "motsatt" av det beskrivelsen av en funksjon sier. Urgh.

Endret av tingo
Lenke til kommentar

 

 

Problemet er at MOSFET'ene blir VELDIG varme etter bare få sekunder med kjøring av motoren. Jeg har forsøkt med litt forskjellige PWM frekvenser uten at det hjalp. Hvorfor skjer dette? Og hvordan kan jeg løse det?

 

Det er mulig jeg er på feil bærtur her, men hvorfor PWM i først omgang?

Er det et forsøk på å styre effekt?

Det som får motoren til å tørne er jo sekvensen du skriver ut på dine tre pinner.

Frekvensen på denne styrer farta til motoren.

Hvor kommer PWM inn? - om den skal styre effekt, ville jeg nok ha tenkt på en annen måte.

 

(Men ikke misstenk meg for å ha fasiten her - jeg har aldri prøvd å styre slike motorer, og har ikke mye erfaring fra arduino heller - er fersk på det, men har drevet med elektronikk siden tidlig steinalder.)

Lenke til kommentar

 

 

 

 

Problemet er at MOSFET'ene blir VELDIG varme etter bare få sekunder med kjøring av motoren. Jeg har forsøkt med litt forskjellige PWM frekvenser uten at det hjalp. Hvorfor skjer dette? Og hvordan kan jeg løse det?

 

Det er mulig jeg er på feil bærtur her, men hvorfor PWM i først omgang?

Er det et forsøk på å styre effekt?

Det som får motoren til å tørne er jo sekvensen du skriver ut på dine tre pinner.

Frekvensen på denne styrer farta til motoren.

Hvor kommer PWM inn? - om den skal styre effekt, ville jeg nok ha tenkt på en annen måte.

 

(Men ikke misstenk meg for å ha fasiten her - jeg har aldri prøvd å styre slike motorer, og har ikke mye erfaring fra arduino heller - er fersk på det, men har drevet med elektronikk siden tidlig steinalder.)

Motoren skal ikke styres som en vanlig børsteløsmotor på hastighet, men heller som en steppermotor med posisjonering. Og for å få nøyaktig posisjonering mellom de relativt grove "stegene" brukes PWM for å få flere småsteg (microstepping) mellom hvert "hardware steg" (full step).

 

De 3 utgangene lager altså ved hjelp av PWM en slags 3-fase pseudo sinus med 8 bit oppløsning.

Endret av flesvik
Lenke til kommentar

 

 

 

 

Problemet er at MOSFET'ene blir VELDIG varme etter bare få sekunder med kjøring av motoren. Jeg har forsøkt med litt forskjellige PWM frekvenser uten at det hjalp. Hvorfor skjer dette? Og hvordan kan jeg løse det?

 

Det er mulig jeg er på feil bærtur her, men hvorfor PWM i først omgang?

Er det et forsøk på å styre effekt?

Det som får motoren til å tørne er jo sekvensen du skriver ut på dine tre pinner.

Frekvensen på denne styrer farta til motoren.

Hvor kommer PWM inn? - om den skal styre effekt, ville jeg nok ha tenkt på en annen måte.

 

(Men ikke misstenk meg for å ha fasiten her - jeg har aldri prøvd å styre slike motorer, og har ikke mye erfaring fra arduino heller - er fersk på det, men har drevet med elektronikk siden tidlig steinalder.)

Motoren skal ikke styres som en vanlig børsteløsmotor på hastighet, men heller som en steppermotor med posisjonering. Og for å få nøyaktig posisjonering mellom de relativt grove "stegene" brukes PWM for å få flere småsteg (microstepping) mellom hvert "hardware steg" (full step).

 

De 3 utgangene lager altså ved hjelp av PWM en slags 3-fase pseudo sinus med 8 bit oppløsning.

 

Prøver å se for meg signalene ut av Teensyen din, og tror min bærtur ut på jordet fremdeles kan kan noe for seg.

Rett meg om jeg tar feil av koden din - du justerer PWM etter en sinusform, med 120 graders forskjell på utgangene.

Utgangene som gir PWM ut, jobber alle på samme interne klokke, og det er kun duty cycle på PWM signalet som endres.

I så tilfelle er det effektive signalet ditt til motor kun differansen på duty cycle mellom de tre utgangene.

Du vil som du skriver få en psudo sinus, men du vil også switche alle utganger i takt i den ene enden av syklusen, og det er ganske unødvendig Det er tross alt fasen mellom signalene ut som driver motor, og i den ene enden av en syklus vil den være lik på alle utganger. Da tenker jeg ikke på din sinus, men PWM signalet.

Endret av avo
Lenke til kommentar

 

 

 

 

 

Problemet er at MOSFET'ene blir VELDIG varme etter bare få sekunder med kjøring av motoren. Jeg har forsøkt med litt forskjellige PWM frekvenser uten at det hjalp. Hvorfor skjer dette? Og hvordan kan jeg løse det?

 

Det er mulig jeg er på feil bærtur her, men hvorfor PWM i først omgang?

Er det et forsøk på å styre effekt?

Det som får motoren til å tørne er jo sekvensen du skriver ut på dine tre pinner.

Frekvensen på denne styrer farta til motoren.

Hvor kommer PWM inn? - om den skal styre effekt, ville jeg nok ha tenkt på en annen måte.

 

(Men ikke misstenk meg for å ha fasiten her - jeg har aldri prøvd å styre slike motorer, og har ikke mye erfaring fra arduino heller - er fersk på det, men har drevet med elektronikk siden tidlig steinalder.)

Motoren skal ikke styres som en vanlig børsteløsmotor på hastighet, men heller som en steppermotor med posisjonering. Og for å få nøyaktig posisjonering mellom de relativt grove "stegene" brukes PWM for å få flere småsteg (microstepping) mellom hvert "hardware steg" (full step).

 

De 3 utgangene lager altså ved hjelp av PWM en slags 3-fase pseudo sinus med 8 bit oppløsning.

 

Prøver å se for meg signalene ut av Teensyen din, og tror min bærtur ut på jordet fremdeles kan kan noe for seg.

Rett meg om jeg tar feil av koden din - du justerer PWM etter en sinusform, med 120 graders forskjell på utgangene.

Utgangene som gir PWM ut, jobber alle på samme interne klokke, og det er kun duty cycle på PWM signalet som endres.

I så tilfelle er det effektive signalet ditt til motor kun differansen på duty cycle mellom de tre utgangene.

 

 

Har puttet verdiene som går til pwm til de 3 utgangene i en kort periode i excel her for å illustrere hvordan det ser ut:

 

sinus_zpse1dd08c3.jpg

 

Printet rett fra "Serial.print" funksjonen i koden som jeg bruker til debuging via serial monitoren på Arduino softwaren også puttet inn i excel.

 

Som du ser er det altså 3 fase sinus (men det er noen små "hakk" som sikkert kommer av noe timing issues)

 

Dette blir da om til noe slikt noe på utgangene:

L0013_PWM.png

bare at jeg har mye høyere PWM frekvens i forhold til sinus frekvensen så firkantpulsene kommer rimelig tett på oscilloskopet. Oscilloskopet mitt hengte seg når jeg prøvde å lagre bildet på en minnepinne så jeg kan ikke vise hvordan det reelle utsignalet ser ut her.

Jeg prøvde også som en test å sette på en kondensator og en motstand som et RC lavpassfilter på den ene utgangen og med litt justering av motstandsverdien fikk jeg da en fin sinus kurve på oscilloskopet.

 

Så ja det er helt korrekt som du sier at det kun er duty cycle som varierer på de tre utgangene. Men siden frekvensen på PWM er såpass høy så vil motoren "oppfatte det" som en sinus kurve.

 

Jeg kan legge til at det virker som at det er P-channel MOSFET'ene (altså de på toppen mot VCC Q4, Q5 og Q6 på tegningen) som kjennes ut til å bli suverent varmest, mens N-channel MOSFET'ene bare blir litt lunkene og de små signal transistorene holder seg kjølige.

Endret av flesvik
Lenke til kommentar

Prøv noe så simpelt som å sette 50% duty cycle på alle utgangene, og se hva som skjer.

Da kan du måle om kretsen din oppfører seg som den skal.

I prinsippet skal det gå latterlig lite strøm, og (i alle fall med true rms måling) bør du ligge på VCC/2 på alle utganger.

Lenke til kommentar

Fant ut at det var det jeg mistenkte som var problemet. At fall og stigetiden på MOSFET'ene gjør så de kortslutter mot hverandre i et lite øyeblikk akkurat i overgangen mellom av og på.

Og at masser av produsenter faktisk lager IC'er akkurat for å unngå nøyaktig dette problemet ved å legge inn en liten forsinkelse mellom når den ene slås av og den andre på. Og med disse IC'ene kan man også bruke kun N-channel MOSFET'er så jeg slipper å ha både N-channel og P-channel, men kan ha bare 6 stk N-channel per motor.

 

Så jeg kjøpte noen stk av IRS2004PBF som er en billig slik drivkrets i DIL-8 pakke (så jeg kan putte den inn i breadbordet)

Endret av flesvik
Lenke til kommentar

Jeg tenkte å prøve ut dette for å lære koding, men er dette noe som blir brukt i jobb sammenheng eller er det bare et programmeringsspråk som er laget på gøy(forstod det slik da jeg leste litt om Arduino).

 

Grunnen til at jeg lurer er at jeg er utdannet automatiker og har lyst å utvide kunnskapen min litt. Men er usikker på om jeg burde gå for et annet programmeringsspråk?

Lenke til kommentar

Jeg tenkte å prøve ut dette for å lære koding, men er dette noe som blir brukt i jobb sammenheng eller er det bare et programmeringsspråk som er laget på gøy(forstod det slik da jeg leste litt om Arduino).

 

Grunnen til at jeg lurer er at jeg er utdannet automatiker og har lyst å utvide kunnskapen min litt. Men er usikker på om jeg burde gå for et annet programmeringsspråk?

Tja "strukturert tekst" som jo er et IEC standard PLS programmeringsspråk (heter f.eks SLC i Siemens verden) kan jo sammenliknes litt med C++ som brukes i arduino, men det er egentlig ganske så forskjellig da "strukturert tekst" språket er et mye høyere nivå språk så det eneste som er likt er vel IF-setninger og slike generelle strukturer. Selv holder jeg meg til "funksjonsblokk" så mye jeg kan i PLS programmering og bare bruker "strukturert tekst" eller "instruksjonsliste" når det er absolutt nødvendig eller påkrevd. Men det er jo en del som sverger til å kun bruke "strukturert tekst" i PLS programmering (spesiellt Tyskere har jeg inntrykk av).

Også brukes det jo ofte også C liknende språk i en del SCADA og HMI systemer når man skal lage scripts der for å gjøre spesielle funksjoner. Så det er ganske greit å kunne det ihvertfall grunnleggende.

 

Men hvis du ser bort fra automasjon så er det vel i høyeste grad et språk som brukes i jobbsammenheng i dataprogrammering og i programmering av microkontrollere i elektronikk industrien.

Endret av flesvik
Lenke til kommentar

Fant ut at det var det jeg mistenkte som var problemet. At fall og stigetiden på MOSFET'ene gjør så de kortslutter mot hverandre i et lite øyeblikk akkurat i overgangen mellom av og på.

Og at masser av produsenter faktisk lager IC'er akkurat for å unngå nøyaktig dette problemet ved å legge inn en liten forsinkelse mellom når den ene slås av og den andre på. Og med disse IC'ene kan man også bruke kun N-channel MOSFET'er så jeg slipper å ha både N-channel og P-channel, men kan ha bare 6 stk N-channel per motor.

 

Så jeg kjøpte noen stk av IRS2004PBF som er en billig slik drivkrets i DIL-8 pakke (så jeg kan putte den inn i breadbordet)

 

https://www.diskusjon.no/uploads/monthly_02_2012/post-51478-0-77209100-1330020616.png

 

Ta en titt på min løsning her for å drive en P/N MOSFET. R9, R10 og D7 reduserer tiden på P og N er på ved switching. Ikke helt perfekt, så jeg trengte fremdels kjøling, men mye bedre enn om jeg ikke har det.

R4, R9 og R10 må være liten da R4, R9 og R10 og gate cap på P/N MOSFET lager et RC led som gir lang stige fall tid. Bedre løsning: R9, R10, og D7 kan beholdes, men det burde være et pnp/npn steg til mellom disse og R4 og Q1 for å gi bedre stige fall tid.

Endret av Dr_VingTor
Lenke til kommentar
  • 1 måned senere...

Har blitt oppslukt av Arduino og har bestemt meg for å begynne prøve meg på Arduino som hobby. Har bestilt mykje komponentar frå kina og bok på nesten 700 sider om Arduino.

 

Kan litt C++ programmering og kan eindel om elektroniske kretsar og har stor interesse for elektronikk, så Arduino blir nok den nye hobbyen min. Den dagen min Arduino UNO dukkar opp i postkassa mi blir som julafta for meg. :xmas:

Lenke til kommentar

Har blitt oppslukt av Arduino og har bestemt meg for å begynne prøve meg på Arduino som hobby. Har bestilt mykje komponentar frå kina og bok på nesten 700 sider om Arduino.

 

Kan litt C++ programmering og kan eindel om elektroniske kretsar og har stor interesse for elektronikk, så Arduino blir nok den nye hobbyen min. Den dagen min Arduino UNO dukkar opp i postkassa mi blir som julafta for meg. :xmas:

Samme her. Har bestilt masse fra dealextreme, som er på vei i posten. Har ikke så mye erfaring med programmering fra før, så jeg prøve å lære så mye jeg kan før jeg får pakke i posten ;)

Lenke til kommentar

 

Har blitt oppslukt av Arduino og har bestemt meg for å begynne prøve meg på Arduino som hobby. Har bestilt mykje komponentar frå kina og bok på nesten 700 sider om Arduino.

 

Kan litt C++ programmering og kan eindel om elektroniske kretsar og har stor interesse for elektronikk, så Arduino blir nok den nye hobbyen min. Den dagen min Arduino UNO dukkar opp i postkassa mi blir som julafta for meg. :xmas:

Samme her. Har bestilt masse fra dealextreme, som er på vei i posten. Har ikke så mye erfaring med programmering fra før, så jeg prøve å lære så mye jeg kan før jeg får pakke i posten ;)

 

Det eg har bestilt er billig frå kina via E-bay, det er lang leveringstid, men eg skal sjekke ut kva dei har på dealextreme også.

 

For nybyrjarar så finst det ekstremt mykje guidar på nett. Søk for eksempel på "arduino .pdf", då finner du lett mange gode gratis bøker som passar perfekt for dei som vil komme i gang Arduino.

Lenke til kommentar
  • 2 uker senere...

Heisann! Lurer bare på om jeg burde kjøpe Sparkfun SIK kittet (Sparkfun Inventors Kit), eller Arduinos starter kit? Etter det jeg kan se har Arduino starter kit flere deler, eller vil man ha andre fordeler ved å gå for SIK? Er det noen andre starter kit jeg heller burde velge? Hadde vært supert med kjapt svar, da jeg gjerne vil komme raskt i gang med Arduino :)

 

Link til Sparkfun SIK: https://www.sparkfun.com/products/retired/11227

 

Link til Ardunio starter kit:

http://arduino.cc/en/Main/ArduinoStarterKit

 

Edit:

 

Det har jo også kommet et nytt arduino brett, burde jeg se på det?

Endret av MrPear
Lenke til kommentar

Gå for hva du vil. Selv så likte jeg Sparkfun sitt kit best. Men det er hips som haps va du går for. Du kan jo også bare kjøpe et sett mye billigere fra Kina. Gå for en Uno. 32bits avr er ikke noe du ønsker å starte med for å si det slik..

Må bare spørre hvorfor du syntes Sparkfun var best? Det er jo færre dingser i det kittet

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...