PCA TEST

Dependencies:   mbed

Fork of PCA9685PWM by Paolo Sanna

Committer:
dreamworker
Date:
Wed Jul 22 08:06:28 2015 +0000
Revision:
0:c7f4744deec3
Child:
2:3e7e063a6538
Library for 16-channel, 12-bit PWM Fm+ I?C-bus LED controller PCA9685 of NXP.

Who changed what in which revision?

UserRevisionLine numberNew 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