2021.12.17

Files at this revision

API Documentation at this revision

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