|
|
|
@ -7,7 +7,7 @@ Pca9685::Pca9685(i2c_ch1_pImpL* i2c, ErrorHandler* err)
|
|
|
|
|
errorHandling = err;
|
|
|
|
|
m_isExternalClock = 0;
|
|
|
|
|
m_oscillatorFreq = PCA9685_FREQUENCY_OSCILLATOR;
|
|
|
|
|
setPwmFreq(48);
|
|
|
|
|
setPwmFreq(1526);
|
|
|
|
|
m_currentLED = PCA9685_LED_PWM_REG_START;
|
|
|
|
|
|
|
|
|
|
errorHandling->addNewError(-1,__FILE__,"Selected duty cycle is too big",KILL);
|
|
|
|
@ -31,7 +31,7 @@ Pca9685::Pca9685(i2c_ch1_pImpL* i2c, ErrorHandler* err)
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void Pca9685::setPwmFreq(uint16_t frequency)
|
|
|
|
|
void Pca9685::setPwmFreq(float frequency)
|
|
|
|
|
{
|
|
|
|
|
if(frequency > 1526)
|
|
|
|
|
{
|
|
|
|
@ -49,17 +49,21 @@ void Pca9685::setPwmFreq(uint16_t frequency)
|
|
|
|
|
errorHandling->handleError(-4,__FILE__);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_currentPrescale = (m_oscillatorFreq / ( 4096 * frequency) ) -1;
|
|
|
|
|
std::cout << "Prescaler is set to: " << unsigned(m_currentPrescale) << std::endl;
|
|
|
|
|
m_currentPrescale = round((m_oscillatorFreq / ( 4096 * frequency)) - 1);
|
|
|
|
|
std::cout << unsigned(m_currentPrescale) << std::endl;
|
|
|
|
|
sleep();
|
|
|
|
|
i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, PCA9685_REG_PRESCALE, m_currentPrescale);
|
|
|
|
|
wakeup();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Pca9685::setPwmMicroSeconds(uint16_t microSeconds)
|
|
|
|
|
float Pca9685::getPwmFreq()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
m_currentPrescale = i2c_pca9685->readByte(PCA9685_I2C_ADDRESS,PCA9685_REG_PRESCALE);
|
|
|
|
|
m_currentPwmFreq = (m_oscillatorFreq / (4096 * ((float)m_currentPrescale + 1)));
|
|
|
|
|
std::cout << m_currentPwmFreq << std::endl;
|
|
|
|
|
return m_currentPwmFreq;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Pca9685::setDutyPercent(uint8_t ledNo, uint8_t on, uint8_t off)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
@ -102,10 +106,6 @@ void Pca9685::setDutyRaw(uint8_t ledNo, uint16_t on, uint16_t off)
|
|
|
|
|
i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, m_currentLED + PCA9685_PWM_OFF_H_OFFSET, off >> 8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Pca9685::setDutyMicroSecond(uint8_t ledNo, uint16_t on, uint16_t off)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Pca9685::setOnOff(uint8_t ledNo, bool onOff, bool invert)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
@ -161,3 +161,4 @@ void Pca9685::wakeup()
|
|
|
|
|
i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, PCA9685_REG_MODE1, m_curMode);
|
|
|
|
|
usleep(PCA9685_OSC_STAB_TIME_US); // refer to datasheet page 14
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|