2021.12.17
PCA9685.cpp@0:4466d7fb25e2, 2021-12-17 (annotated)
- Committer:
- Kotttaro
- Date:
- Fri Dec 17 05:30:28 2021 +0000
- Revision:
- 0:4466d7fb25e2
2021.12.17;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Kotttaro | 0:4466d7fb25e2 | 1 | #include <mbed.h> |
Kotttaro | 0:4466d7fb25e2 | 2 | #include "PCA9685.h" |
Kotttaro | 0:4466d7fb25e2 | 3 | #define i2c_addr 0x80 |
Kotttaro | 0:4466d7fb25e2 | 4 | I2C i2c(p28,p27); |
Kotttaro | 0:4466d7fb25e2 | 5 | Serial pc(USBTX,USBRX); |
Kotttaro | 0:4466d7fb25e2 | 6 | |
Kotttaro | 0:4466d7fb25e2 | 7 | //PCA9685::PCA9685(uint8_t addr) { |
Kotttaro | 0:4466d7fb25e2 | 8 | // i2c_addr = addr; |
Kotttaro | 0:4466d7fb25e2 | 9 | //} |
Kotttaro | 0:4466d7fb25e2 | 10 | |
Kotttaro | 0:4466d7fb25e2 | 11 | void PCA9685::begin(void) { |
Kotttaro | 0:4466d7fb25e2 | 12 | // WIRE.begin(); |
Kotttaro | 0:4466d7fb25e2 | 13 | reset(); |
Kotttaro | 0:4466d7fb25e2 | 14 | } |
Kotttaro | 0:4466d7fb25e2 | 15 | |
Kotttaro | 0:4466d7fb25e2 | 16 | void PCA9685::reset(void) { |
Kotttaro | 0:4466d7fb25e2 | 17 | write8(PCA9685_MODE1, 0x0); |
Kotttaro | 0:4466d7fb25e2 | 18 | } |
Kotttaro | 0:4466d7fb25e2 | 19 | |
Kotttaro | 0:4466d7fb25e2 | 20 | void PCA9685::setPWMFreq(float freq) { |
Kotttaro | 0:4466d7fb25e2 | 21 | float prescaleval = 25000000; |
Kotttaro | 0:4466d7fb25e2 | 22 | prescaleval /= 4096; |
Kotttaro | 0:4466d7fb25e2 | 23 | prescaleval /= freq; |
Kotttaro | 0:4466d7fb25e2 | 24 | prescaleval -= 1; |
Kotttaro | 0:4466d7fb25e2 | 25 | uint8_t prescale = floor(prescaleval + 0.5); |
Kotttaro | 0:4466d7fb25e2 | 26 | uint8_t oldreg = read8(PCA9685_MODE1); |
Kotttaro | 0:4466d7fb25e2 | 27 | //pc.printf("oldreg=%02X , ",oldreg); |
Kotttaro | 0:4466d7fb25e2 | 28 | uint8_t newreg = (oldreg&0x7F) | 0x10; // sleep |
Kotttaro | 0:4466d7fb25e2 | 29 | write8(PCA9685_MODE1, newreg); // go to sleep |
Kotttaro | 0:4466d7fb25e2 | 30 | wait_ms(5); |
Kotttaro | 0:4466d7fb25e2 | 31 | write8(PCA9685_PRESCALE, prescale); // set the prescaler |
Kotttaro | 0:4466d7fb25e2 | 32 | write8(PCA9685_MODE1, oldreg); |
Kotttaro | 0:4466d7fb25e2 | 33 | wait_ms(5); |
Kotttaro | 0:4466d7fb25e2 | 34 | write8(PCA9685_MODE1, oldreg | 0xa1); // This sets the MODE1 register to turn on auto increment. |
Kotttaro | 0:4466d7fb25e2 | 35 | } |
Kotttaro | 0:4466d7fb25e2 | 36 | |
Kotttaro | 0:4466d7fb25e2 | 37 | void PCA9685::setPWM(uint8_t num, uint16_t on, uint16_t off) { |
Kotttaro | 0:4466d7fb25e2 | 38 | //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off); |
Kotttaro | 0:4466d7fb25e2 | 39 | //int ded; |
Kotttaro | 0:4466d7fb25e2 | 40 | char cmd[5];//WIRE.beginTransmission(i2c_addr); |
Kotttaro | 0:4466d7fb25e2 | 41 | cmd[0]=LED0_ON_L+4*num;//WIRE.write(LED0_ON_L+4*num); |
Kotttaro | 0:4466d7fb25e2 | 42 | cmd[1]=on&0xFF;//WIRE.write(on); |
Kotttaro | 0:4466d7fb25e2 | 43 | cmd[2]=on>>8;//WIRE.write(on>>8); |
Kotttaro | 0:4466d7fb25e2 | 44 | cmd[3]=off&0xFF;//WIRE.write(off); |
Kotttaro | 0:4466d7fb25e2 | 45 | cmd[4]=off>>8;//WIRE.write(off>>8); |
Kotttaro | 0:4466d7fb25e2 | 46 | i2c.write(i2c_addr,cmd,5);//WIRE.endTransmission(); |
Kotttaro | 0:4466d7fb25e2 | 47 | //pc.printf("write 5 %d\r\n",ded); |
Kotttaro | 0:4466d7fb25e2 | 48 | } |
Kotttaro | 0:4466d7fb25e2 | 49 | |
Kotttaro | 0:4466d7fb25e2 | 50 | void PCA9685::write8(uint8_t addr, uint8_t d) { |
Kotttaro | 0:4466d7fb25e2 | 51 | //int val; |
Kotttaro | 0:4466d7fb25e2 | 52 | char cmd[2];//WIRE.beginTransmission(i2c_addr); |
Kotttaro | 0:4466d7fb25e2 | 53 | cmd[0]=addr;//WIRE.write(addr); |
Kotttaro | 0:4466d7fb25e2 | 54 | cmd[1]=d;//WIRE.write(d); |
Kotttaro | 0:4466d7fb25e2 | 55 | i2c.write(i2c_addr,cmd,2);//WIRE.endTransmission(); |
Kotttaro | 0:4466d7fb25e2 | 56 | //pc.printf("write %d\r\n",val); |
Kotttaro | 0:4466d7fb25e2 | 57 | } |
Kotttaro | 0:4466d7fb25e2 | 58 | |
Kotttaro | 0:4466d7fb25e2 | 59 | uint8_t PCA9685::read8(uint8_t addr) { |
Kotttaro | 0:4466d7fb25e2 | 60 | //int val; |
Kotttaro | 0:4466d7fb25e2 | 61 | char cmd[1]; //WIRE.beginTransmission(i2c_addr); |
Kotttaro | 0:4466d7fb25e2 | 62 | cmd[0]=addr; |
Kotttaro | 0:4466d7fb25e2 | 63 | i2c.write(i2c_addr,cmd,1); //WIRE.write(addr); |
Kotttaro | 0:4466d7fb25e2 | 64 | //WIRE.endTransmission(); |
Kotttaro | 0:4466d7fb25e2 | 65 | //pc.printf("write %d\r\n",val); |
Kotttaro | 0:4466d7fb25e2 | 66 | char rtn[1]; |
Kotttaro | 0:4466d7fb25e2 | 67 | i2c.read(i2c_addr,rtn,1); //WIRE.requestFrom((uint8_t)i2c_addr, (uint8_t)1); |
Kotttaro | 0:4466d7fb25e2 | 68 | //pc.printf("read %d %c\r\n",val,rtn[0]); |
Kotttaro | 0:4466d7fb25e2 | 69 | return rtn[0]; //return WIRE.read(); |
Kotttaro | 0:4466d7fb25e2 | 70 | } |