microbit fork

Dependents:   demoMicroBit_PCA9685

Fork of PCA9685PWM by Paolo Sanna

Revision:
2:429b0b439bc1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MicroBitPCA9685.h	Fri Jan 13 21:00:21 2017 +0000
@@ -0,0 +1,110 @@
+/**Library for PCA9685 16-channel, 12-bit PWM Fm+ I²C-bus LED controller
+* Example code
+* @code
+*
+*#include"PCA9685.h"
+*#include"mbed.h"
+*
+*
+*
+*PCA9685 pwm(D14,D15);
+* 
+*void setServoPulse(uint8_t n, float pulse) {
+*    float pulselength = 10000;   // 10,000 units per seconds
+*    pulse = 4094 * pulse / pulselength;
+*    pwm.setPWM(n, 0, pulse);
+*}
+* 
+*void initServoDriver() {
+*    pwm.begin();
+*    pwm.setPrescale(64);    //This value is decided for 10ms interval.
+*    pwm.frequencyI2C(400000); //400kHz
+*}
+* 
+* int main() {
+*
+*    while(1){
+*    initServoDriver();
+*    wait(0.2);
+*    setServoPulse(0, 2300);
+*    setServoPulse(1, 500);    
+*    wait(0.5);//delay necessary to perform the action
+*    setServoPulse(0, 1350);
+*    setServoPulse(1, 1350);
+*    wait(0.5);
+*    setServoPulse(0,550);
+*    setServoPulse(1, 2250);
+*    wait(0.5);
+*    setServoPulse(0, 2300);
+*    wait(2);
+*    for (int mov = 550; mov < 2300; mov++){
+*    setServoPulse(0, mov);
+*    wait(0.001); 
+*    }  
+*    for (int mov = 500; mov < 2200; mov++){
+*    setServoPulse(1, mov);
+*    wait(0.001); 
+*    }     
+*   }
+*}
+*@endcode
+*
+*/
+#ifndef MicroBitPCA9685_H
+#define MicroBitPCA9685_H
+
+#include <cmath>
+//register definitions
+#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 MicroBitPCA9685
+{
+public:
+    MicroBitPCA9685(MicroBitI2C& _i2c, uint8_t addr = 0x40);
+    void frequencyI2C(int freq);
+    void begin(void); //Initialize the controller
+    void reset(void); //Reset the controller
+    void setPrescale(uint8_t prescale);//setPrescale(prescale)
+    /** Set prescale
+     *
+     *  @param prescale: set scale for the PWM frequency
+     *
+     */
+    void setPWMFreq(float freq);//Set the pwm frequency
+    /** Set frequency
+      *
+      * @param frequency in Hz
+      *
+      */
+    int setPWM(uint8_t num, uint16_t on, uint16_t off);//SetPWM(channel, on, off)
+    /** Set the start (on) and the end (off) of the part of the PWM pulse of the channel
+     *  @param channel : from 0 to 15 the channel the should be update
+     *  @param  on: from 0 to 4095 the tick when the signal should pass from low to high
+     *  @param off: from 0 to 4095 the tick when the signal should pass from high to low
+     */
+     
+     int setAllPWM(uint16_t on, uint16_t off);
+private:
+    int write8(uint8_t address, uint8_t data);
+    char read8(char address);
+    uint8_t _i2caddr;
+    MicroBitI2C& i2c;
+};
+
+#endif
\ No newline at end of file