basic pca9685

Fork of ic2_test_bus by Martin Simpson

Committer:
richnash
Date:
Mon Oct 29 14:56:07 2018 +0000
Revision:
1:dbe78e80d722
basic pca9685

Who changed what in which revision?

UserRevisionLine numberNew contents of line
richnash 1:dbe78e80d722 1 #include "PCA9685.h"
richnash 1:dbe78e80d722 2 #include "mbed.h"
richnash 1:dbe78e80d722 3 PCA9685::PCA9685(PinName sda, PinName scl, int addr) : i2c(sda, scl), _i2caddr(addr) {}
richnash 1:dbe78e80d722 4
richnash 1:dbe78e80d722 5 void PCA9685::begin(void)
richnash 1:dbe78e80d722 6 {
richnash 1:dbe78e80d722 7 reset();
richnash 1:dbe78e80d722 8 }
richnash 1:dbe78e80d722 9
richnash 1:dbe78e80d722 10 void PCA9685::frequencyI2C(int freq)
richnash 1:dbe78e80d722 11 {
richnash 1:dbe78e80d722 12 i2c.frequency(freq);
richnash 1:dbe78e80d722 13 }
richnash 1:dbe78e80d722 14 void PCA9685::write8(uint8_t address, uint8_t data)
richnash 1:dbe78e80d722 15 {
richnash 1:dbe78e80d722 16 char cmd[2];
richnash 1:dbe78e80d722 17 cmd[0] = address;
richnash 1:dbe78e80d722 18 cmd[1] = data;
richnash 1:dbe78e80d722 19 i2c.write(_i2caddr, cmd, 2);
richnash 1:dbe78e80d722 20 }
richnash 1:dbe78e80d722 21
richnash 1:dbe78e80d722 22 char PCA9685::read8(char address)
richnash 1:dbe78e80d722 23 {
richnash 1:dbe78e80d722 24 i2c.write(_i2caddr, &address, 1);
richnash 1:dbe78e80d722 25 char rtn;
richnash 1:dbe78e80d722 26 i2c.read(_i2caddr, &rtn, 1);
richnash 1:dbe78e80d722 27 return rtn;
richnash 1:dbe78e80d722 28 }
richnash 1:dbe78e80d722 29
richnash 1:dbe78e80d722 30 void PCA9685::reset(void)
richnash 1:dbe78e80d722 31 {
richnash 1:dbe78e80d722 32 write8(PCA9685_MODE1, 0x0);
richnash 1:dbe78e80d722 33 }
richnash 1:dbe78e80d722 34 void PCA9685::setPrescale(uint8_t prescale) {
richnash 1:dbe78e80d722 35 uint8_t oldmode = read8(PCA9685_MODE1);
richnash 1:dbe78e80d722 36 uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
richnash 1:dbe78e80d722 37 write8(PCA9685_MODE1, newmode); // go to sleep
richnash 1:dbe78e80d722 38 wait_ms(5);
richnash 1:dbe78e80d722 39 write8(PCA9685_PRESCALE, prescale); // set the prescaler
richnash 1:dbe78e80d722 40 write8(PCA9685_MODE1, oldmode);
richnash 1:dbe78e80d722 41 wait_ms(5);
richnash 1:dbe78e80d722 42 write8(PCA9685_MODE1, oldmode | 0xa1);
richnash 1:dbe78e80d722 43 }
richnash 1:dbe78e80d722 44 void PCA9685::setPWMFreq(float freq)
richnash 1:dbe78e80d722 45 {
richnash 1:dbe78e80d722 46 float prescaleval = 25000000;
richnash 1:dbe78e80d722 47 prescaleval /= 4096;
richnash 1:dbe78e80d722 48 prescaleval /= freq;
richnash 1:dbe78e80d722 49 uint8_t prescale = floor(prescaleval + 0.5) - 1;
richnash 1:dbe78e80d722 50 setPrescale(prescale);
richnash 1:dbe78e80d722 51 }
richnash 1:dbe78e80d722 52
richnash 1:dbe78e80d722 53 void PCA9685::setPWM(uint8_t num, uint16_t on, uint16_t off)
richnash 1:dbe78e80d722 54 {
richnash 1:dbe78e80d722 55 char cmd[5];
richnash 1:dbe78e80d722 56 cmd[0] = LED0_ON_L + 4 * num;
richnash 1:dbe78e80d722 57 cmd[1] = on;
richnash 1:dbe78e80d722 58 cmd[2] = on >> 8;
richnash 1:dbe78e80d722 59 cmd[3] = off;
richnash 1:dbe78e80d722 60 cmd[4] = off >> 8;
richnash 1:dbe78e80d722 61 i2c.write(_i2caddr, cmd, 5);
richnash 1:dbe78e80d722 62 }
richnash 1:dbe78e80d722 63
richnash 1:dbe78e80d722 64 void PCA9685::setPWM_ALL(uint16_t on, uint16_t off)
richnash 1:dbe78e80d722 65 {
richnash 1:dbe78e80d722 66 char cmd[5];
richnash 1:dbe78e80d722 67
richnash 1:dbe78e80d722 68 for (uint8_t num = 0; num < 16; num++)
richnash 1:dbe78e80d722 69 {
richnash 1:dbe78e80d722 70 cmd[0] = LED0_ON_L + 4 * num;
richnash 1:dbe78e80d722 71 cmd[1] = on;
richnash 1:dbe78e80d722 72 cmd[2] = on >> 8;
richnash 1:dbe78e80d722 73 cmd[3] = off;
richnash 1:dbe78e80d722 74 cmd[4] = off >> 8;
richnash 1:dbe78e80d722 75 i2c.write(_i2caddr, cmd, 5);
richnash 1:dbe78e80d722 76 wait(0.0005);
richnash 1:dbe78e80d722 77 }
richnash 1:dbe78e80d722 78
richnash 1:dbe78e80d722 79 }