microbit fork
Dependents: demoMicroBit_PCA9685
Fork of PCA9685PWM by
MicroBitPCA9685.h@2:429b0b439bc1, 2017-01-13 (annotated)
- Committer:
- Asimov
- Date:
- Fri Jan 13 21:00:21 2017 +0000
- Revision:
- 2:429b0b439bc1
Just a copy
Who changed what in which revision?
User | Revision | Line number | New 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 |