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