diff --git a/dw640HAT/Adafruit_PWM_Servo_Driver.py b/dw640HAT/Adafruit_PWM_Servo_Driver.py index 35c993c..c38a56a 100644 --- a/dw640HAT/Adafruit_PWM_Servo_Driver.py +++ b/dw640HAT/Adafruit_PWM_Servo_Driver.py @@ -50,13 +50,13 @@ class PWM : self.i2c.write8(self.__MODE2, self.__OUTDRV) self.i2c.write8(self.__MODE1, self.__ALLCALL) time.sleep(0.005) # wait for oscillator - + mode1 = self.i2c.readU8(self.__MODE1) mode1 = mode1 & ~self.__SLEEP # wake up (reset sleep) self.i2c.write8(self.__MODE1, mode1) time.sleep(0.005) # wait for oscillator - def setPWMFreq(self, freq): + def setPWMFreq(self, freq, correctionFactor=1.0): "Sets the PWM frequency" prescaleval = 25000000.0 # 25MHz prescaleval /= 4096.0 # 12-bit @@ -65,7 +65,7 @@ class PWM : if (self.debug): print "Setting PWM frequency to %d Hz" % freq print "Estimated pre-scale: %d" % prescaleval - prescale = math.floor(prescaleval + 0.5) + prescale = math.floor(prescaleval * correctionFactor + 0.5) if (self.debug): print "Final pre-scale: %d" % prescale @@ -77,6 +77,19 @@ class PWM : time.sleep(0.005) self.i2c.write8(self.__MODE1, oldmode | 0x80) + def getPWMFreq(self): + if (self.debug): + print "Getting PWM frequency Hz" + + prescale = self.i2c.readU8(self.__PRESCALE) + + if (self.debug): + print "Got pre-scale: %d" % prescale + print 25000000.0 / 4096.0 / ( float(prescale) + 1 ) + + return 25000000.0 / 4096.0 / ( float(prescale) + 1 ) + #24576000.f / 4096.f / (data + 1) + def setPWM(self, channel, on, off): "Sets a single PWM channel" self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF)