void delta_sigma_start(uint32_t period, uint32_t range, uint8_t pins[], uint8_t n_pins) { // Stop the timer during configuration timer_set_run(FRC1, false); g_n_pins = n_pins; for (uint8_t i = 0; i < n_pins; ++i) { g_pins[i].gpio_mask = BIT(pins[i]); g_pins[i].duty = 0; g_pins[i].acc = 0; gpio_enable(pins[i], GPIO_OUTPUT); } g_range = range; timer_set_interrupts(FRC1, false); timer_set_divider(FRC1, TIMER_CLKDIV_256); if (period > TIMER_FRC1_MAX_LOAD) { printf("delta_sigma: period %u too large\n", period); period = TIMER_FRC1_MAX_LOAD; } timer_set_load(FRC1, period); timer_set_reload(FRC1, true); _xt_isr_attach(INUM_TIMER_FRC1, timer_isr, NULL); timer_set_interrupts(FRC1, true); timer_set_run(FRC1, true); }
void pwm_start() { pwmInfo._onLoad = pwmInfo.dutyCicle * pwmInfo._maxLoad / UINT16_MAX; pwmInfo._offLoad = pwmInfo._maxLoad - pwmInfo._onLoad; pwmInfo._step = PERIOD_ON; // Trigger ON uint8_t i = 0; for (; i < pwmInfo.usedPins; ++i) { gpio_write(pwmInfo.pins[i].pin, true); } timer_set_load(FRC1, pwmInfo._onLoad); timer_set_reload(FRC1, false); timer_set_interrupts(FRC1, true); timer_set_run(FRC1, true); pwmInfo.running = 1; }
static void frc1_interrupt_handler(void) { uint8_t i = 0; bool out = true; uint32_t load = pwmInfo._onLoad; pwm_step_t step = PERIOD_ON; if (pwmInfo._step == PERIOD_ON) { out = false; load = pwmInfo._offLoad; step = PERIOD_OFF; } for (; i < pwmInfo.usedPins; ++i) { gpio_write(pwmInfo.pins[i].pin, out); } timer_set_load(FRC1, load); pwmInfo._step = step; }