Library for TI's DRV 2605
DRV2605.cpp@1:0747096351be, 2017-11-13 (annotated)
- Committer:
- takuhachisu
- Date:
- Mon Nov 13 09:20:02 2017 +0000
- Revision:
- 1:0747096351be
- Parent:
- 0:d47ac72f4048
- Child:
- 2:08f047da9397
Library for DRV2605
Who changed what in which revision?
User | Revision | Line number | New 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, ®, 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 | 0:d47ac72f4048 | 125 | float DRV2605::battery_voltage(void) |
takuhachisu | 0:d47ac72f4048 | 126 | { |
takuhachisu | 0:d47ac72f4048 | 127 | return (float)i2cReadByte(VBAT_VOLTAGE_MONITOR) / 255.0 * 5.6; |
takuhachisu | 0:d47ac72f4048 | 128 | } |