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.
Diff: DRV8301.cpp
- 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