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.
DRV8301.cpp@5:57bbd3728fd0, 2015-11-28 (annotated)
- Committer:
- pantunovi
- Date:
- Sat Nov 28 10:59:46 2015 +0000
- Revision:
- 5:57bbd3728fd0
- Parent:
- 4:98c76c7b8020
- Child:
- 6:f245fce762f6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pantunovi | 0:2825ac4882fd | 1 | #include "DRV8301.h" |
pantunovi | 3:227ecd07b9cd | 2 | #include "mbed.h" |
pantunovi | 3:227ecd07b9cd | 3 | |
pantunovi | 0:2825ac4882fd | 4 | |
pantunovi | 5:57bbd3728fd0 | 5 | 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){ |
pantunovi | 3:227ecd07b9cd | 6 | |
pantunovi | 3:227ecd07b9cd | 7 | |
pantunovi | 5:57bbd3728fd0 | 8 | spi.format(16,1); //format SPI komunikacije: 16-bitne riječi, mod 1 clocka |
pantunovi | 5:57bbd3728fd0 | 9 | spi.frequency(1000000); //frekvencija clocka 1MHz |
pantunovi | 3:227ecd07b9cd | 10 | cs = 1; |
pantunovi | 3:227ecd07b9cd | 11 | cs = 0; |
pantunovi | 3:227ecd07b9cd | 12 | |
pantunovi | 5:57bbd3728fd0 | 13 | 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 |
pantunovi | 0:2825ac4882fd | 14 | |
pantunovi | 3:227ecd07b9cd | 15 | } |
pantunovi | 3:227ecd07b9cd | 16 | |
pantunovi | 0:2825ac4882fd | 17 | //funkcija za pokretanje (reboot) DRV-a |
pantunovi | 0:2825ac4882fd | 18 | |
pantunovi | 0:2825ac4882fd | 19 | void DRV8301::startup(){ |
pantunovi | 5:57bbd3728fd0 | 20 | en_gate = 0; //postavlja EN_GATE pin predupravljača u 0 čime gasi cijeli predupravljač |
pantunovi | 5:57bbd3728fd0 | 21 | wait_us (25); //čekanje od 25 mikrosekundi kako bi se izbjeglo blokiranje predupravljača |
pantunovi | 5:57bbd3728fd0 | 22 | en_gate = 1; //postavlja EN_GATE pin u 1 čime pokreće predupravljač |
pantunovi | 5:57bbd3728fd0 | 23 | wait (1); //čekanje od 1 sekunde |
pantunovi | 5:57bbd3728fd0 | 24 | } |
pantunovi | 5:57bbd3728fd0 | 25 | //funkcija za ograničenje struje |
pantunovi | 5:57bbd3728fd0 | 26 | |
pantunovi | 5:57bbd3728fd0 | 27 | void DRV8301::setCurrentLimit(uint8_t inputCL){ |
pantunovi | 5:57bbd3728fd0 | 28 | uint16_t controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 29 | 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 |
pantunovi | 5:57bbd3728fd0 | 30 | controlRegister1 &= maskCurrentLimit; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 31 | 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 |
pantunovi | 5:57bbd3728fd0 | 32 | spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1 |
pantunovi | 5:57bbd3728fd0 | 33 | } |
pantunovi | 5:57bbd3728fd0 | 34 | |
pantunovi | 5:57bbd3728fd0 | 35 | //funkcija za broj PWM ulaza |
pantunovi | 5:57bbd3728fd0 | 36 | |
pantunovi | 5:57bbd3728fd0 | 37 | void DRV8301::setPWMNumber(uint8_t inputPWMNumber){ |
pantunovi | 5:57bbd3728fd0 | 38 | uint16_t controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 39 | 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 |
pantunovi | 5:57bbd3728fd0 | 40 | controlRegister1 &= maskPWM; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 41 | 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 |
pantunovi | 5:57bbd3728fd0 | 42 | spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1 |
pantunovi | 5:57bbd3728fd0 | 43 | } |
pantunovi | 5:57bbd3728fd0 | 44 | |
pantunovi | 5:57bbd3728fd0 | 45 | //funkcija za mod OCP-a |
pantunovi | 5:57bbd3728fd0 | 46 | |
pantunovi | 5:57bbd3728fd0 | 47 | void DRV8301::setOCPMode(uint8_t inputOCPMode){ |
pantunovi | 5:57bbd3728fd0 | 48 | uint16_t controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 49 | 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 |
pantunovi | 5:57bbd3728fd0 | 50 | controlRegister1 &= maskOCP; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 51 | 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 |
pantunovi | 5:57bbd3728fd0 | 52 | spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1 |
pantunovi | 5:57bbd3728fd0 | 53 | } |
pantunovi | 5:57bbd3728fd0 | 54 | |
pantunovi | 5:57bbd3728fd0 | 55 | //funkcija za mod OCTW-a |
pantunovi | 5:57bbd3728fd0 | 56 | |
pantunovi | 5:57bbd3728fd0 | 57 | void DRV8301::setOCTW(uint8_t inputOCTWMode){ |
pantunovi | 5:57bbd3728fd0 | 58 | uint16_t controlRegister2 = spi.write(0x9800); //čita stanje kontrolnog registra 2 i sprema ga u varijablu controlRegister2 |
pantunovi | 5:57bbd3728fd0 | 59 | 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 |
pantunovi | 5:57bbd3728fd0 | 60 | controlRegister2 &= maskOCTW; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister2 |
pantunovi | 5:57bbd3728fd0 | 61 | controlRegister2 |= inputOCTWMode; //s unesenim brojem input u binarnom obliku provodi logičku ILI operaciju s varijablom controlRegister2 te rezultat sprema |
pantunovi | 5:57bbd3728fd0 | 62 | spi.write(controlRegister2); //upisuje varijablu controlRegister2 u kontrolni registar 2 |
pantunovi | 5:57bbd3728fd0 | 63 | } |
pantunovi | 5:57bbd3728fd0 | 64 | |
pantunovi | 5:57bbd3728fd0 | 65 | //funkcija za pojačanje |
pantunovi | 5:57bbd3728fd0 | 66 | |
pantunovi | 5:57bbd3728fd0 | 67 | void DRV8301::setGain(uint8_t inputGain){ |
pantunovi | 5:57bbd3728fd0 | 68 | uint16_t controlRegister2 = spi.write(0x9800); //čita stanje kontrolnog registra 2 i sprema ga u varijablu controlRegister2 |
pantunovi | 5:57bbd3728fd0 | 69 | 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 |
pantunovi | 5:57bbd3728fd0 | 70 | controlRegister2 &= maskGain; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister2 |
pantunovi | 5:57bbd3728fd0 | 71 | 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 |
pantunovi | 5:57bbd3728fd0 | 72 | spi.write(controlRegister2); //upisuje varijablu controlRegister2 u kontrolni registar 2 |
pantunovi | 5:57bbd3728fd0 | 73 | } |
pantunovi | 5:57bbd3728fd0 | 74 | |
pantunovi | 5:57bbd3728fd0 | 75 | //funkcija za dobivanje stanja u registru 1 |
pantunovi | 5:57bbd3728fd0 | 76 | |
pantunovi | 5:57bbd3728fd0 | 77 | uint16_t DRV8301::getControlRegister1(){ |
pantunovi | 5:57bbd3728fd0 | 78 | uint16_t controlRegister1 = spi.write(0x9000); //šalje naredbu za čitanje u kontrolni registar 1 te dobiva odgovor kojega posprema u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 79 | return controlRegister1; |
pantunovi | 5:57bbd3728fd0 | 80 | } |
pantunovi | 5:57bbd3728fd0 | 81 | |
pantunovi | 5:57bbd3728fd0 | 82 | // funkcija za dobivanje stanja u registru 2 |
pantunovi | 5:57bbd3728fd0 | 83 | |
pantunovi | 5:57bbd3728fd0 | 84 | uint16_t DRV8301::getControlRegister2(){ |
pantunovi | 5:57bbd3728fd0 | 85 | uint16_t controlRegister2 = spi.write(0x9800); //šalje naredbu za čitanje u kontrolni registar 2 te dobiva odgovor kojega posprema u varijablu controlRegister2 |
pantunovi | 5:57bbd3728fd0 | 86 | return controlRegister2; |
pantunovi | 5:57bbd3728fd0 | 87 | } |
pantunovi | 5:57bbd3728fd0 | 88 | |
pantunovi | 5:57bbd3728fd0 | 89 | //funkcija za čitanje statusnog registra 1 |
pantunovi | 5:57bbd3728fd0 | 90 | |
pantunovi | 5:57bbd3728fd0 | 91 | uint16_t DRV8301::getStatusRegister1(){ |
pantunovi | 5:57bbd3728fd0 | 92 | uint16_t statusRegister1 = spi.write(0x8000); //šalje naredbu za čitanje u statusni registar 1 te dobiva odgovorkojega posprema u varijablu statusRegister1 |
pantunovi | 5:57bbd3728fd0 | 93 | return statusRegister1; |
pantunovi | 5:57bbd3728fd0 | 94 | } |
pantunovi | 5:57bbd3728fd0 | 95 | |
pantunovi | 5:57bbd3728fd0 | 96 | //funkcija za čitanje statusnog registra 2 |
pantunovi | 5:57bbd3728fd0 | 97 | |
pantunovi | 5:57bbd3728fd0 | 98 | uint16_t DRV8301::getStatusRegister2(){ |
pantunovi | 5:57bbd3728fd0 | 99 | uint16_t statusRegister2 = spi.write(0x8800); //šalje naredbu za čitanje u statusni registar 2 te dobiva odgovorkojega posprema u varijablu statusRegister2 |
pantunovi | 5:57bbd3728fd0 | 100 | return statusRegister2; |
pantunovi | 5:57bbd3728fd0 | 101 | } |
pantunovi | 5:57bbd3728fd0 | 102 | |
pantunovi | 5:57bbd3728fd0 | 103 | //funkcija za ograničenje struje gate-a internog MOSFET-a |
pantunovi | 5:57bbd3728fd0 | 104 | |
pantunovi | 5:57bbd3728fd0 | 105 | void DRV8301::setGateCurrent(uint8_t inputGateCurrent){ |
pantunovi | 5:57bbd3728fd0 | 106 | uint16_t controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 107 | 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 |
pantunovi | 5:57bbd3728fd0 | 108 | controlRegister1 &= maskGateCurrent; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1 |
pantunovi | 5:57bbd3728fd0 | 109 | controlRegister1 |= inputGateCurrent; //s unesenim brojem inputGateCurrent u binarnom obliku provodi logičku ILI operaciju s varijablom controlRegister1 te rezultat sprema |
pantunovi | 5:57bbd3728fd0 | 110 | spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1 |
pantunovi | 5:57bbd3728fd0 | 111 | } |