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 6:f245fce762f6, committed 2015-11-28
- Comitter:
- tbjazic
- Date:
- Sat Nov 28 13:47:59 2015 +0000
- Parent:
- 5:57bbd3728fd0
- Commit message:
- Pogledajte prijedloge za pobolj?anja. Imali ste jo? uvijek zna?ajnih pogre?ki. Da lak?e vidite gdje sam ?to pisao, usporedite posljednje dvije revizije library-a.
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 |
diff -r 57bbd3728fd0 -r f245fce762f6 DRV8301.cpp --- a/DRV8301.cpp Sat Nov 28 10:59:46 2015 +0000 +++ b/DRV8301.cpp Sat Nov 28 13:47:59 2015 +0000 @@ -1,40 +1,42 @@ #include "DRV8301.h" #include "mbed.h" +/** Primjer konstruktora s fiksno oređenim pinovima */ +DRV8301::DRV8301() : spi(p11, p12, p13), cs(p8), en_gate(p14) { + 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 +} -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.format(16,1); //format SPI komunikacije: 16-bitne riječi, mod 1 clocka - spi.frequency(1000000); //frekvencija clocka 1MHz - cs = 1; - cs = 0; - +DRV8301::DRV8301(PinName pcs, PinName pmosi, PinName pmiso, PinName psck, PinName pen_gate) : spi(pmosi, pmiso, psck), cs(pcs), en_gate(pen_gate) { 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 pokretanje (reboot) DRV-a - -void DRV8301::startup(){ +void DRV8301::startup() { + spi.format(16,1); //format SPI komunikacije: 16-bitne riječi, mod 1 clocka + spi.frequency(1000000); //frekvencija clocka 1MHz + cs = 1; + cs = 0; 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 + wait_us (25); //čekanje od 25 mikrosekundi kako bi se izbjeglo blokiranje predupravljača --> pozovite se na stranicu datasheeta en_gate = 1; //postavlja EN_GATE pin u 1 čime pokreće predupravljač - wait (1); //čekanje od 1 sekunde + wait (1); //čekanje od 1 sekunde // zašto treba ovo čekanje od 1 sekunde? + + /* ne bi bilo loše pročitati inicijalna stanja registara */ } + //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 + /* ovdje bi trebali provjeriti da li je broj u rasponu od 0 do 31 */ + controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1 // nije potrebna još jedna lokalna varijabla funkcije + 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 + 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 // da li ste provjerili da li se kod čitanja registra MSB vraća u 0? } //funkcija za broj PWM ulaza - void DRV8301::setPWMNumber(uint8_t inputPWMNumber){ + /* provjera raspona 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 @@ -45,6 +47,7 @@ //funkcija za mod OCP-a void DRV8301::setOCPMode(uint8_t inputOCPMode){ + /* provjera raspona 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 @@ -55,6 +58,7 @@ //funkcija za mod OCTW-a void DRV8301::setOCTW(uint8_t inputOCTWMode){ + /* provjera raspona */ 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 @@ -65,6 +69,7 @@ //funkcija za pojačanje void DRV8301::setGain(uint8_t inputGain){ + /* provjera raspona */ 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 @@ -75,37 +80,38 @@ //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 + 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 + 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 + 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 + 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 + /* provjera raspona inputGateCurrent */ + 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 +} \ No newline at end of file
diff -r 57bbd3728fd0 -r f245fce762f6 DRV8301.h --- a/DRV8301.h Sat Nov 28 10:59:46 2015 +0000 +++ b/DRV8301.h Sat Nov 28 13:47:59 2015 +0000 @@ -6,27 +6,27 @@ /** 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 + * koji obuhvaća predupravljač DRV8301 i mbed mikroupravljač */ class DRV8301{ public: - /** instancira DRV8301 - */ + DRV8301(); + /** Jasno je da je to konstruktor. Tu navedite opis parametara konstruktora */ DRV8301(PinName cs, PinName mosi, PinName miso, PinName sck, PinName en_gate); - + /* TB: potpuno nepotrebne varijable uint8_t inputCL; uint8_t inputGain; uint8_t inputPWMNumber; uint8_t inputOCPMode; uint8_t inputOCTWMode; uint8_t inputGateCurrent; - + */ -//korištene funkcije + /* TB: maknuti//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 + @param inputCL Broj od 0 do 31 koji unosi 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); @@ -89,9 +89,10 @@ //korištene varijable DigitalOut cs; //"chip select" digital out line which selects the SPI slave + /* TB: nepotrebno jer je to dio spi-a 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 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