XBEE receiver v2

Dependencies:   mbed

Committer:
MoussOudj
Date:
Wed Jun 20 20:09:53 2018 +0000
Revision:
0:dbef204fd840
XBEE_RECEIVER_V2_OK_20/06/2018

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MoussOudj 0:dbef204fd840 1 #ifndef PCA9685_LIBRARY_CPP
MoussOudj 0:dbef204fd840 2 #define PCA9685_LIBRARY_CPP
MoussOudj 0:dbef204fd840 3
MoussOudj 0:dbef204fd840 4
MoussOudj 0:dbef204fd840 5 #include "mbed.h"
MoussOudj 0:dbef204fd840 6 #include "PCA9685.h"
MoussOudj 0:dbef204fd840 7 #include "definitions.h"
MoussOudj 0:dbef204fd840 8
MoussOudj 0:dbef204fd840 9
MoussOudj 0:dbef204fd840 10 PCA9685::PCA9685(uint8_t i2c_address, I2C i2c_object, float frequency) :
MoussOudj 0:dbef204fd840 11
MoussOudj 0:dbef204fd840 12 i2c_addr(i2c_address),
MoussOudj 0:dbef204fd840 13 freq(frequency),
MoussOudj 0:dbef204fd840 14 i2c(i2c_object)
MoussOudj 0:dbef204fd840 15
MoussOudj 0:dbef204fd840 16 {
MoussOudj 0:dbef204fd840 17
MoussOudj 0:dbef204fd840 18 }
MoussOudj 0:dbef204fd840 19
MoussOudj 0:dbef204fd840 20 void PCA9685::init(void)
MoussOudj 0:dbef204fd840 21 {
MoussOudj 0:dbef204fd840 22
MoussOudj 0:dbef204fd840 23 reset();
MoussOudj 0:dbef204fd840 24
MoussOudj 0:dbef204fd840 25 uint8_t prescale = (uint8_t) (OSC_CLOCK / (4096 * PWM_SCALER * freq)) - 1;
MoussOudj 0:dbef204fd840 26
MoussOudj 0:dbef204fd840 27 write_8(MODE1, 0x21); //0010 0001 : AI ENABLED
MoussOudj 0:dbef204fd840 28 write_8(MODE2, 0x07); //0000 0111 : NOT INVRT, CHANGE ON STOP, TOTEM POLE, \OE = 1, LEDn = HIGH IMP
MoussOudj 0:dbef204fd840 29
MoussOudj 0:dbef204fd840 30 set_prescale(prescale);
MoussOudj 0:dbef204fd840 31
MoussOudj 0:dbef204fd840 32 }
MoussOudj 0:dbef204fd840 33
MoussOudj 0:dbef204fd840 34 void PCA9685::reset(void)
MoussOudj 0:dbef204fd840 35 {
MoussOudj 0:dbef204fd840 36
MoussOudj 0:dbef204fd840 37 write_8(MODE1,0x00);
MoussOudj 0:dbef204fd840 38
MoussOudj 0:dbef204fd840 39 }
MoussOudj 0:dbef204fd840 40
MoussOudj 0:dbef204fd840 41 void PCA9685::set_prescale(uint8_t prescale)
MoussOudj 0:dbef204fd840 42 {
MoussOudj 0:dbef204fd840 43
MoussOudj 0:dbef204fd840 44 uint8_t oldmode = read_8(MODE1);
MoussOudj 0:dbef204fd840 45 uint8_t newmode = (oldmode&0x7F) | 0x10; // set the sleep bit
MoussOudj 0:dbef204fd840 46
MoussOudj 0:dbef204fd840 47 write_8(MODE1, newmode); // send the device to sleep
MoussOudj 0:dbef204fd840 48 wait_ms(5);
MoussOudj 0:dbef204fd840 49 write_8(PRESCALE, prescale); // set the prescaler
MoussOudj 0:dbef204fd840 50 write_8(MODE1, oldmode);
MoussOudj 0:dbef204fd840 51 wait_ms(5);
MoussOudj 0:dbef204fd840 52 write_8(MODE1, oldmode | 0xa1); // wake up the device
MoussOudj 0:dbef204fd840 53
MoussOudj 0:dbef204fd840 54 }
MoussOudj 0:dbef204fd840 55
MoussOudj 0:dbef204fd840 56
MoussOudj 0:dbef204fd840 57 //NB REQUIRES AUTO-INCREMENT MODE ENABLED
MoussOudj 0:dbef204fd840 58 //0 <= pwm_output <= 15
MoussOudj 0:dbef204fd840 59 //0 <= (count_on || count_off) <= 4095
MoussOudj 0:dbef204fd840 60 void PCA9685::set_pwm_output(int pwm_output, uint16_t count_on, uint16_t count_off)
MoussOudj 0:dbef204fd840 61 {
MoussOudj 0:dbef204fd840 62
MoussOudj 0:dbef204fd840 63 char msg[5];
MoussOudj 0:dbef204fd840 64
MoussOudj 0:dbef204fd840 65 msg[0] = LED0_ON_L + (4 * pwm_output);
MoussOudj 0:dbef204fd840 66 msg[1] = count_on;
MoussOudj 0:dbef204fd840 67 msg[2] = count_on >> 8;
MoussOudj 0:dbef204fd840 68 msg[3] = count_off;
MoussOudj 0:dbef204fd840 69 msg[4] = count_off >> 8;
MoussOudj 0:dbef204fd840 70
MoussOudj 0:dbef204fd840 71 i2c.write(i2c_addr, msg, 5);
MoussOudj 0:dbef204fd840 72
MoussOudj 0:dbef204fd840 73 }
MoussOudj 0:dbef204fd840 74
MoussOudj 0:dbef204fd840 75 void PCA9685::set_pwm_output_on_0(int pwm_output, uint16_t count_off)
MoussOudj 0:dbef204fd840 76 {
MoussOudj 0:dbef204fd840 77
MoussOudj 0:dbef204fd840 78 char msg[3];
MoussOudj 0:dbef204fd840 79
MoussOudj 0:dbef204fd840 80 msg[0] = LED0_ON_L + 2 + (4 * pwm_output);
MoussOudj 0:dbef204fd840 81 msg[1] = count_off;
MoussOudj 0:dbef204fd840 82 msg[2] = count_off >> 8;
MoussOudj 0:dbef204fd840 83
MoussOudj 0:dbef204fd840 84 i2c.write(i2c_addr,msg,3);
MoussOudj 0:dbef204fd840 85
MoussOudj 0:dbef204fd840 86 }
MoussOudj 0:dbef204fd840 87
MoussOudj 0:dbef204fd840 88
MoussOudj 0:dbef204fd840 89 //NB REQUIRES AUTO-INCREMENT MODE ENABLED
MoussOudj 0:dbef204fd840 90 //0 <= pwm_output <= 15
MoussOudj 0:dbef204fd840 91 void PCA9685::set_pwm_duty(int pwm_output, float duty_cycle)
MoussOudj 0:dbef204fd840 92 {
MoussOudj 0:dbef204fd840 93
MoussOudj 0:dbef204fd840 94 if (duty_cycle > 1.0) {
MoussOudj 0:dbef204fd840 95 duty_cycle = 1.0;
MoussOudj 0:dbef204fd840 96 }
MoussOudj 0:dbef204fd840 97 if (duty_cycle < 0.0) {
MoussOudj 0:dbef204fd840 98 duty_cycle = 0.0;
MoussOudj 0:dbef204fd840 99 }
MoussOudj 0:dbef204fd840 100
MoussOudj 0:dbef204fd840 101 uint16_t count_off = (uint16_t) (duty_cycle * 4095);
MoussOudj 0:dbef204fd840 102 uint16_t count_on = 0x0000;
MoussOudj 0:dbef204fd840 103
MoussOudj 0:dbef204fd840 104 set_pwm_output(pwm_output, count_on, count_off);
MoussOudj 0:dbef204fd840 105
MoussOudj 0:dbef204fd840 106 }
MoussOudj 0:dbef204fd840 107
MoussOudj 0:dbef204fd840 108
MoussOudj 0:dbef204fd840 109 //NB REQUIRES AUTO-INCREMENT MODE ENABLED
MoussOudj 0:dbef204fd840 110 //0 <= pwm_output <= 15
MoussOudj 0:dbef204fd840 111 void PCA9685::set_pwm_pw(int pwm_output, float pulse_width_us)
MoussOudj 0:dbef204fd840 112 {
MoussOudj 0:dbef204fd840 113
MoussOudj 0:dbef204fd840 114 float period_us = (1e6/freq);
MoussOudj 0:dbef204fd840 115
MoussOudj 0:dbef204fd840 116 float duty = pulse_width_us/period_us;
MoussOudj 0:dbef204fd840 117
MoussOudj 0:dbef204fd840 118 set_pwm_duty(pwm_output, duty);
MoussOudj 0:dbef204fd840 119
MoussOudj 0:dbef204fd840 120 }
MoussOudj 0:dbef204fd840 121
MoussOudj 0:dbef204fd840 122
MoussOudj 0:dbef204fd840 123 void PCA9685::update(void)
MoussOudj 0:dbef204fd840 124 {
MoussOudj 0:dbef204fd840 125
MoussOudj 0:dbef204fd840 126 i2c.stop();
MoussOudj 0:dbef204fd840 127
MoussOudj 0:dbef204fd840 128 }
MoussOudj 0:dbef204fd840 129
MoussOudj 0:dbef204fd840 130
MoussOudj 0:dbef204fd840 131
MoussOudj 0:dbef204fd840 132 void PCA9685::write_8(uint8_t reg, uint8_t msg)
MoussOudj 0:dbef204fd840 133 {
MoussOudj 0:dbef204fd840 134
MoussOudj 0:dbef204fd840 135 char send[2]; //Store the address and data in an array
MoussOudj 0:dbef204fd840 136 send[0] = reg;
MoussOudj 0:dbef204fd840 137 send[1] = msg;
MoussOudj 0:dbef204fd840 138 i2c.write(i2c_addr, send, 2);
MoussOudj 0:dbef204fd840 139
MoussOudj 0:dbef204fd840 140 }
MoussOudj 0:dbef204fd840 141
MoussOudj 0:dbef204fd840 142 uint8_t PCA9685::read_8(uint8_t reg)
MoussOudj 0:dbef204fd840 143 {
MoussOudj 0:dbef204fd840 144
MoussOudj 0:dbef204fd840 145 char send[1] ;
MoussOudj 0:dbef204fd840 146 send[0] = reg;
MoussOudj 0:dbef204fd840 147 i2c.write(i2c_addr, send, 1);
MoussOudj 0:dbef204fd840 148 char recieve[1];
MoussOudj 0:dbef204fd840 149 i2c.read(i2c_addr, recieve, 1);
MoussOudj 0:dbef204fd840 150 return recieve[0];
MoussOudj 0:dbef204fd840 151
MoussOudj 0:dbef204fd840 152 }
MoussOudj 0:dbef204fd840 153
MoussOudj 0:dbef204fd840 154 int PCA9685::convert_pwm_value(float pulse_width_us, float period_us)
MoussOudj 0:dbef204fd840 155 {
MoussOudj 0:dbef204fd840 156
MoussOudj 0:dbef204fd840 157 int result;
MoussOudj 0:dbef204fd840 158 float interim;
MoussOudj 0:dbef204fd840 159
MoussOudj 0:dbef204fd840 160 interim = ((pulse_width_us / period_us) * 4095); //scale the pulse width to a 12-bit scale
MoussOudj 0:dbef204fd840 161 result = (int) interim; //round the value to the nearest integer
MoussOudj 0:dbef204fd840 162
MoussOudj 0:dbef204fd840 163 return result;
MoussOudj 0:dbef204fd840 164
MoussOudj 0:dbef204fd840 165 }
MoussOudj 0:dbef204fd840 166
MoussOudj 0:dbef204fd840 167 #endif