30
30
#include " Adafruit_PWMServoDriver.h"
31
31
#include < Wire.h>
32
32
33
+ // #define ENABLE_DEBUG_OUTPUT
34
+
33
35
/* !
34
36
* @brief Instantiates a new PCA9685 PWM driver chip with the I2C address on a
35
37
* TwoWire interface
@@ -72,6 +74,8 @@ void Adafruit_PWMServoDriver::begin(uint8_t prescale) {
72
74
// set a default frequency
73
75
setPWMFreq (1000 );
74
76
}
77
+ // set the default internal frequency
78
+ setOscillatorFrequency (FREQUENCY_OSCILLATOR);
75
79
}
76
80
77
81
/* !
@@ -139,16 +143,9 @@ void Adafruit_PWMServoDriver::setPWMFreq(float freq) {
139
143
// Range output modulation frequency is dependant on oscillator
140
144
if (freq < 1 ) freq = 1 ;
141
145
if (freq > 3500 ) freq = 3500 ; // Datasheet limit is 3052=50MHz/(4*4096)
142
- /*
143
- freq *= 0.9; // Correct for overshoot in the frequency setting (see issue #11)
144
- float prescaleval = FREQUENCY_OSCILLATOR;
145
- */
146
- uint32_t prescaleval = FREQUENCY_CALIBRATED;
147
- prescaleval /= freq; // required output modulation frequency
148
- // rounding to nearest number is equal to adding 0,5 and floor to nearest number
149
- prescaleval += 2048 ;
150
- prescaleval /= 4096 ;
151
- prescaleval -= 1 ;
146
+
147
+
148
+ float prescaleval = ((_oscillator_freq / (freq * 4096.0 )) + 0.5 ) - 1 ;
152
149
if (prescaleval < PCA9685_PRESCALE_MIN) prescaleval = PCA9685_PRESCALE_MIN;
153
150
if (prescaleval > PCA9685_PRESCALE_MAX) prescaleval = PCA9685_PRESCALE_MAX;
154
151
uint8_t prescale = (uint8_t ) prescaleval;
@@ -306,7 +303,7 @@ void Adafruit_PWMServoDriver::writeMicroseconds(uint8_t num, uint16_t Microsecon
306
303
// Calculate the pulse for PWM based on Equation 1 from the datasheet section 7.3.5
307
304
prescale += 1 ;
308
305
pulselength *= prescale;
309
- pulselength /= FREQUENCY_CALIBRATED ;
306
+ pulselength /= _oscillator_freq ;
310
307
311
308
#ifdef ENABLE_DEBUG_OUTPUT
312
309
Serial.print (pulselength); Serial.println (" us per bit" );
@@ -321,6 +318,15 @@ void Adafruit_PWMServoDriver::writeMicroseconds(uint8_t num, uint16_t Microsecon
321
318
Adafruit_PWMServoDriver::setPWM (num, 0 , pulse);
322
319
}
323
320
321
+ uint32_t Adafruit_PWMServoDriver::getOscillatorFrequency (void ) {
322
+ return _oscillator_freq;
323
+ }
324
+
325
+ void Adafruit_PWMServoDriver::setOscillatorFrequency (uint32_t freq) {
326
+ _oscillator_freq = freq;
327
+ }
328
+
329
+ /* ****************** Low level I2C interface */
324
330
uint8_t Adafruit_PWMServoDriver::read8 (uint8_t addr) {
325
331
_i2c->beginTransmission (_i2caddr);
326
332
_i2c->write (addr);
0 commit comments