Akash Vibhute / DRV2665
Committer:
akashvibhute
Date:
Wed May 25 03:17:20 2016 +0000
Revision:
0:b85fd3fdfcfa
Child:
1:e2c726c628dc
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akashvibhute 0:b85fd3fdfcfa 1 /**
akashvibhute 0:b85fd3fdfcfa 2 * DRV2665 library
akashvibhute 0:b85fd3fdfcfa 3 *
akashvibhute 0:b85fd3fdfcfa 4 * @author Akash Vibhute
akashvibhute 0:b85fd3fdfcfa 5 * @author < akash . roboticist [at] gmail . com >
akashvibhute 0:b85fd3fdfcfa 6 * @version 0.1
akashvibhute 0:b85fd3fdfcfa 7 * @date May/24/2016
akashvibhute 0:b85fd3fdfcfa 8 */
akashvibhute 0:b85fd3fdfcfa 9
akashvibhute 0:b85fd3fdfcfa 10 #include "drv2665.h"
akashvibhute 0:b85fd3fdfcfa 11 #define M_PI 3.14159265358979
akashvibhute 0:b85fd3fdfcfa 12
akashvibhute 0:b85fd3fdfcfa 13 DRV2665_DIGITAL::DRV2665_DIGITAL( PinName sda, PinName scl ):i2c_(sda, scl)
akashvibhute 0:b85fd3fdfcfa 14 {
akashvibhute 0:b85fd3fdfcfa 15 i2c_addr = DRV2665_I2C_ADDRESS << 1;
akashvibhute 0:b85fd3fdfcfa 16 wait_ms(2); //wait 2ms for i2c bus
akashvibhute 0:b85fd3fdfcfa 17 }
akashvibhute 0:b85fd3fdfcfa 18
akashvibhute 0:b85fd3fdfcfa 19 void DRV2665_DIGITAL::init(uint8_t output_gain, uint8_t idle_timeout)
akashvibhute 0:b85fd3fdfcfa 20 {
akashvibhute 0:b85fd3fdfcfa 21 write(DRV2665_CTRL_2, 0); //clear standby
akashvibhute 0:b85fd3fdfcfa 22 write(DRV2665_CTRL_1, (DRV2665_DIGITAL_IN | output_gain)); //set mode digital, set gain
akashvibhute 0:b85fd3fdfcfa 23 write(DRV2665_CTRL_2, idle_timeout); //set timeout period
akashvibhute 0:b85fd3fdfcfa 24 }
akashvibhute 0:b85fd3fdfcfa 25
akashvibhute 0:b85fd3fdfcfa 26 void DRV2665_DIGITAL::reset()
akashvibhute 0:b85fd3fdfcfa 27 {
akashvibhute 0:b85fd3fdfcfa 28 write(DRV2665_CTRL_2, DRV2665_DEV_RST);
akashvibhute 0:b85fd3fdfcfa 29 }
akashvibhute 0:b85fd3fdfcfa 30
akashvibhute 0:b85fd3fdfcfa 31 void DRV2665_DIGITAL::outputWave(int8_t waveform[], uint8_t length)
akashvibhute 0:b85fd3fdfcfa 32 {
akashvibhute 0:b85fd3fdfcfa 33 if(fifo_check()) {
akashvibhute 0:b85fd3fdfcfa 34 for(int i=0; i<length; i++) {
akashvibhute 0:b85fd3fdfcfa 35 write(DRV2665_FIFO, waveform[i]);
akashvibhute 0:b85fd3fdfcfa 36 wait_us(5);
akashvibhute 0:b85fd3fdfcfa 37 }
akashvibhute 0:b85fd3fdfcfa 38 } else
akashvibhute 0:b85fd3fdfcfa 39 return;
akashvibhute 0:b85fd3fdfcfa 40 }
akashvibhute 0:b85fd3fdfcfa 41
akashvibhute 0:b85fd3fdfcfa 42 void DRV2665_DIGITAL::outputSine(uint16_t hz)
akashvibhute 0:b85fd3fdfcfa 43 {
akashvibhute 0:b85fd3fdfcfa 44 int8_t waveform_byte;
akashvibhute 0:b85fd3fdfcfa 45 uint16_t length;
akashvibhute 0:b85fd3fdfcfa 46
akashvibhute 0:b85fd3fdfcfa 47 //in the linux driver example, a 41 byte waveform plays back at 8kHz
akashvibhute 0:b85fd3fdfcfa 48 //wavelength 41 -> wave time 125us -> frequency 8kHz
akashvibhute 0:b85fd3fdfcfa 49 //hence per byte sampling time = 125us / 41 = 3.04878049
akashvibhute 0:b85fd3fdfcfa 50 //ie 41 bytes :: 8kHz -> 328 bytes :: 1000Hz
akashvibhute 0:b85fd3fdfcfa 51 //calculations done here are from this factor
akashvibhute 0:b85fd3fdfcfa 52
akashvibhute 0:b85fd3fdfcfa 53 length = (1000 * 328) / hz;
akashvibhute 0:b85fd3fdfcfa 54
akashvibhute 0:b85fd3fdfcfa 55 /*
akashvibhute 0:b85fd3fdfcfa 56 //If the above assumption is incorrect, it could be that the DRV plays
akashvibhute 0:b85fd3fdfcfa 57 //anything in its FIFO at a fix rate of 8ksps in that case, it would mean
akashvibhute 0:b85fd3fdfcfa 58 //a per byte play time of 125us, ie for a 100byte wavelength -> a playback
akashvibhute 0:b85fd3fdfcfa 59 //time of 1.25ms (800Hz)
akashvibhute 0:b85fd3fdfcfa 60 //So, 100B :: 800Hz -> 100*800B :: 1Hz
akashvibhute 0:b85fd3fdfcfa 61 //For 'n' Hz :: (100*800/n) B
akashvibhute 0:b85fd3fdfcfa 62
akashvibhute 0:b85fd3fdfcfa 63 length = (100 * 800) / hz;
akashvibhute 0:b85fd3fdfcfa 64 */
akashvibhute 0:b85fd3fdfcfa 65
akashvibhute 0:b85fd3fdfcfa 66
akashvibhute 0:b85fd3fdfcfa 67 for(int i=0; i<length; i++) {
akashvibhute 0:b85fd3fdfcfa 68 waveform_byte = (uint8_t)(102.0 * sin(2*M_PI*i/(length-1))); //102 is the max +ve / -ve value, typecasting in uint8 turns -ve values into 2's complement required by the driver
akashvibhute 0:b85fd3fdfcfa 69
akashvibhute 0:b85fd3fdfcfa 70 write(DRV2665_FIFO, waveform_byte);
akashvibhute 0:b85fd3fdfcfa 71 wait_us(5);
akashvibhute 0:b85fd3fdfcfa 72
akashvibhute 0:b85fd3fdfcfa 73 while(!fifo_check())
akashvibhute 0:b85fd3fdfcfa 74 wait_us(5);
akashvibhute 0:b85fd3fdfcfa 75 }
akashvibhute 0:b85fd3fdfcfa 76 }
akashvibhute 0:b85fd3fdfcfa 77
akashvibhute 0:b85fd3fdfcfa 78 bool DRV2665_DIGITAL::fifo_check()
akashvibhute 0:b85fd3fdfcfa 79 {
akashvibhute 0:b85fd3fdfcfa 80 uint8_t reply;
akashvibhute 0:b85fd3fdfcfa 81 reply = read(DRV2665_STATUS);
akashvibhute 0:b85fd3fdfcfa 82
akashvibhute 0:b85fd3fdfcfa 83 if((reply & 0x01) == 0)
akashvibhute 0:b85fd3fdfcfa 84 return(true);
akashvibhute 0:b85fd3fdfcfa 85 else
akashvibhute 0:b85fd3fdfcfa 86 return(false);
akashvibhute 0:b85fd3fdfcfa 87 }
akashvibhute 0:b85fd3fdfcfa 88
akashvibhute 0:b85fd3fdfcfa 89 void DRV2665_DIGITAL::en_override(bool en)
akashvibhute 0:b85fd3fdfcfa 90 {
akashvibhute 0:b85fd3fdfcfa 91 write(DRV2665_CTRL_2, DRV2665_BOOST_EN);
akashvibhute 0:b85fd3fdfcfa 92 }
akashvibhute 0:b85fd3fdfcfa 93
akashvibhute 0:b85fd3fdfcfa 94 uint8_t DRV2665_DIGITAL::read(char reg)
akashvibhute 0:b85fd3fdfcfa 95 {
akashvibhute 0:b85fd3fdfcfa 96 //Create a temporary buffer
akashvibhute 0:b85fd3fdfcfa 97 char buff[2];
akashvibhute 0:b85fd3fdfcfa 98
akashvibhute 0:b85fd3fdfcfa 99 //Select the register
akashvibhute 0:b85fd3fdfcfa 100 i2c_.write(i2c_addr, &reg, 1, true);
akashvibhute 0:b85fd3fdfcfa 101
akashvibhute 0:b85fd3fdfcfa 102 //Read the 16-bit register
akashvibhute 0:b85fd3fdfcfa 103 i2c_.read(i2c_addr, buff, 2);
akashvibhute 0:b85fd3fdfcfa 104
akashvibhute 0:b85fd3fdfcfa 105 //Return the combined 16-bit value
akashvibhute 0:b85fd3fdfcfa 106 return (buff[0] << 8) | buff[1];
akashvibhute 0:b85fd3fdfcfa 107 }
akashvibhute 0:b85fd3fdfcfa 108
akashvibhute 0:b85fd3fdfcfa 109 void DRV2665_DIGITAL::write(char reg, uint8_t data)
akashvibhute 0:b85fd3fdfcfa 110 {
akashvibhute 0:b85fd3fdfcfa 111 //Create a temporary buffer
akashvibhute 0:b85fd3fdfcfa 112 char buff[2];
akashvibhute 0:b85fd3fdfcfa 113
akashvibhute 0:b85fd3fdfcfa 114 //Load the register address and 16-bit data
akashvibhute 0:b85fd3fdfcfa 115 buff[0] = reg;
akashvibhute 0:b85fd3fdfcfa 116 buff[1] = data;
akashvibhute 0:b85fd3fdfcfa 117
akashvibhute 0:b85fd3fdfcfa 118 //Write the data
akashvibhute 0:b85fd3fdfcfa 119 i2c_.write(i2c_addr, buff, 2);
akashvibhute 0:b85fd3fdfcfa 120 }