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, committed 2015-11-28
- 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