microbit fork

Dependents:   demoMicroBit_PCA9685

Fork of PCA9685PWM by Paolo Sanna

Committer:
Asimov
Date:
Fri Jan 13 21:00:21 2017 +0000
Revision:
2:429b0b439bc1
Just a copy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Asimov 2:429b0b439bc1 1 /**Library for PCA9685 16-channel, 12-bit PWM Fm+ I²C-bus LED controller
Asimov 2:429b0b439bc1 2 * Example code
Asimov 2:429b0b439bc1 3 * @code
Asimov 2:429b0b439bc1 4 *
Asimov 2:429b0b439bc1 5 *#include"PCA9685.h"
Asimov 2:429b0b439bc1 6 *#include"mbed.h"
Asimov 2:429b0b439bc1 7 *
Asimov 2:429b0b439bc1 8 *
Asimov 2:429b0b439bc1 9 *
Asimov 2:429b0b439bc1 10 *PCA9685 pwm(D14,D15);
Asimov 2:429b0b439bc1 11 *
Asimov 2:429b0b439bc1 12 *void setServoPulse(uint8_t n, float pulse) {
Asimov 2:429b0b439bc1 13 * float pulselength = 10000; // 10,000 units per seconds
Asimov 2:429b0b439bc1 14 * pulse = 4094 * pulse / pulselength;
Asimov 2:429b0b439bc1 15 * pwm.setPWM(n, 0, pulse);
Asimov 2:429b0b439bc1 16 *}
Asimov 2:429b0b439bc1 17 *
Asimov 2:429b0b439bc1 18 *void initServoDriver() {
Asimov 2:429b0b439bc1 19 * pwm.begin();
Asimov 2:429b0b439bc1 20 * pwm.setPrescale(64); //This value is decided for 10ms interval.
Asimov 2:429b0b439bc1 21 * pwm.frequencyI2C(400000); //400kHz
Asimov 2:429b0b439bc1 22 *}
Asimov 2:429b0b439bc1 23 *
Asimov 2:429b0b439bc1 24 * int main() {
Asimov 2:429b0b439bc1 25 *
Asimov 2:429b0b439bc1 26 * while(1){
Asimov 2:429b0b439bc1 27 * initServoDriver();
Asimov 2:429b0b439bc1 28 * wait(0.2);
Asimov 2:429b0b439bc1 29 * setServoPulse(0, 2300);
Asimov 2:429b0b439bc1 30 * setServoPulse(1, 500);
Asimov 2:429b0b439bc1 31 * wait(0.5);//delay necessary to perform the action
Asimov 2:429b0b439bc1 32 * setServoPulse(0, 1350);
Asimov 2:429b0b439bc1 33 * setServoPulse(1, 1350);
Asimov 2:429b0b439bc1 34 * wait(0.5);
Asimov 2:429b0b439bc1 35 * setServoPulse(0,550);
Asimov 2:429b0b439bc1 36 * setServoPulse(1, 2250);
Asimov 2:429b0b439bc1 37 * wait(0.5);
Asimov 2:429b0b439bc1 38 * setServoPulse(0, 2300);
Asimov 2:429b0b439bc1 39 * wait(2);
Asimov 2:429b0b439bc1 40 * for (int mov = 550; mov < 2300; mov++){
Asimov 2:429b0b439bc1 41 * setServoPulse(0, mov);
Asimov 2:429b0b439bc1 42 * wait(0.001);
Asimov 2:429b0b439bc1 43 * }
Asimov 2:429b0b439bc1 44 * for (int mov = 500; mov < 2200; mov++){
Asimov 2:429b0b439bc1 45 * setServoPulse(1, mov);
Asimov 2:429b0b439bc1 46 * wait(0.001);
Asimov 2:429b0b439bc1 47 * }
Asimov 2:429b0b439bc1 48 * }
Asimov 2:429b0b439bc1 49 *}
Asimov 2:429b0b439bc1 50 *@endcode
Asimov 2:429b0b439bc1 51 *
Asimov 2:429b0b439bc1 52 */
Asimov 2:429b0b439bc1 53 #ifndef MicroBitPCA9685_H
Asimov 2:429b0b439bc1 54 #define MicroBitPCA9685_H
Asimov 2:429b0b439bc1 55
Asimov 2:429b0b439bc1 56 #include <cmath>
Asimov 2:429b0b439bc1 57 //register definitions
Asimov 2:429b0b439bc1 58 #define PCA9685_SUBADR1 0x2
Asimov 2:429b0b439bc1 59 #define PCA9685_SUBADR2 0x3
Asimov 2:429b0b439bc1 60 #define PCA9685_SUBADR3 0x4
Asimov 2:429b0b439bc1 61
Asimov 2:429b0b439bc1 62 #define PCA9685_MODE1 0x0
Asimov 2:429b0b439bc1 63 #define PCA9685_PRESCALE 0xFE
Asimov 2:429b0b439bc1 64
Asimov 2:429b0b439bc1 65 #define LED0_ON_L 0x6
Asimov 2:429b0b439bc1 66 #define LED0_ON_H 0x7
Asimov 2:429b0b439bc1 67 #define LED0_OFF_L 0x8
Asimov 2:429b0b439bc1 68 #define LED0_OFF_H 0x9
Asimov 2:429b0b439bc1 69
Asimov 2:429b0b439bc1 70 #define ALLLED_ON_L 0xFA
Asimov 2:429b0b439bc1 71 #define ALLLED_ON_H 0xFB
Asimov 2:429b0b439bc1 72 #define ALLLED_OFF_L 0xFC
Asimov 2:429b0b439bc1 73 #define ALLLED_OFF_H 0xFD
Asimov 2:429b0b439bc1 74
Asimov 2:429b0b439bc1 75
Asimov 2:429b0b439bc1 76 class MicroBitPCA9685
Asimov 2:429b0b439bc1 77 {
Asimov 2:429b0b439bc1 78 public:
Asimov 2:429b0b439bc1 79 MicroBitPCA9685(MicroBitI2C& _i2c, uint8_t addr = 0x40);
Asimov 2:429b0b439bc1 80 void frequencyI2C(int freq);
Asimov 2:429b0b439bc1 81 void begin(void); //Initialize the controller
Asimov 2:429b0b439bc1 82 void reset(void); //Reset the controller
Asimov 2:429b0b439bc1 83 void setPrescale(uint8_t prescale);//setPrescale(prescale)
Asimov 2:429b0b439bc1 84 /** Set prescale
Asimov 2:429b0b439bc1 85 *
Asimov 2:429b0b439bc1 86 * @param prescale: set scale for the PWM frequency
Asimov 2:429b0b439bc1 87 *
Asimov 2:429b0b439bc1 88 */
Asimov 2:429b0b439bc1 89 void setPWMFreq(float freq);//Set the pwm frequency
Asimov 2:429b0b439bc1 90 /** Set frequency
Asimov 2:429b0b439bc1 91 *
Asimov 2:429b0b439bc1 92 * @param frequency in Hz
Asimov 2:429b0b439bc1 93 *
Asimov 2:429b0b439bc1 94 */
Asimov 2:429b0b439bc1 95 int setPWM(uint8_t num, uint16_t on, uint16_t off);//SetPWM(channel, on, off)
Asimov 2:429b0b439bc1 96 /** Set the start (on) and the end (off) of the part of the PWM pulse of the channel
Asimov 2:429b0b439bc1 97 * @param channel : from 0 to 15 the channel the should be update
Asimov 2:429b0b439bc1 98 * @param on: from 0 to 4095 the tick when the signal should pass from low to high
Asimov 2:429b0b439bc1 99 * @param off: from 0 to 4095 the tick when the signal should pass from high to low
Asimov 2:429b0b439bc1 100 */
Asimov 2:429b0b439bc1 101
Asimov 2:429b0b439bc1 102 int setAllPWM(uint16_t on, uint16_t off);
Asimov 2:429b0b439bc1 103 private:
Asimov 2:429b0b439bc1 104 int write8(uint8_t address, uint8_t data);
Asimov 2:429b0b439bc1 105 char read8(char address);
Asimov 2:429b0b439bc1 106 uint8_t _i2caddr;
Asimov 2:429b0b439bc1 107 MicroBitI2C& i2c;
Asimov 2:429b0b439bc1 108 };
Asimov 2:429b0b439bc1 109
Asimov 2:429b0b439bc1 110 #endif