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.

Revision:
5:57bbd3728fd0
Parent:
4:98c76c7b8020
Child:
6:f245fce762f6
--- 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