2021.12.17
Revision 0:4466d7fb25e2, committed 2021-12-17
- Comitter:
- Kotttaro
- Date:
- Fri Dec 17 05:30:28 2021 +0000
- Commit message:
- 2021.12.17;
Changed in this revision
PCA9685.cpp | Show annotated file Show diff for this revision Revisions of this file |
PCA9685.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 4466d7fb25e2 PCA9685.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PCA9685.cpp Fri Dec 17 05:30:28 2021 +0000 @@ -0,0 +1,70 @@ +#include <mbed.h> +#include "PCA9685.h" +#define i2c_addr 0x80 +I2C i2c(p28,p27); +Serial pc(USBTX,USBRX); + +//PCA9685::PCA9685(uint8_t addr) { +// i2c_addr = addr; +//} + +void PCA9685::begin(void) { +// WIRE.begin(); + reset(); +} + +void PCA9685::reset(void) { + write8(PCA9685_MODE1, 0x0); +} + +void PCA9685::setPWMFreq(float freq) { + float prescaleval = 25000000; + prescaleval /= 4096; + prescaleval /= freq; + prescaleval -= 1; + uint8_t prescale = floor(prescaleval + 0.5); + uint8_t oldreg = read8(PCA9685_MODE1); + //pc.printf("oldreg=%02X , ",oldreg); + uint8_t newreg = (oldreg&0x7F) | 0x10; // sleep + write8(PCA9685_MODE1, newreg); // go to sleep + wait_ms(5); + write8(PCA9685_PRESCALE, prescale); // set the prescaler + write8(PCA9685_MODE1, oldreg); + wait_ms(5); + write8(PCA9685_MODE1, oldreg | 0xa1); // This sets the MODE1 register to turn on auto increment. +} + +void PCA9685::setPWM(uint8_t num, uint16_t on, uint16_t off) { + //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off); + //int ded; + char cmd[5];//WIRE.beginTransmission(i2c_addr); + cmd[0]=LED0_ON_L+4*num;//WIRE.write(LED0_ON_L+4*num); + cmd[1]=on&0xFF;//WIRE.write(on); + cmd[2]=on>>8;//WIRE.write(on>>8); + cmd[3]=off&0xFF;//WIRE.write(off); + cmd[4]=off>>8;//WIRE.write(off>>8); + i2c.write(i2c_addr,cmd,5);//WIRE.endTransmission(); + //pc.printf("write 5 %d\r\n",ded); +} + +void PCA9685::write8(uint8_t addr, uint8_t d) { + //int val; + char cmd[2];//WIRE.beginTransmission(i2c_addr); + cmd[0]=addr;//WIRE.write(addr); + cmd[1]=d;//WIRE.write(d); + i2c.write(i2c_addr,cmd,2);//WIRE.endTransmission(); + //pc.printf("write %d\r\n",val); +} + +uint8_t PCA9685::read8(uint8_t addr) { + //int val; + char cmd[1]; //WIRE.beginTransmission(i2c_addr); + cmd[0]=addr; + i2c.write(i2c_addr,cmd,1); //WIRE.write(addr); + //WIRE.endTransmission(); + //pc.printf("write %d\r\n",val); + char rtn[1]; + i2c.read(i2c_addr,rtn,1); //WIRE.requestFrom((uint8_t)i2c_addr, (uint8_t)1); + //pc.printf("read %d %c\r\n",val,rtn[0]); + return rtn[0]; //return WIRE.read(); +}
diff -r 000000000000 -r 4466d7fb25e2 PCA9685.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PCA9685.h Fri Dec 17 05:30:28 2021 +0000 @@ -0,0 +1,46 @@ +#ifndef _PCA9685_H +#define _PCA9685_H + +//#if ARDUINO >= 100 +// #include "Arduino.h" +//#else +// #include "WProgram.h" +//#endif + +#include"mbed.h" + +#define PCA9685_SUBADR1 0x2 +#define PCA9685_SUBADR2 0x3 +#define PCA9685_SUBADR3 0x4 + +#define PCA9685_MODE1 0x0 +#define PCA9685_PRESCALE 0xFE + +#define LED0_ON_L 0x6 +#define LED0_ON_H 0x7 +#define LED0_OFF_L 0x8 +#define LED0_OFF_H 0x9 + +#define ALLLED_ON_L 0xFA +#define ALLLED_ON_H 0xFB +#define ALLLED_OFF_L 0xFC +#define ALLLED_OFF_H 0xFD + + +class PCA9685 { + public: + //PCA9685(uint8_t addr = 0x40); + void begin(void); + void reset(void); + void setPWMFreq(float freq); + void setPWM(uint8_t num, uint16_t on, uint16_t off); + void setPin(uint8_t num, uint16_t val, bool invert=false); + + private: + uint8_t i2c_addr; + + uint8_t read8(uint8_t addr); + void write8(uint8_t addr, uint8_t d); +}; + +#endif