Använda BLDC-hallsensorer som positionsankodare – del 3

Använd en Teensy 3.5 mikrostyrenhet för att beräkna position, riktning och avstånd

Följande information är avsedd att hjälpa till att tolka logiska utsignaler från hall-sensorer för att kunna avgöra position, riktning och hastighet. Även om utsignalerna kan användas för motorkommutation förklaras inte den aspekten av BLDC-motordrift här.

Se del 1 och del 2 i den här bloggserien för att gå igenom det här projektet upp till den här punkten.

Översikt

När utmatningen från de tre halleffektsensorerna i en BLDC matas till en mikrostyrenhet, kan signalerna bearbetas som en trekanals kodomvandlare. Data kan visas eller användas för att avgöra pulsvärde, rotationsriktning och genomsnittligt varvtal (varv/min). Varvtalet är ett genomsnitt för att ge en smidig progression i de visade värdena.

PJRC Teensy 3.5 utvecklingskort

PJRC Teensy 3.5 utvecklingskort från SparkFun (1568-1464-ND) har fler digitala brytare än nog för att hantera de tre signalingångarna från Hall-sensorerna och det levereras med fastlödda stiftlister. Teensy 3.5 är tillräckligt kraftfullt för att köra många ytterligare uppgifter på grund av ett stort antal ytterligare I/O-kanaler och kan användas för dataloggning med det inbyggda SD-kortet.

Figur 1: SparkFun Electronics Teensy 3.5 utvärderingskort. (Bildkälla: SparkFun Electronics)

Prototypkortsanslutning av sensorutgångar och PJRC Teensy 3.5

Att använda en prototypkortanslutning (438-1045-ND eller liknande), placerar Teensy 3.5 med USB-kontakten till höger och de övre stiften i stiftlisten isatta i den första radens prototypkorthål över avdelningen (figur 2). Detta ger tillräckligt utrymme för anslutning av sensorutgångarna till Teensy I/O.

Figur 2: Prototypkort med Teensy 3.5 utvecklingskort och byglingsanslutningar. (Bildkälla: DigiKey)

Använd solida byglingsledningar (BKWK-3-ND) för att skapa alla prototypkortanslutningar. Anslut den positiva (+) ledaren från en 5 V, 1 A strömförsörjning till den övre eller nedre positiva strömskenan på prototypkortet och anslut sedan den negativa (-) försörjningsledaren till den övre eller nedre negativa strömskenan. Anslut de positiva (röd) och negativa (svart) ledarna från hallsensorn till de positiva och negativa skenorna på prototypkortet och anslut sedan de tre sensorledarna från kontaktstycket till Teensy 3.5 på stift 2, 3 och 4 i valfri ordning.

Sensorutsignalen är aktivt låg vilket innebär att när den utlöses ska utgången anslutas till den negativa strömlinjen. När den inte är utlöst måste sensorutsignalen dras upp till den positiva strömlinjen för att etablera två definierade logiska statusar. Sätt i tre motstånd på 4 kΩ – 8 kΩ i prototypkortet som ska användas för att lyfta upp sensorutsignalen (figur 2).

Anslut Teensy 3.5 till en dator med en USB micro B till standard A-kabel.

Programvara

Teensy 3.5 är kompatibelt med Arduino Integrated Development Environment (IDE) i programmeringssyfte. IDE och Teensyduino-tillägget är tillgängliga online. Följ installationsrutinerna på https://www.pjrc.com/teensy/td_download.html för att fortsätta.

Programmeringsexempelkoden nedan använder tre maskinvarubrytare för att övervaka eventuella förändringar (stigande och fallande) i Hall-sensorutgångarna. När ett avbrott sker läses den klockan för förfluten tid för Teensy 3.5 och två av de tre ingångsstiften av. Sensorvärdena jämförs för att avgöra rotationsriktningen och därefter utförs andra beräkningar för att avgöra pulsvärde och genomsnittligt varvtal. Tiden mellan avbrott beräknas genom att jämföra det aktuella klockvärdet med det lagrade klockvärdet från föregående avbrott.

Fyra värden är tillgängliga för seriell utskrift inuti den tomma slingan. Kommentera eller avkommentera kodrader för att avaktivera eller aktivera den seriella utskriftsfunktionen och ladda sedan ner koden till Teensy och starta den seriella övervakaren för att visa livedata. Dra runt BLDC-motorn för att observera förändringarna i värdena i utskriftsövervakaren.

Obs! Seriella utskriftsfunktioner saktar ner mikrostyrenheten. I/O-avbrotten får de visade värdena att stanna till och hoppa eftersom den seriella utskriftsprocessen av definition avbryts varje gång ett ingångsstift ändrar status. Om visningsfunktionen inte används, se till att alla seriella utskriftsfunktioner kommenteras utanför koden.

Kopiera/* BLDC hallsensor avläsnings- och beräkningsprogram för Teensy 3.5 i Arduino IDE (Ver.1). DigiKey*/ /***************************** Variables *********************************/ #define CW 1 // Assign a value to represent clock wise rotation #define CCW -1 // Assign a value to represent counter-clock wise rotation bool HSU_Val = digitalRead(2); // Set the U sensor value as boolean and read initial state bool HSV_Val = digitalRead(3); // Set the V sensor value as boolean and read initial state bool HSW_Val = digitalRead(4); // Set the W sensor value as boolean and read initial state int direct = 1; // Integer variable to store BLDC rotation direction int pulseCount; // Integer variable to store the pulse count float startTime; // Float variable to store the start time of the current interrupt float prevTime; // Float variable to store the start time of the previous interrupt float pulseTimeW; // Float variable to store the elapsed time between interrupts for hall sensor W float pulseTimeU; // Float variable to store the elapsed time between interrupts for hall sensor U float pulseTimeV; // Float variable to store the elapsed time between interrupts for hall sensor V float AvPulseTime; // Float variable to store the average elapsed time between all interrupts float PPM; // Float variable to store calculated pulses per minute float RPM; // Float variable to store calculated revolutions per minute /***************************** Setup *********************************/ void setup() { // Set digital pins 2, 3 and 4 as inputs pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); // Set digital pins 2, 3 and 4 as interrupts that trigger on rising and falling edge changes. Anropa en funktion (t.ex. HallSensorU) on change attachInterrupt(digitalPinToInterrupt(2), HallSensorU, CHANGE); attachInterrupt(digitalPinToInterrupt(3), HallSensorV, CHANGE); attachInterrupt(digitalPinToInterrupt(4), HallSensorW, CHANGE); // Initialize the print monitor and set baud rate to 9600 Serial.begin(9600); } /*************************** Main Loop ******************************/ void loop() { if ((millis() - prevTime) > 600) RPM = 0; // Zero out RPM variable if wheel is stopped //Serial.print(HSU_Val); Serial.print(HSV_Val); Serial.println(HSW_Val); // Display Hall Sensor Values //Serial.println(direct); // Display direction of rotation //Serial.println(pulseCount); // Display the pulse count Serial.println(RPM); // Display revolutions per minute } /************************ Interrupt Functions ***************************/ void HallSensorW() { startTime = millis(); // Set startTime to current microcontroller elapsed time value HSW_Val = digitalRead(4); // Read the current W hall sensor value HSV_Val = digitalRead(3); // Read the current V (or U) hall sensor value direct = (HSW_Val == HSV_Val) ? CW : CCW; // Determine rotation direction (ternary if statement) pulseCount = pulseCount + (1 * direct); // Add 1 to the pulse count pulseTimeW = startTime - prevTime; // Calculate the current time between pulses AvPulseTime = ((pulseTimeW + pulseTimeU + pulseTimeV)/3); // Calculate the average time time between pulses PPM = (1000 / AvPulseTime) * 60; // Calculate the pulses per min (1000 millis in 1 second) RPM = PPM / 90; // Calculate revs per minute based on 90 pulses per rev prevTime = startTime; // Remember the start time for the next interrupt } void HallSensorV() { startTime = millis(); HSV_Val = digitalRead(3); HSU_Val = digitalRead(2); // Read the current U (or W) hall sensor value direct = (HSV_Val == HSU_Val) ? CW : CCW; pulseCount = pulseCount + (1 * direct); pulseTimeV = startTime - prevTime; AvPulseTime = ((pulseTimeW + pulseTimeU + pulseTimeV)/3); PPM = (1000 / AvPulseTime) * 60; RPM = PPM / 90; prevTime = startTime; } void HallSensorU() { startTime = millis(); HSU_Val = digitalRead(2); HSW_Val = digitalRead(4); // Read the current W (or V) hall sensor value direct = (HSU_Val == HSW_Val) ? CW : CCW; pulseCount = pulseCount + (1 * direct); pulseTimeU = startTime - prevTime; AvPulseTime = ((pulseTimeW + pulseTimeU + pulseTimeV)/3); PPM = (1000 / AvPulseTime) * 60; RPM = PPM / 90; prevTime = startTime; } 

Obs! Programmerare kan lockas att bryta ut repetitiv avbrottsfunktionskod till en tilläggsfunktion för att förenkla det övergripande programmet. Att göra detta kan leda till att tilläggsfunktionen avbryts och värdena ändras mellan beräkningarna, vilket ger upphov till datafel. Som noterats i prototypkortstegen och koden påverkar ordningen hos sensorinsignalerna endast bestämningen av rotationsriktningen. Avkommentera den seriella utskriftsraden för variabeln "direct" för att visa värdet i visningsövervakaren. Kontrollera att värdet håller sig på 1 eller -1 beroende på åt vilket håll du vrider ratten. Om det avviker, byt plats på "CW" och "CCW" i den ternära koden i motsvarande avbrottsfunktion för att korrigera utdata.

Sammanfattning

BLDC-hallsensorerna är nu konfigurerade som en trekanalig kodomvandlare med låg upplösning som kan leverera exakta data för att hjälpa till med navigation och avkänning av hjulposition utan att hindra deras primära motorstyrfunktion. Vissa BLDC-styrenheter använder endast motelektromotorisk kraft för att avgöra spol- och magnetposition vilket endast lämnar hallsensorutdata tillgängliga för navigation och positionsavkänning. Oavsett hur har sensorerna mer värde för användaren än bara motorkontroll.

Ytterligare resurser:

Arduino IDE: http://www.arduino.cc/en/Main/Software

Teensyduino: https://www.pjrc.com/teensy/td_145/TeensyduinoInstall.exe

Om skribenten

Image of Don Johanneck

Don Johanneck är teknisk innehållsutvecklare på DigiKey och har arbetat med oss sedan 2014. Han är ganska ny på sin tjänst som ansvarig för upprättande av videobeskrivningar och produktinnehåll. Don har nyligen tagit sin universitetsexamen i tillämpad vetenskap inom elektronikteknik och automatiserade system på Northland Community & Technical College med ett DigiKey-stipendium. På fritiden sätter han gärna av lite tid för radiostyrda modeller, renovering av gamla maskiner och mekande i allmänhet.

More posts by Don Johanneck
 TechForum

Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.

Visit TechForum