Library for TI's DRV 2605

Dependents:   sonar_vibrator

Committer:
takuhachisu
Date:
Mon Nov 20 07:06:21 2017 +0000
Revision:
2:08f047da9397
Parent:
1:0747096351be
Modified the name of function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
takuhachisu 0:d47ac72f4048 1 #include "DRV2605.h"
takuhachisu 0:d47ac72f4048 2
takuhachisu 1:0747096351be 3 DRV2605::DRV2605(I2C &i2c, ActuatorType at, BrakeFactor bf, LoopGain lg,
takuhachisu 1:0747096351be 4 uint8_t rv, uint8_t ocv, AutoCalTime act, uint8_t dt,
takuhachisu 1:0747096351be 5 SampleTime st, uint8_t bt, uint8_t it)
takuhachisu 0:d47ac72f4048 6 {
takuhachisu 0:d47ac72f4048 7 _i2c = &i2c;
takuhachisu 1:0747096351be 8
takuhachisu 1:0747096351be 9 // After powerup, wait at least 250 µs before the DRV2605 device accepts
takuhachisu 1:0747096351be 10 // I2C commands
takuhachisu 1:0747096351be 11 wait_us(250);
takuhachisu 1:0747096351be 12
takuhachisu 1:0747096351be 13 // Assert the EN pin (logic high).
takuhachisu 1:0747096351be 14 // This is skipped because EN pin is connected to Vdd
takuhachisu 1:0747096351be 15
takuhachisu 1:0747096351be 16 // To remove the device from standby mode
takuhachisu 0:d47ac72f4048 17 mode(Mode_AUTO_CAL);
takuhachisu 1:0747096351be 18
takuhachisu 1:0747096351be 19 // Auto calibratoin procedure
takuhachisu 1:0747096351be 20 // Populate the input parameters required by the auto-calibration engine:
takuhachisu 1:0747096351be 21 // Feedback Control Register;
takuhachisu 1:0747096351be 22 i2cWriteByte(FEEDBACK_CONTROL, i2cReadByte(FEEDBACK_CONTROL) | at | bf | lg);
takuhachisu 0:d47ac72f4048 23
takuhachisu 1:0747096351be 24 // Rated Voltage Register;
takuhachisu 1:0747096351be 25 i2cWriteByte(RATED_VOLTAGE, rv);
takuhachisu 0:d47ac72f4048 26
takuhachisu 1:0747096351be 27 // Overdrive Clamp Voltage Register;
takuhachisu 1:0747096351be 28 i2cWriteByte(OVERDRIVE_CLAMP_VOLTAGE, ocv);
takuhachisu 0:d47ac72f4048 29
takuhachisu 1:0747096351be 30 // Control4 Register;
takuhachisu 1:0747096351be 31 i2cWriteByte(CONTROL4, i2cReadByte(FEEDBACK_CONTROL) | act);
takuhachisu 0:d47ac72f4048 32
takuhachisu 1:0747096351be 33 // Control1 Register;
takuhachisu 1:0747096351be 34 i2cWriteByte(CONTROL1, i2cReadByte(FEEDBACK_CONTROL) | dt);
takuhachisu 0:d47ac72f4048 35
takuhachisu 1:0747096351be 36 // Control2 Register (only for LRA)
takuhachisu 1:0747096351be 37 if(at == LRA)
takuhachisu 1:0747096351be 38 i2cWriteByte(CONTROL2, i2cReadByte(FEEDBACK_CONTROL) | st | (bt << 2) | it);
takuhachisu 1:0747096351be 39
takuhachisu 1:0747096351be 40 // Start auto- calibration
takuhachisu 1:0747096351be 41 i2cWriteByte(GO, 0x01);
takuhachisu 1:0747096351be 42 // Wait for calibration to complete
takuhachisu 1:0747096351be 43 while(i2cReadByte(GO));
takuhachisu 0:d47ac72f4048 44 }
takuhachisu 0:d47ac72f4048 45
takuhachisu 0:d47ac72f4048 46 void DRV2605::i2cWriteByte(char reg, char value)
takuhachisu 0:d47ac72f4048 47 {
takuhachisu 0:d47ac72f4048 48 char buff[2] = {reg, value};
takuhachisu 0:d47ac72f4048 49 _i2c->write(DRV2605_SLAVE_ADDR<<1, buff, 2);
takuhachisu 0:d47ac72f4048 50 }
takuhachisu 0:d47ac72f4048 51
takuhachisu 0:d47ac72f4048 52 uint8_t DRV2605::i2cReadByte(char reg)
takuhachisu 0:d47ac72f4048 53 {
takuhachisu 0:d47ac72f4048 54 char result; // Temp result storage
takuhachisu 0:d47ac72f4048 55 _i2c->write(DRV2605_SLAVE_ADDR<<1, &reg, 1, true);
takuhachisu 0:d47ac72f4048 56 _i2c->read(DRV2605_SLAVE_ADDR<<1, &result, 1);
takuhachisu 0:d47ac72f4048 57
takuhachisu 0:d47ac72f4048 58 return result;
takuhachisu 0:d47ac72f4048 59 }
takuhachisu 0:d47ac72f4048 60
takuhachisu 1:0747096351be 61 void DRV2605::mode(uint8_t mode)
takuhachisu 0:d47ac72f4048 62 {
takuhachisu 0:d47ac72f4048 63 i2cWriteByte(MODE, mode);
takuhachisu 0:d47ac72f4048 64 }
takuhachisu 0:d47ac72f4048 65
takuhachisu 0:d47ac72f4048 66 uint8_t DRV2605::diagnostics()
takuhachisu 0:d47ac72f4048 67 {
takuhachisu 0:d47ac72f4048 68 mode(Mode_DIAG);
takuhachisu 0:d47ac72f4048 69 i2cWriteByte(GO, 1);
takuhachisu 1:0747096351be 70 while(i2cReadByte(GO));
takuhachisu 0:d47ac72f4048 71
takuhachisu 1:0747096351be 72 return i2cReadByte(STATUS);
takuhachisu 0:d47ac72f4048 73 }
takuhachisu 0:d47ac72f4048 74
takuhachisu 1:0747096351be 75 void DRV2605::dataFormatRTP(bool isSigned)
takuhachisu 1:0747096351be 76 {
takuhachisu 1:0747096351be 77 // Control3 Register (0x1D)
takuhachisu 1:0747096351be 78 if(isSigned)
takuhachisu 1:0747096351be 79 i2cWriteByte(CONTROL3, i2cReadByte(CONTROL3) & ~(1 << 3));
takuhachisu 1:0747096351be 80 else
takuhachisu 1:0747096351be 81 i2cWriteByte(CONTROL3, i2cReadByte(CONTROL3) | (1 << 3));
takuhachisu 1:0747096351be 82 }
takuhachisu 1:0747096351be 83
takuhachisu 1:0747096351be 84 void DRV2605::setLibrary(uint8_t lib)
takuhachisu 0:d47ac72f4048 85 {
takuhachisu 0:d47ac72f4048 86 i2cWriteByte(LIBRARY_SELECTION, lib); // Select ROM Library
takuhachisu 0:d47ac72f4048 87 }
takuhachisu 0:d47ac72f4048 88
takuhachisu 0:d47ac72f4048 89 void DRV2605::setWaveform(int effect)
takuhachisu 0:d47ac72f4048 90 {
takuhachisu 0:d47ac72f4048 91 i2cWriteByte(WAVEFORM_SEQUENCER_1, effect); // Load waveform index to play
takuhachisu 0:d47ac72f4048 92 i2cWriteByte(WAVEFORM_SEQUENCER_2, 0); // Insert stop condition so we don't play other registers if filled
takuhachisu 0:d47ac72f4048 93 }
takuhachisu 0:d47ac72f4048 94
takuhachisu 0:d47ac72f4048 95 void DRV2605::setWaveformSequence(int effect1, int effect2,
takuhachisu 1:0747096351be 96 int effect3, int effect4,
takuhachisu 1:0747096351be 97 int effect5, int effect6,
takuhachisu 1:0747096351be 98 int effect7, int effect8)
takuhachisu 0:d47ac72f4048 99 {
takuhachisu 0:d47ac72f4048 100 i2cWriteByte(WAVEFORM_SEQUENCER_1, effect1);
takuhachisu 0:d47ac72f4048 101 i2cWriteByte(WAVEFORM_SEQUENCER_2, effect2);
takuhachisu 0:d47ac72f4048 102 i2cWriteByte(WAVEFORM_SEQUENCER_3, effect3);
takuhachisu 0:d47ac72f4048 103 i2cWriteByte(WAVEFORM_SEQUENCER_4, effect4);
takuhachisu 0:d47ac72f4048 104 i2cWriteByte(WAVEFORM_SEQUENCER_5, effect5);
takuhachisu 0:d47ac72f4048 105 i2cWriteByte(WAVEFORM_SEQUENCER_6, effect6);
takuhachisu 0:d47ac72f4048 106 i2cWriteByte(WAVEFORM_SEQUENCER_7, effect7);
takuhachisu 0:d47ac72f4048 107 i2cWriteByte(WAVEFORM_SEQUENCER_8, effect8);
takuhachisu 0:d47ac72f4048 108 }
takuhachisu 0:d47ac72f4048 109
takuhachisu 0:d47ac72f4048 110 void DRV2605::play()
takuhachisu 0:d47ac72f4048 111 {
takuhachisu 0:d47ac72f4048 112 i2cWriteByte(GO, 1);
takuhachisu 0:d47ac72f4048 113 }
takuhachisu 0:d47ac72f4048 114
takuhachisu 0:d47ac72f4048 115 void DRV2605::stop()
takuhachisu 0:d47ac72f4048 116 {
takuhachisu 0:d47ac72f4048 117 i2cWriteByte(GO, 0);
takuhachisu 0:d47ac72f4048 118 }
takuhachisu 0:d47ac72f4048 119
takuhachisu 1:0747096351be 120 void DRV2605::playRtp(uint8_t rtp)
takuhachisu 0:d47ac72f4048 121 {
takuhachisu 0:d47ac72f4048 122 i2cWriteByte(REAL_TIME_PLAYBACK, rtp);
takuhachisu 0:d47ac72f4048 123 }
takuhachisu 0:d47ac72f4048 124
takuhachisu 2:08f047da9397 125 float DRV2605::batteryVoltage(void)
takuhachisu 0:d47ac72f4048 126 {
takuhachisu 0:d47ac72f4048 127 return (float)i2cReadByte(VBAT_VOLTAGE_MONITOR) / 255.0 * 5.6;
takuhachisu 0:d47ac72f4048 128 }