bool Babuino::writeAnalog(uint8_t i, uint8_t value) { if (!digitalPinHasPWM(i)) // defined in pins_arduino.hexpected primary-expression before ‘>’ token return false; analogWrite(i, value); return true; }
void analogWrite(uint8_t pin, uint32_t val) { if (! digitalPinHasPWM(pin)) { if(val > 127) { digitalWrite(pin, HIGH); } else { digitalWrite(pin, LOW); } return; } if (val <= 0) { /* Use GPIO for 0% duty cycle (always off) */ pinMode(pin, OUTPUT); digitalWrite(pin, LOW); } else if (val >= ((1 << _writeResolution) - 1)) { /* Use GPIO for 100% duty cycle (always on) */ pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); } else { /* PWM for everything in between */ PinDescription *p = &g_APinDescription[pin]; uint32_t offset; uint32_t hcnt = (val/(float)maxResolutionValue) * pwmPeriod[p->ulPwmChan]; uint32_t lcnt = pwmPeriod[p->ulPwmChan] - hcnt; /* Set the high count period (duty cycle) */ offset = ((p->ulPwmChan * QRK_PWM_N_LCNT2_LEN) + QRK_PWM_N_LOAD_COUNT2); MMIO_REG_VAL(QRK_PWM_BASE_ADDR + offset) = hcnt; /* Set the low count period (duty cycle) */ offset = ((p->ulPwmChan * QRK_PWM_N_REGS_LEN) + QRK_PWM_N_LOAD_COUNT1); MMIO_REG_VAL(QRK_PWM_BASE_ADDR + offset) = lcnt; /* start the PWM output */ offset = ((p->ulPwmChan * QRK_PWM_N_REGS_LEN) + QRK_PWM_N_CONTROL); SET_MMIO_MASK(QRK_PWM_BASE_ADDR + offset, QRK_PWM_CONTROL_ENABLE); if(pinmuxMode[pin] != PWM_MUX_MODE) { /* Disable pull-up and set pin mux for PWM output */ SET_PIN_PULLUP(p->ulSocPin, 0); SET_PIN_MODE(p->ulSocPin, PWM_MUX_MODE); pinmuxMode[pin] = PWM_MUX_MODE; } } }
/** * \brief Checks whether the DigitalOutput supports PWM or not. * * \returns 0 if not, 1 otherwise. */ int8_t DigitalOutput::supportsPWM() { return digitalPinHasPWM(m_Pin); }