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.

Committer:
tbjazic
Date:
Sat Nov 28 13:47:59 2015 +0000
Revision:
6:f245fce762f6
Parent:
5:57bbd3728fd0
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.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pantunovi 0:2825ac4882fd 1 #include "DRV8301.h"
pantunovi 3:227ecd07b9cd 2 #include "mbed.h"
pantunovi 3:227ecd07b9cd 3
tbjazic 6:f245fce762f6 4 /** Primjer konstruktora s fiksno oređenim pinovima */
tbjazic 6:f245fce762f6 5 DRV8301::DRV8301() : spi(p11, p12, p13), cs(p8), en_gate(p14) {
tbjazic 6:f245fce762f6 6 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
tbjazic 6:f245fce762f6 7 }
pantunovi 0:2825ac4882fd 8
tbjazic 6:f245fce762f6 9 DRV8301::DRV8301(PinName pcs, PinName pmosi, PinName pmiso, PinName psck, PinName pen_gate) : spi(pmosi, pmiso, psck), cs(pcs), en_gate(pen_gate) {
pantunovi 5:57bbd3728fd0 10 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 3:227ecd07b9cd 11 }
pantunovi 3:227ecd07b9cd 12
pantunovi 0:2825ac4882fd 13 //funkcija za pokretanje (reboot) DRV-a
tbjazic 6:f245fce762f6 14 void DRV8301::startup() {
tbjazic 6:f245fce762f6 15 spi.format(16,1); //format SPI komunikacije: 16-bitne riječi, mod 1 clocka
tbjazic 6:f245fce762f6 16 spi.frequency(1000000); //frekvencija clocka 1MHz
tbjazic 6:f245fce762f6 17 cs = 1;
tbjazic 6:f245fce762f6 18 cs = 0;
pantunovi 5:57bbd3728fd0 19 en_gate = 0; //postavlja EN_GATE pin predupravljača u 0 čime gasi cijeli predupravljač
tbjazic 6:f245fce762f6 20 wait_us (25); //čekanje od 25 mikrosekundi kako bi se izbjeglo blokiranje predupravljača --> pozovite se na stranicu datasheeta
pantunovi 5:57bbd3728fd0 21 en_gate = 1; //postavlja EN_GATE pin u 1 čime pokreće predupravljač
tbjazic 6:f245fce762f6 22 wait (1); //čekanje od 1 sekunde // zašto treba ovo čekanje od 1 sekunde?
tbjazic 6:f245fce762f6 23
tbjazic 6:f245fce762f6 24 /* ne bi bilo loše pročitati inicijalna stanja registara */
pantunovi 5:57bbd3728fd0 25 }
tbjazic 6:f245fce762f6 26
pantunovi 5:57bbd3728fd0 27 //funkcija za ograničenje struje
pantunovi 5:57bbd3728fd0 28 void DRV8301::setCurrentLimit(uint8_t inputCL){
tbjazic 6:f245fce762f6 29 /* ovdje bi trebali provjeriti da li je broj u rasponu od 0 do 31 */
tbjazic 6:f245fce762f6 30 controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1 // nije potrebna još jedna lokalna varijabla funkcije
tbjazic 6:f245fce762f6 31 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 32 controlRegister1 &= maskCurrentLimit; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
tbjazic 6:f245fce762f6 33 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
tbjazic 6:f245fce762f6 34 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?
pantunovi 5:57bbd3728fd0 35 }
pantunovi 5:57bbd3728fd0 36
pantunovi 5:57bbd3728fd0 37 //funkcija za broj PWM ulaza
pantunovi 5:57bbd3728fd0 38 void DRV8301::setPWMNumber(uint8_t inputPWMNumber){
tbjazic 6:f245fce762f6 39 /* provjera raspona inputPWMNumber */
pantunovi 5:57bbd3728fd0 40 uint16_t controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 41 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 42 controlRegister1 &= maskPWM; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 43 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 44 spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1
pantunovi 5:57bbd3728fd0 45 }
pantunovi 5:57bbd3728fd0 46
pantunovi 5:57bbd3728fd0 47 //funkcija za mod OCP-a
pantunovi 5:57bbd3728fd0 48
pantunovi 5:57bbd3728fd0 49 void DRV8301::setOCPMode(uint8_t inputOCPMode){
tbjazic 6:f245fce762f6 50 /* provjera raspona inputOCPMode */
pantunovi 5:57bbd3728fd0 51 uint16_t controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 52 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 53 controlRegister1 &= maskOCP; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 54 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 55 spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1
pantunovi 5:57bbd3728fd0 56 }
pantunovi 5:57bbd3728fd0 57
pantunovi 5:57bbd3728fd0 58 //funkcija za mod OCTW-a
pantunovi 5:57bbd3728fd0 59
pantunovi 5:57bbd3728fd0 60 void DRV8301::setOCTW(uint8_t inputOCTWMode){
tbjazic 6:f245fce762f6 61 /* provjera raspona */
pantunovi 5:57bbd3728fd0 62 uint16_t controlRegister2 = spi.write(0x9800); //čita stanje kontrolnog registra 2 i sprema ga u varijablu controlRegister2
pantunovi 5:57bbd3728fd0 63 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 64 controlRegister2 &= maskOCTW; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister2
pantunovi 5:57bbd3728fd0 65 controlRegister2 |= inputOCTWMode; //s unesenim brojem input u binarnom obliku provodi logičku ILI operaciju s varijablom controlRegister2 te rezultat sprema
pantunovi 5:57bbd3728fd0 66 spi.write(controlRegister2); //upisuje varijablu controlRegister2 u kontrolni registar 2
pantunovi 5:57bbd3728fd0 67 }
pantunovi 5:57bbd3728fd0 68
pantunovi 5:57bbd3728fd0 69 //funkcija za pojačanje
pantunovi 5:57bbd3728fd0 70
pantunovi 5:57bbd3728fd0 71 void DRV8301::setGain(uint8_t inputGain){
tbjazic 6:f245fce762f6 72 /* provjera raspona */
pantunovi 5:57bbd3728fd0 73 uint16_t controlRegister2 = spi.write(0x9800); //čita stanje kontrolnog registra 2 i sprema ga u varijablu controlRegister2
pantunovi 5:57bbd3728fd0 74 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 75 controlRegister2 &= maskGain; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister2
pantunovi 5:57bbd3728fd0 76 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 77 spi.write(controlRegister2); //upisuje varijablu controlRegister2 u kontrolni registar 2
pantunovi 5:57bbd3728fd0 78 }
pantunovi 5:57bbd3728fd0 79
pantunovi 5:57bbd3728fd0 80 //funkcija za dobivanje stanja u registru 1
pantunovi 5:57bbd3728fd0 81
pantunovi 5:57bbd3728fd0 82 uint16_t DRV8301::getControlRegister1(){
tbjazic 6:f245fce762f6 83 controlRegister1 = spi.write(0x9000); //šalje naredbu za čitanje u kontrolni registar 1 te dobiva odgovor kojega posprema u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 84 return controlRegister1;
pantunovi 5:57bbd3728fd0 85 }
pantunovi 5:57bbd3728fd0 86
pantunovi 5:57bbd3728fd0 87 // funkcija za dobivanje stanja u registru 2
pantunovi 5:57bbd3728fd0 88
pantunovi 5:57bbd3728fd0 89 uint16_t DRV8301::getControlRegister2(){
tbjazic 6:f245fce762f6 90 controlRegister2 = spi.write(0x9800); //šalje naredbu za čitanje u kontrolni registar 2 te dobiva odgovor kojega posprema u varijablu controlRegister2
pantunovi 5:57bbd3728fd0 91 return controlRegister2;
pantunovi 5:57bbd3728fd0 92 }
pantunovi 5:57bbd3728fd0 93
pantunovi 5:57bbd3728fd0 94 //funkcija za čitanje statusnog registra 1
pantunovi 5:57bbd3728fd0 95
pantunovi 5:57bbd3728fd0 96 uint16_t DRV8301::getStatusRegister1(){
tbjazic 6:f245fce762f6 97 statusRegister1 = spi.write(0x8000); //šalje naredbu za čitanje u statusni registar 1 te dobiva odgovorkojega posprema u varijablu statusRegister1
pantunovi 5:57bbd3728fd0 98 return statusRegister1;
pantunovi 5:57bbd3728fd0 99 }
pantunovi 5:57bbd3728fd0 100
pantunovi 5:57bbd3728fd0 101 //funkcija za čitanje statusnog registra 2
pantunovi 5:57bbd3728fd0 102
pantunovi 5:57bbd3728fd0 103 uint16_t DRV8301::getStatusRegister2(){
tbjazic 6:f245fce762f6 104 statusRegister2 = spi.write(0x8800); //šalje naredbu za čitanje u statusni registar 2 te dobiva odgovorkojega posprema u varijablu statusRegister2
pantunovi 5:57bbd3728fd0 105 return statusRegister2;
pantunovi 5:57bbd3728fd0 106 }
pantunovi 5:57bbd3728fd0 107
pantunovi 5:57bbd3728fd0 108 //funkcija za ograničenje struje gate-a internog MOSFET-a
pantunovi 5:57bbd3728fd0 109
pantunovi 5:57bbd3728fd0 110 void DRV8301::setGateCurrent(uint8_t inputGateCurrent){
tbjazic 6:f245fce762f6 111 /* provjera raspona inputGateCurrent */
tbjazic 6:f245fce762f6 112 controlRegister1 = spi.write(0x9000); //čita stanje kontrolnog registra 1 i sprema ga u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 113 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 114 controlRegister1 &= maskGateCurrent; //provodi logičku I operaciju po bitovima između stanja registra i maske te sprema rezultat u varijablu controlRegister1
pantunovi 5:57bbd3728fd0 115 controlRegister1 |= inputGateCurrent; //s unesenim brojem inputGateCurrent u binarnom obliku provodi logičku ILI operaciju s varijablom controlRegister1 te rezultat sprema
pantunovi 5:57bbd3728fd0 116 spi.write(controlRegister1); //upisuje varijablu controlRegister1 u kontrolni registar 1
tbjazic 6:f245fce762f6 117 }