b15f/firmware/pwm.cpp
2019-05-28 11:12:58 +02:00

19 lines
491 B
C++

#include "pwm.h"
void pwmSetFrequency(uint32_t freq)
{
TCCR0A = _BV(COM0B1) | _BV(WGM00) | _BV(WGM01);
DDRB |= _BV(PB4);
uint16_t p_ideal = ceil(float(F_CPU) / (freq * 0x100));
for(int8_t i = PWM_PRESCALER_COUNT - 1; i >= 0 && PWM_PRESCALERS[i] >= p_ideal; i--)
TCCR0B = _BV(WGM02) | i; // set prescaler
if(p_ideal)
OCR0A = (uint8_t) (float(F_CPU) / (freq * PWM_PRESCALERS[TCCR0B & 0x07]));
}
void pwmSetValue(uint8_t value)
{
OCR0B = value;
}