2021.12.17

Committer:
Kotttaro
Date:
Fri Dec 17 05:30:28 2021 +0000
Revision:
0:4466d7fb25e2
2021.12.17;

Who changed what in which revision?

UserRevisionLine numberNew 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 }