BLDC Motor Control med Arduino, bärgades HD motor och hallgivare (11 / 12 steg)

Steg 11: Styrprogram för Arduino



Nedan är hela programmet som jag skrev för Ardjuino, med kommentarer ingår:
/*
* BLDC_congroller 3.1.1
* av David Glaser
*
* Den 3.x serien program är för ST L6234 3-fas Motor Driver IC
*
* Kör en driva motor medurs
* Med regenerativ bromsning
* Varvtal och bromsning styrs av en enda potentiometer
* Motor position bestäms med tre Hall-effekt sensorer

* Arduino får utgångar från 3 hallgivare (stift 2,3,4)
* och omvandlar deras kombination till 6 olika förvandling steg
* PWM utgångar på stift 9,10,11, vid 32 kHz (motsvarande EN 1,2,3 respektive
* 3 göra på stiften 5,6,7 (i 1,2,3)
* Analog in 0 är ansluten till en potentiometer till ändra tullen som PWM och ändra
* mellan bilismen och regenerativ bromsning.
0-499: bromsning
* 500-523: utrullning
* 524-1023: bilism
* Det finns många rader kommenterade ut som användes för avlusning av
* skriva ut olika värden för seriell anslutning.
*/

int HallState1; Variabler för tre hall sensorer (3,2,1)
int HallState2;
int HallState3;
int HallVal = 1; binära värdet av alla 3 hallgivare

int mSpeed = 0; Speed nivå av motorn
int bSpeed = 0; bromsning nivå
int gaspådrag = 0; variabeln används med analog i att mäta positionen för potentiometer spjäll

void setup() {
pinMode(2,INPUT); Hall 1
pinMode(3,INPUT); Hall 2
pinMode(4,INPUT); Hall 3

Utgångar för L6234 Motor föraren
pinMode(5,OUTPUT); I 1
pinMode(6,OUTPUT); I 2
pinMode(7,OUTPUT); I 3
pinMode(9,OUTPUT); EN 1
pinMode(10,OUTPUT); EN 2
pinMode(11,OUTPUT); EN 3

Serial.BEGIN(9600); avkommentera den här raden om du vill använda seriell anslutning
även avkommentera Serial.flush kommando vid slutet av programmet.

/ * Anger PWM frekvens på stift 9,10 och 11
denna bit av koden kommer från
http://usethearduino.blogspot.com/2008/11/Changing-PWM-Frequency-on-Arduino.html
*/
Ställ in PWM för stift 9,10-32 kHz
Först ta bort alla tre prescaler bitar:
int prescalerVal = 0x07; skapa en variabel som kallas prescalerVal och ange den motsvarar det binära tal som "00000111" nummer "00000111" talet "00000111"
TCCR1B & = ~ prescalerVal; OCH värdet i TCCR0B med binärt tal "11111000"

Nu Ställ rätt prescaler bitar:
int prescalerVal2 = 1; Ange prescalerVal till binärt tal "00000001"
TCCR1B | = prescalerVal2; ELLER värdet i TCCR0B med binärt tal "00000001"

Ställ in PWM för stift 3,11 till 32 kHz (enda stift 11 används i detta program)
Först ta bort alla tre prescaler bitar:
TCCR2B & = ~ prescalerVal; OCH värdet i TCCR0B med binärt tal "11111000"

Nu Ställ rätt prescaler bitar:

TCCR2B | = prescalerVal2; ELLER värdet i TCCR0B med binärt tal "00000001" //First avmarkera alla tre prescaler bitar:

}
MAIN, KRETSAR AV PRGROM
void loop() {

tid = millis();
skriver ut tid sedan programmet startade
Serial.println(Time);
Serial.Print("\n");

gaspådrag = analogRead(0); värdet av potentiometer spjäll
mSpeed = karta (gasspjäll, 512, 1023, 0, 255); bilismen har mappats till den övre halvan av potentiometer
bSpeed = karta (spjäll, 511, 255, 0, 0); regenerativ bromsning på nedre hälften av potten
mSpeed = 100; för felsökning

HallState1 = digitalRead(2); Läs indatavärde från Hall 1
HallState2 = digitalRead(3); Läs indatavärde från Hall 2
HallState3 = digitalRead(4); Läs indatavärde från Hall 3
digitalWrite 8, HallState1. Lysdioder aktiverad när motsvarande sensor är hög - ursprungligen används för felsökning
digitalWrite (9, HallState2).
digitalWrite 10, HallState3.

HallVal = (HallState1) + (2 * HallState2) + (4 * HallState3); Beräknar det binära värdet av de 3 hallgivare

/*Serial.Print ("H 1:"); för felsökning
Serial.println(HallState1);
Serial.Print ("H 2:");
Serial.println(HallState2);
Serial.Print ("H 3:");
Serial.println(HallState3);
Serial.println("");
*/

Serial.println(mSpeed);
Serial.println(HallVal);
Serial.Print("\n");

Monitor transistorutgångar
Delay(1000);
/ * T1 = digitalRead(2);
T1 = ~ T1;
T2 = digitalRead(4);
T2 = ~ T2;
T3 = digitalRead(5);
T3 = ~ T3;
Serial.Print(T1);
Serial.Print("\t");
Serial.Print(T2);
Serial.Print("\t");
Serial.Print(T3);
Serial.Print("\n");
Serial.Print("\n");
Serial.Print(digitalRead(3));
Serial.Print("\t");
Serial.Print(digitalRead(9));
Serial.Print("\t");
Serial.println(digitalRead(10));
Serial.Print("\n");
Serial.Print("\n");
Delay(500);
*/

Kommutering för bilismen
Varje binärt tal har ett fall som motsvarar olika transistorer är påslagen
Lite matematik används för att ändra värdena för utdata
För läraren på bitmath med Arduino: http://www.arduino.cc/playground/Code/BitMath
PORTD innehåller utgångarna för IN stiften på L6234 föraren
som avgör om den övre eller nedre transistorn av varje fas används
Utgångar för sv stiften styrs av Arduino kommandot analogWrite, som
anger skyldighet PWM (0 = OFF, 255 = ON eller throttle värde som styrs av potentiometer).

om (spjäll > 511) {
växel (HallVal)
{
fall 3:
PORTD = B011xxx00; Önskad effekt för stift 0-7 xxx refererar till Hall ingångar, som inte bör ändras
PORTD & = B00011111;
PORTD | = B01100000; //

analogWrite(9,mSpeed); PWM på fas A (hög side transistor)
analogWrite(10,0); Fas B off (tull = 0)
analogWrite(11,255); Fas C - jourhavande = 100% (underkant transistor)
bryta;
fall 1:
PORTD = B001xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111; //
PORTD | = B00100000; //

analogWrite(9,mSpeed); PWM på fas A (hög side transistor)
analogWrite(10,255); Fas B på (underkant transistor)
analogWrite(11,0); Fas B off (tull = 0)
bryta;
fall 5:
PORTD = B101xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111; //
PORTD | = B10100000;

analogWrite(9,0);
analogWrite(10,255);
analogWrite(11,mSpeed);
bryta;
fall 4:
PORTD = B100xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD | = B10000000; //

analogWrite(9,255);
analogWrite(10,0);
analogWrite(11,mSpeed);
bryta;
fall 6:
PORTD = B110xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD = B11000000; //

analogWrite(9,255);
analogWrite(10,mSpeed);
analogWrite(11,0);
bryta;
fall 2:
PORTD = B010xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD | = B01000000; //

analogWrite(9,0);
analogWrite(10,mSpeed);
analogWrite(11,255);
bryta;
}
}

Kommutering för regenerativ bromsning
PORTD (resultat för i stiften på L6234) stift är alltid låga så att endast den
lägre transistorer på varje fas används
övre transistorer är alltid under regen. bromsning.
annat {
PORTD = B000xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD | = B00000000; //
växel (HallVal)
{
fall 3:
analogWrite(9,bSpeed);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);
bryta;
fall 1:
analogWrite(9,bSpeed);
analogWrite(10,0);
analogWrite(11,0);
bryta;
fall 5:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
bryta;
fall 4:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
bryta;
fall 6:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
bryta;
fall 2:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
bryta;
}
}
tid = millis();
skriver ut tid sedan programmet startade
Serial.println(Time);
Serial.Print("\n");
Serial.flush(); avkommentera detta om du vill använda seriell port för felsökning
}

Se Steg
Relaterade Ämnen

Gå av i soffan, med Arduino, 3d tryckta inhägnad och programmerade med Embrio

Den grundläggande idén är att skapa något som kan upptäcka när mina hundar får på soffan när inte jag är där och "uppmuntra dem att få bort". Detta sker med en passiv IR-sensor och gör oljud att hundar inte gillar.Jag såg ett annat liknande proj...

Programming AVR med Arduino som ISP utan bootloader och externa crystal

Hej, jag är riktronics , och detta är min första instructable. Här förklarade jag hur till bränna program i din AVR microcontroller med en Arduino. Av detta behöver du inte köpa dyra AVR programmerare om du redan har en Arduino. Och jag antar att du...

Bygga en XBMC/KODI remote med Arduino, IR-Sensor sköld och VB.NET

Bygga en XBMC/KODI remote med Arduino och en IR-Sensor sköld, som kommer att arbeta med någon fjärrkontroll.Jag ville styra min XBMC/Kodi dator från min satellitdekoder avlägsen, eftersom jag antingen titta på filmer på XMBC/Kodi eller satellit-TV, s...

Hem larm eller rörelsedetektor med Arduino,P.I.R Sensor och LCD.

Hej alla,Idag ska jag visa dig hur man gör ett intressant, underbar, Billigt hem larm. Denna Gadget hjälper dig att skydda ditt hus mot tjuvar. I detta projekt ska jag använda en Freeduino Board(Arduino Compatible),P.I.R Sensor module,LCD and some ot...

Spåra din väg! (med arduino, microSD card sköld och GPS)

Använda Arduino Mega, MT3329 MediaTek GPS, Arduino MicroSD data logga sköldoch ett par 9V batterier, göra en liten enhet som kan gå någonstans och sedan mappa resan i ett enkelt steg.Steg 1: Hårdvara behövs Micro SD cardMicroSD kort sköldArduino Mega...

Hur man bränner optiboot botloader på Atmega8 med Arduino IDE 1.6.x och 1.5.x

Jag använde gamla NG bootloader, men jag har några problem med den. Det tar ungefär 8 sekunder för att starta Atmega och det stickat ibland. När jag ville bränna optiboot, får jag meddelandet:"eka" memory typ inte definierats för del "ATMEG...

Upphöjd skrivbord hylla med multi-färgade ledde

Detta är en upphöjd skrivbord hylla gjorde jag eftersom den gamla var ful och jag behövde mer utrymme för alla mina hobby saker. Så jag beslöt att göra en kylare ny upp ledde skrivbord hylla med multi färgade fläckar och lådor. Lysdioder är från adaf...

AVR programmering med Arduino, AVRdude och AVR-gcc

AVR är en gemensam, billig typ av mikro-controller som kan verka skrämmande att arbeta med, men oroa dig inte! När du har Ställ in grundläggande kunskap och kan de bli inte bara nyttigt, men viktigt att nya projektidéer som du drömmer upp!Denna handl...

Hemautomation med Arduino... Och JavaScript!

I detta instructable (mitt första som faktiskt), jag hjälper dig att göra automatisering i hemmet med Arduino, ja, inte så ny... Men vi kommer även JavaScript, med Node.js och en awesome bibliotek att interagera med Arduino heter johnny-fem (Ja, som...

Gränsyta borstlös likströmsmotor (BLDC) med Arduino

Detta är en handledning om hur att gränssnitt och köra en borstlös likströmsmotor med Arduino. Om du har några frågor eller kommentarer vänligen svara i kommentarer eller mail till rautmithil [at] gmail [dot] com. Du kan också kontakta mig @mithilrau...

Köra CD-ROM Borstlös Motor med Arduino + 3 Mosfet transistorer

A borstlös likströmsmotor eller BLDC är en typ av motor utan varje brush. Det innebär att det finns ingen direkt anslutning (pensel) mellan roterande spindel och andra fasta delar som rullar. Så spinning är avkastningen av förändringar i nuvarande ri...

Kör en CDROM Borstlös Motor med Arduino

en borstlös likströmsmotor eller BLDC är en typ av motor utan varje brush. Det innebär att det finns ingen direkt anslutning (pensel) mellan roterande spindel och andra fasta delar som rullar. Så är spinning avkastningen av förändringar i nuvarande r...

Baserade Arduino House värmare Controler med SMS användargränssnitt

projektet innehåller instruktioner och koden för att bygga en uppvärmning controller för ditt hem eller avlägsna land hus, som kan kontrolleras och övervakas av GSM via SMS-kommandon. Jag började att utforma det så vi behövde en pålitlig och Register...

Gränsyta för motorer med Arduino

Gränsyta för olika typer av motorer med en mikro-controller är bland de mest grundläggande färdigheter en maker/robotics entusiasten behov att bemästra. I detta projekt ska jag bygga upp på den tidigare projektet Smart telefon kontrollerad LED-lampor...

PIR-SENSOR med ARDUINO aktivera STEPPER MOTOR

AKTIVERA STEPPER MOTOR MED RÖRELSESENSORSteg 1: PIR med ARDUINO aktiverat STEPPER MOTORHej denna instactable att rotera stepper motor förord och bakåt när pir läsa några rörelse.Steg 2: Del kräver1-ARDUINO UNO2-PIR(HUMAN MOTION SENSOR)3-L293D (MOTOR...

Hur man kontrollerar DC-motorer med Arduino

Vi har nyligen avslutat utforma vår kompakta plug-and-play Arduino robot och släppte den på kicken. Vi söker för närvarande uppbackare.Med denna robotic kit, det är mycket lätt att ansluta motorer, sensorer och kommunikationsmoduler genom att helt en...

Remote Control bil med Arduino och Bluetooth

Projektet består i att göra en fjärrkontroll bil använder en bluetooth-anslutning. Denna bil är tänkt att användas i en ballong poppar konkurrens mot andra liknande bilar. Den trådlösa anslutningen uppnås genom att använda en bluetooth-modul som är a...

Weed trimmer motor ersättas med borstlösa RC lastbil motor och använder en Arduino kontroll ombord

I år har jag använt min trimmer med uppgraderade LiPo batterier, ungefär som de som används i en RC-bil. LiPo batterier har fungerat bra och som mycket mer trimmern Använd tid på ganska lite mindre vikt. Problemet var motorn slutligen gav ut häromdag...

Hur använder gamla Stepper Motors med Arduino och A4988 Driver

Jag har varit med stegmotorer ett tag nu, och de är fantastiska för alla typer av robotic projekt.Idag kommer jag att dela de saker jag har lärt mig hittills om återanvända gamla stegmotorer bärgades från skrivare. Identifiera stegmotorerStegmotorer...