You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
957 B

/** @file spwm.c
@author M. P. Hayes, UCECE
@date 25 Sep 2013
@brief These routines are for software pulse width modulation. They are
useful for modulating the luiminance of an LED or beeping a piezo
tweeter.
*/
#include "system.h"
#include "spwm.h"
/** Set the period. This must be greater than the duty. */
void
spwm_period_set (spwm_t *spwm, spwm_period_t period)
{
spwm->period = period;
}
/** Set the duty. This must be less than the period. */
void
spwm_duty_set (spwm_t *spwm, spwm_period_t duty)
{
spwm->duty = duty;
}
/** Return whether spwm output should be high or low.
For example, to control the flashing of a LED use:
led_set (led, spwm_update (spwm)); */
bool
spwm_update (spwm_t *spwm)
{
spwm->count++;
if (spwm->count >= spwm->period)
spwm->count = 0;
return spwm->count < spwm->duty;
}
/* Reset spwm. */
void
spwm_reset (spwm_t *spwm)
{
spwm->count = 0;
}