Incomplete library for configuration of a DRV8301 pre-driver through a SPI interface.

DRV8301 is 3-Phase Brushless Motor Pre-Driver with Dual Current Sense Amps and Buck Converter (PWM Ctrl w/ SPI). Please find more information on Texas Instruments web pages and datasheet.

Files at this revision

API Documentation at this revision

Comitter:
pantunovi
Date:
Sat Nov 28 10:59:46 2015 +0000
Parent:
4:98c76c7b8020
Child:
6:f245fce762f6
Commit message:

Changed in this revision

DRV8301.cpp Show annotated file Show diff for this revision Revisions of this file
DRV8301.h Show annotated file Show diff for this revision Revisions of this file
--- a/DRV8301.cpp	Tue Nov 24 13:50:20 2015 +0000
+++ b/DRV8301.cpp	Sat Nov 28 10:59:46 2015 +0000
@@ -1,101 +1,111 @@
 #include "DRV8301.h"
 #include "mbed.h"
 
-SPI spi(p11, p12, p13);
 
-DRV8301::DRV8301(PinName pcs, PinName pmosi, PinName pmiso, PinName psck, PinName pen_gate) : cs(pcs), mosi(pmosi), miso(pmiso), sck(psck), en_gate(pen_gate){
+DRV8301::DRV8301(PinName pcs, PinName pmosi, PinName pmiso, PinName psck, PinName pen_gate) : spi(p11, p12, p13), cs(pcs), mosi(pmosi), miso(pmiso), sck(psck), en_gate(pen_gate){
     
-    SPI spi(pcs, pmosi, pmiso, psck);
     
-    spi.format(16,1);
-    spi.frequency(1000000);
+    spi.format(16,1);           //format SPI komunikacije: 16-bitne riječi, mod 1 clocka
+    spi.frequency(1000000);     //frekvencija clocka 1MHz
     cs = 1;
     cs = 0;
     
-    startup();
-    register1 = spi.write(0x9000);
-    register2 = spi.write(0x9800);
-    
-}
-
-//funkcija za ograničenje struje
-
-void DRV8301::setCurrentLimit(uint8_t input){
-    uint16_t register1;
-    maskCurrentLimit = 0x783F;
-    register1 &= maskCurrentLimit;
-    register1 |= input << 6;
-}
- 
-//funkcija za broj PWM ulaza
-
-void DRV8301::setPWMNumber(uint8_t input){
-    uint16_t register1;
-    maskPWM = 0x7FF7;
-    register1 &= maskPWM;
-    register1 |= input << 3;
-}
+    startup();  //nužno izvršiti za slučaj da se u dosadašnjem radu pojavila pogreška, resetira cijeli DRV8301 te gasi sve dojave grešaka osim ukoliko su još uvijek prisutne
     
-//funkcija za mod OCP-a
-
-void DRV8301::setOCPMode(uint8_t input){
-    uint16_t register1;
-    maskOCP = 0x7FCF;
-    register1 &= maskOCP;
-    register1 |= input << 4;
-}
-
-//funkcija za mod OCTW-a 
-
-void DRV8301::setOCTW(uint8_t input){
-    uint16_t register2;
-    maskOCTW = 0x7FFC;
-    register2 &= maskOCTW;
-    register2 |= input;
-}
-    
-//funkcija za pojačanje
-
-void DRV8301::setGain(uint8_t input){
-    uint16_t register2;
-    maskGain = 0x7FF3;
-    register2 &= maskGain;
-    register2 |= input << 2;
-}
-
-//funkcija za dobivanje stanja u registru 1
-
-uint16_t DRV8301::getRegister1(){
-    uint16_t register1;
-    return register1;
-}
-   
-// funkcija za dobivanje stanja u registru 2
-
-uint16_t DRV8301::getRegister2(){
-    uint16_t register2;
-    return register2;
-}
-
-//funkcija za čitanje statusnog registra 1
-
-uint16_t DRV8301::readStatReg1(){
-    uint16_t statReg1 = spi.write(0x8000);
-    return statReg1;
-}
-
-//funkcija za čitanje statusnog registra 2
-
-uint16_t DRV8301::readStatReg2(){
-    uint16_t statReg2 = spi.write(0x8800);
-    return statReg2;
 }
 
 //funkcija za pokretanje (reboot) DRV-a
     
 void DRV8301::startup(){
-    en_gate = 0;
-    wait_us (25);
-    en_gate = 1;
-    wait (1);
-}
\ No newline at end of file
+    en_gate = 0;    //postavlja EN_GATE pin predupravljača u 0 čime gasi cijeli predupravljač
+    wait_us (25);   //čekanje od 25 mikrosekundi kako bi se izbjeglo blokiranje predupravljača
+    en_gate = 1;    //postavlja EN_GATE pin u 1 čime pokreće predupravljač
+    wait (1);   //čekanje od 1 sekunde
+}
+//funkcija za ograničenje struje
+
+void DRV8301::setCurrentLimit(uint8_t inputCL){
+    uint16_t controlRegister1 = spi.write(0x9000);  //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
+    int maskCurrentLimit = 0x783F;              //maska koja postavlja bitove za postavljanje ograničenja (bitovi D6, D7, D8, D9, D10 kontrolnog registra 1; datasheet) struje u 0 ne mijenjajući pritome ostale
+    controlRegister1 &= maskCurrentLimit;   //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
+    controlRegister1 |= inputCL << 6;         //uneseni broj input u binarnom obliku pomiče za 6 mjesta ulijevo kako bi se postavili na pravo mjesto u registru, provodi logičku ILI operaciju s varijablom  controlRegister1 te rezultat sprema
+    spi.write(controlRegister1);            //upisuje varijablu controlRegister1 u kontrolni registar 1
+}
+ 
+//funkcija za broj PWM ulaza
+
+void DRV8301::setPWMNumber(uint8_t inputPWMNumber){
+    uint16_t controlRegister1 = spi.write(0x9000);  //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
+    int maskPWM = 0x7FF7;                       //maska koja postavlja bitove registra zadužene za odabir broja PWM signala (bit D3 kontrolnog registra 1; datasheet) u 0 ne mijenjajući pritome ostale
+    controlRegister1 &= maskPWM;            //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
+    controlRegister1 |= inputPWMNumber << 3;         //uneseni broj input u binarnom obliku pomiče za 3 mjesta ulijevo kako bi se postavili na pravo mjesto u registru, provodi logičku ILI operaciju s varijablom  controlRegister1 te rezultat sprema
+    spi.write(controlRegister1);            //upisuje varijablu controlRegister1 u kontrolni registar 1
+}
+    
+//funkcija za mod OCP-a
+
+void DRV8301::setOCPMode(uint8_t inputOCPMode){
+    uint16_t controlRegister1 = spi.write(0x9000);  //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
+    int maskOCP = 0x7FCF;                       //maska koja postavlja bitove registra zadužene za odabir moda OCP-a (bitovi D4 i D5 kontrolnog registra 1; datasheet) u 0 ne mijenjajući pritome ostale
+    controlRegister1 &= maskOCP;            //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
+    controlRegister1 |= inputOCPMode << 4;         //uneseni broj input u binarnom obliku pomiče za 4 mjesta ulijevo kako bi se postavili na pravo mjesto u registru, provodi logičku ILI operaciju s varijablom  controlRegister1 te rezultat sprema
+    spi.write(controlRegister1);            //upisuje varijablu controlRegister1 u kontrolni registar 1
+}
+
+//funkcija za mod OCTW-a 
+
+void DRV8301::setOCTW(uint8_t inputOCTWMode){
+    uint16_t controlRegister2 = spi.write(0x9800);  //čita stanje kontrolnog registra 2 i sprema ga u varijablu controlRegister2
+    int maskOCTW = 0x7FFC;                      //maska koja postavlja bitove registra zadužene za odabir moda OCTW-a (bitovi D0 i D1 kontrolnog registra 2; datasheet) u 0 ne mijenjajući pritome ostale
+    controlRegister2 &= maskOCTW;           //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister2
+    controlRegister2 |= inputOCTWMode;              //s unesenim brojem input u binarnom obliku provodi logičku ILI operaciju s varijablom  controlRegister2 te rezultat sprema
+    spi.write(controlRegister2);            //upisuje varijablu controlRegister2 u kontrolni registar 2
+}
+    
+//funkcija za pojačanje
+
+void DRV8301::setGain(uint8_t inputGain){
+    uint16_t controlRegister2 = spi.write(0x9800);  //čita stanje kontrolnog registra 2 i sprema ga u varijablu controlRegister2
+    int maskGain = 0x7FF3;                      //maska koja postavlja bitove registra zadužene za odabir iznosa pojačanja (bitovi D2 i D3 kontrolnog registra 2; datasheet) u 0 ne mijenjajući pritome ostale
+    controlRegister2 &= maskGain;           //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister2
+    controlRegister2 |= inputGain << 2;         //uneseni broj input u binarnom obliku pomiče za 2 mjesta ulijevo kako bi se postavili na pravo mjesto u registru, provodi logičku ILI operaciju s varijablom  controlRegister2 te rezultat sprema
+    spi.write(controlRegister2);            //upisuje varijablu controlRegister2 u kontrolni registar 2
+}
+
+//funkcija za dobivanje stanja u registru 1
+
+uint16_t DRV8301::getControlRegister1(){
+    uint16_t controlRegister1 = spi.write(0x9000);  //šalje naredbu za čitanje u kontrolni registar 1 te dobiva odgovor kojega posprema u varijablu controlRegister1
+    return controlRegister1;
+}
+   
+// funkcija za dobivanje stanja u registru 2
+
+uint16_t DRV8301::getControlRegister2(){
+    uint16_t controlRegister2 = spi.write(0x9800);  //šalje naredbu za čitanje u kontrolni registar 2 te dobiva odgovor kojega posprema u varijablu controlRegister2
+    return controlRegister2;
+}
+
+//funkcija za čitanje statusnog registra 1
+
+uint16_t DRV8301::getStatusRegister1(){
+    uint16_t statusRegister1 = spi.write(0x8000);   //šalje naredbu za čitanje u statusni registar 1 te dobiva odgovorkojega posprema u varijablu statusRegister1
+    return statusRegister1;
+}
+
+//funkcija za čitanje statusnog registra 2
+
+uint16_t DRV8301::getStatusRegister2(){
+    uint16_t statusRegister2 = spi.write(0x8800);   //šalje naredbu za čitanje u statusni registar 2 te dobiva odgovorkojega posprema u varijablu statusRegister2
+    return statusRegister2;
+}
+
+//funkcija za ograničenje struje gate-a internog MOSFET-a
+
+void DRV8301::setGateCurrent(uint8_t inputGateCurrent){
+    uint16_t controlRegister1 = spi.write(0x9000);  //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
+    int maskGateCurrent = 0x7FFC;   //maska koja postavlja bitove registra zadužene za odabir struje gate-a (bitovi D0 i D1 kontrolnog registra 1; datasheet) u 0 ne mijenjajući pritome ostale
+    controlRegister1 &= maskGateCurrent; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
+    controlRegister1 |= inputGateCurrent;   //s unesenim brojem inputGateCurrent u binarnom obliku provodi logičku ILI operaciju s varijablom  controlRegister1 te rezultat sprema
+    spi.write(controlRegister1);    //upisuje varijablu controlRegister1 u kontrolni registar 1
+    }
\ No newline at end of file
--- a/DRV8301.h	Tue Nov 24 13:50:20 2015 +0000
+++ b/DRV8301.h	Sat Nov 28 10:59:46 2015 +0000
@@ -3,41 +3,104 @@
 
 #include "mbed.h"
 
+/** DRV8301 klasa izrađena za potrebe završnog rada.
+  * Koristi se za pokretanje i podešavanje postavki predupravljača DRV8301 pisanjem pomoću SPI sučelja izravno u kontrolne registre predupravljača
+  * te čitajući podatke iz statusnih registara kako bi se detektirale pogreške. Ova biblioteka služi kao jednostavno sučelje između korisnika i sustava
+  * koji obuhvaća predupravljač DRV8301 i mbed LPC1768  
+*/
 class DRV8301{
     public:
+        /** instancira DRV8301
+         */
         DRV8301(PinName cs, PinName mosi, PinName miso, PinName sck, PinName en_gate);
-        uint8_t input;
-        
-        void startup(); 
-        void setCurrentLimit(uint8_t input);
-        void setGain(uint8_t input);
-        void setPWMNumber(uint8_t input);
-        void setOCPMode(uint8_t input);
-        void setOCTW(uint8_t input);
-        uint16_t getRegister1();
-        uint16_t getRegister2();
-        uint16_t readStatReg1();
-        uint16_t readStatReg2();
-    private:
-//varijable
-        DigitalOut cs;
-        DigitalOut mosi;
-        DigitalIn miso;
-        DigitalOut sck;
-        DigitalOut en_gate;
-        uint16_t register1;
-        uint16_t register2;
-        int maskPWM;
-        int maskOCP;
-        int maskOCTW;
-        int maskGain;
-        int maskCurrentLimit;
-        uint16_t statReg1;
-        uint16_t statReg2;
-        uint16_t registerStatus1;
-        uint16_t registerStatus2;
-//funkcije       
         
         
+        uint8_t inputCL;
+        uint8_t inputGain;
+        uint8_t inputPWMNumber;
+        uint8_t inputOCPMode;
+        uint8_t inputOCTWMode;
+        uint8_t inputGateCurrent;
+        
+
+//korištene funkcije     
+    
+        /** Postavlja ograničenje struje u željenu vrijednost definirane prema tablici 13 u datasheetu DRV8301
+            @param inputCL Broj koji unese korisnik kako bi odabrao koje ograničenje struje želi postaviti 
+            definiran prema tablici 13 u datasheetu DRV8301 uzimajući drain-to-source napon i računajući iznos struje
+        */
+        void setCurrentLimit(uint8_t inputCL);
+        
+        /** Postavlja pojačanje integriranih pojačala na 10, 20, 40 ili 80 V/V
+            @param inputGain Broj kojega korisnik unosi kako bi odabrao željeni 
+            iznos pojačanja prema tablici 12 u datasheetu DRV8301
+        */
+        void setGain(uint8_t inputGain);
+        
+        /** Postavlja željeni broj PWM signala (6 ili 3)
+            @param inputPWMNumber Broj koji korisnik unosi na osnovu kojega se 
+            prema tablici 11 u datasheetu DRV8301 odabire broj PWM signala
+        */
+        void setPWMNumber(uint8_t inputPWMNumber);
+        
+        /** Postavlja prekostrujnu zaštitu predupravljača na jedan od četiri moguća moda: 
+            Current limit, OC latch shutdown, Report only, OC disabled prema tablici 11 u datasheetu DRV8301
+            @param inputOCPMode Broj kojega korisnik unosi koji određuje koji mod prekostrujne zaštite 
+            aktivirati prema tablici 11 u datasheetu DRV8301
+        */
+        void setOCPMode(uint8_t inputOCPMode);
+        
+        /** Postavlja što će OCTW pin javljati u slučaju detektirane pogreške: 
+        prekomjernu struju i temperaturu, prekomjernu struju ili prekomjernu temperaturu,
+            @param inputOCTWMode Broj kojega korisnik unosi koji određuje koji od 
+            četiri moda dojave na OCTW pinu će biti aktivan. Četvrti mod je rezerviran za kasnije nadogradnje i zasad nije upotrebljiv
+        */
+        void setOCTW(uint8_t inputOCTWMode);
+        
+        /** Dohvaća vrijednost spremljenu u kontrolni registar 1
+            @return vraća kroz SPI 16-bitnu riječ koja se sprema u varijablu controlRegister1 koja se može dalje koristiti 
+        */
+        uint16_t getControlRegister1();
+        
+        /** Dohvaća vrijednost spremljenu u kontrolni registar 2
+            @return vraća kroz SPI 16-bitnu riječ koja se sprema u varijablu controlRegister2 koja se može dalje koristiti 
+        */
+        uint16_t getControlRegister2();
+        
+        /** Dohvaća vrijednost spremljenu u statusni registar 1
+            @return vraća kroz SPI 16-bitnu riječ koja se sprema u varijablu statusRegister1 koja se može dalje koristiti 
+        */
+        uint16_t getStatusRegister1();
+        
+        /** Dohvaća vrijednost spremljenu u statusni registar 2
+            @return vraća kroz SPI 16-bitnu riječ koja se sprema u varijablu statusRegister2 koja se može dalje koristiti 
+        */
+        uint16_t getStatusRegister2();
+        
+        /** Postavlja ograničenje struje gatea
+            @param inputGateCurrent Broj kojega korisnik unosi koji odrađuje iznos ograničenja
+            struje gatea prema tablici 11 DRV8301 datasheeta. Četvrti mod je rezerviran za kasnije nadogradnje i zasad nije upotrebljiv
+        */
+        void setGateCurrent(uint8_t inputGateCurrent);
+        
+    private:
+        SPI spi;
+        
+//korištene varijable
+
+        DigitalOut cs;  //"chip select" digital out line which selects the SPI slave
+        DigitalOut mosi;    //"master output slave input" digital out line through which SPI master sends data to the slave
+        DigitalIn miso; //"master input slave output" digital in line through which SPI master receives data from SPI slave
+        DigitalOut sck; //"SPI clock" digital out line, used for synchronizing SPI communication
+        DigitalOut en_gate; //"enable gate" digital out line used to reset the DRV8301 if necessary
+        
+        uint16_t controlRegister1;  //control register 1 data is saved here
+        uint16_t controlRegister2;  //control register 2 data is saved here
+        uint16_t statusRegister1;   //status register 1 data is saved here
+        uint16_t statusRegister2;   //status register 2 data is saved here
+        
+        /** reboots the entire DRV8301, shutting down then starting up the pre-driver unlatching faults which will remain unlatched if no fault is still present
+        */
+        void startup(); 
 };
 #endif
\ No newline at end of file