X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fpwm.h;h=4ed32f85183d576126b2b715996d073999690bb9;hb=976d522209efc4c11a019ae6b34657b6b3f59ba0;hp=db9b3a2cae7c2e6137e8a6f05056e33db8d1561c;hpb=6286e79f3da8091ec8da66469488a11035cada11;p=bertos.git diff --git a/bertos/drv/pwm.h b/bertos/drv/pwm.h index db9b3a2c..4ed32f85 100644 --- a/bertos/drv/pwm.h +++ b/bertos/drv/pwm.h @@ -28,56 +28,151 @@ * * Copyright 2005 Develer S.r.l. (http://www.develer.com/) * --> + * \defgroup pwm_driver PWM driver + * \ingroup drivers + * \{ + * \brief Pulse Width Modulation (PWM) driver. * - * \version $Id$ - * - * \brief PWM driver (interface) - * - * \version $Id$ * \author Francesco Sacchi * \author Daniele Basile + * + * $WIZ$ module_name = "pwm" + * $WIZ$ module_configuration = "bertos/cfg/cfg_pwm.h" + * $WIZ$ module_hw = "bertos/hw/pwm_map.h" + * $WIZ$ module_supports = "not avr and not cm3" */ #ifndef DRV_PWM_H #define DRV_PWM_H -#include "hw/pwm_map.h" -#include CPU_HEADER(pwm) +#include #include +#include "cfg/cfg_pwm.h" +/** + * Maximum PWM duty cycle value (100%) + */ #define PWM_MAX_DUTY ((pwm_duty_t)0xFFFF) -#define PWM_MAX_PERIOD 0xFFFF -#define PWM_MAX_PERIOD_LOG2 16 +#define PWM_MAX_PERIOD 0xFFFF +#define PWM_MAX_PERIOD_LOG2 16 /** - * PWM type define. + * Type for PWM duty cycle. + * The value is represented as a 16bit unsigned integer, so it ranges from 0 (0%) + * to PWM_MAX_DUTY (0xFFFF = 100%). */ typedef uint16_t pwm_duty_t; + +/** + * Type for PWM frequency. + * Unit of measure is Hz. + */ typedef uint32_t pwm_freq_t; +#if !CFG_PWM_ENABLE_OLD_API || defined(__doxygen__) + /** + * \defgroup pwm_api PWM API + * With this driver you can control a device with multiple PWM channels. + * You can enable/disable each channel indipendently and also set frequency + * and duty cycle. + * + * API usage example: + * \code + * Pwm pwm; // declare a context structure + * pwm_init(&pwm, 0); // init pwm channel 0 + * pwm_setFrequency(&pwm, 1000); // Set frequency of channel 0 to 1000Hz + * pwm_setDuty(&pwm, 0x7FFF); // Set duty to 50% (0xFFFF/2) + * pwm_enable(&pwm, true); // Activate the output + * \endcode + * \{ + */ + /** + * Enum describing PWM polarities. + */ + typedef enum PwmPolarity + { + /** High pulse: increasing duty increases the part of the signal at high level. */ + PWM_POL_HIGH_PULSE, + /** Positive pulse: same as High pulse. */ + PWM_POL_POSITIVE = PWM_POL_HIGH_PULSE, + /** Low pulse: increasing duty increases the part of the signal at low level. */ + PWM_POL_LOW_PULSE, + /** Negative pulse: same as Low pulse. */ + PWM_POL_NEGATIVE = PWM_POL_LOW_PULSE, + } PwmPolarity; -/** - * Set PWM polarity of pwm \p dev. - */ -INLINE void pwm_setPolarity(PwmDev dev, bool pol) -{ - pwm_hw_setPolarity(dev, pol); -} + struct PwmHardware; //Fwd declaration -void pwm_setDuty(PwmDev dev, pwm_duty_t duty); -void pwm_setFrequency(PwmDev dev, pwm_freq_t freq); -void pwm_enable(PwmDev dev, bool state); -void pwm_init(void); + /** + * PWM context structure. + */ + typedef struct Pwm + { + unsigned ch; + pwm_duty_t duty; + PwmPolarity pol; + bool enabled; + struct PwmHardware *hw; + } Pwm; -/** + void pwm_setDuty(Pwm *ctx, pwm_duty_t duty); + void pwm_setFrequency(Pwm *ctx, pwm_freq_t freq); + void pwm_setPolarity(Pwm *ctx, PwmPolarity pol); + void pwm_enable(Pwm *ctx, bool state); + void pwm_init(Pwm *ctx, unsigned channel); + /** \} */ //defgroup pwm_api +#endif + + +#if CFG_PWM_ENABLE_OLD_API + /** + * \defgroup pwm_old_api Old PWM API + * This API has strong limititations, so it has been deprecated. + * It is active by default for backward compatibility reasons, but + * for new projects please use the new PWM API. + * In order to disable this API, check CFG_PWM_ENABLE_OLD_API. + * \see pwm_api + * \see CFG_PWM_ENABLE_OLD_API + * \{ + */ + + #include CPU_HEADER(pwm) + #include "hw/pwm_map.h" + + /** + * Set PWM polarity of pwm \p dev. + * \param dev PWM channel. + * \param pol if false positive polarity pulses are generated, + * if true negative polarity pulses are generated. + * \warning This function has to be called with PWM disabled, otherwise + * the output value will be undefined. + */ + INLINE void pwm_setPolarity(PwmDev dev, bool pol) + { + pwm_hw_setPolarity(dev, pol); + } + + void pwm_setDuty(PwmDev dev, pwm_duty_t duty); + void pwm_setFrequency(PwmDev dev, pwm_freq_t freq); + void pwm_enable(PwmDev dev, bool state); + void pwm_init(void); + /** \} */ //defgroup pwm_old_api +#endif + +/* * Test function prototypes. * * See pwm_test.c for implemntation of these functions. */ -int pwm_testRun(void); +void pwm_testRun(void); int pwm_testSetup(void); +/* For backward compatibility */ +#define pwm_testSetUp() pwm_testSetup() int pwm_testTearDown(void); + +/** \} */ //defgroup pwm_driver + #endif /* DRV_PWM_H */