📄 pwm.h
字号:
/****************************************************************
*
* Microchip 16-bit Embedded Control Design Contest
*
* Entry # MT2268
*
* Spa Pump Controller
*
*****************************************************************
*
* PWM definitions
*
*****************************************************************/
#define PWM_PERIOD 50000 // period (nsec)
#define PWM_DEADTIME 3000 // deadtime (nsec)
#define PWM_MIN_WIDTH 100 // minimum pulse width (nsec)
#define PWM_BLANKING 1000 // PFC fault blanking (nsec)
#define PWM_MIN_LO_INV 2000 // Min low time for INV channels (nsec)
#define PWM_MAX_HI_PFC 75 // Max high time for PFC channel (% of period)
#define PWM_CH_run 1 // Motor run winding
#define PWM_CH_com 2 // Motor common
#define PWM_CH_aux 3 // Motor aux (start) winding
#define PWM_CH_pfc 4 // PFC switch
#define PWM_CH_inv PWM_CH_com // Alias for all inverter channels
/*****************************************************************************/
// Convert time from nsec to PWM clocks (FRC_CLK_FREQ * 64)
#define _PWM_CONVERT(nsec) \
((((nsec) * (FRC_CLK_FREQ)) + (500000UL / 64UL)) / (1000000UL / 64UL))
#define _PWM_PERIOD (_PWM_CONVERT(PWM_PERIOD) & 0xFFF8)
#define _PWM_MIN_WIDTH (_PWM_CONVERT(PWM_MIN_WIDTH))
#define _PWM_DEADTIME (_PWM_CONVERT(PWM_DEADTIME) & 0x3FFC)
#define _PWM_DEADTIME1 ((_PWM_DEADTIME) + 16 + (_PWM_MIN_WIDTH))
#define _PWM_BLANKING (_PWM_CONVERT(PWM_BLANKING) & 0x03F8)
#define _PWM_MIN_LO_INV (_PWM_CONVERT(PWM_MIN_LO_INV))
#define _PWM_MAX_HI_INV ((_PWM_PERIOD) - (_PWM_MIN_LO_INV))
#define _PWM_MAX_HI_PFC ((_PWM_PERIOD) * (PWM_MAX_HI_PFC) / 100)
#define _PWM_MIN_HW 0x0008 // Hardware duty cycle limits
#define _PWM_MAX_HW 0xFFEF
// Find min and max duty cycles for inverter and PFC
#if (_PWM_MIN_HW) > (_PWM_DEADTIME1)
#define _PWM_MIN_DUTY_INV (_PWM_MIN_HW)
#else
#define _PWM_MIN_DUTY_INV (_PWM_DEADTIME1)
#endif
#if (_PWM_MAX_HW) < (_PWM_MAX_HI_INV) && (_PWM_MAX_HW) < (_PWM_PERIOD) - (_PWM_DEADTIME1)
#define _PWM_MAX_DUTY_INV (_PWM_MAX_HW)
#else
#if (_PWM_MAX_HI_INV) < (_PWM_PERIOD) - (_PWM_DEADTIME1)
#define _PWM_MAX_DUTY_INV (_PWM_MAX_HI_INV)
#else
#define _PWM_MAX_DUTY_INV ((_PWM_PERIOD) - (_PWM_DEADTIME1))
#endif
#endif
#if (_PWM_MIN_HW) > (_PWM_MIN_WIDTH)
#define _PWM_MIN_DUTY_PFC (_PWM_MIN_HW)
#else
#define _PWM_MIN_DUTY_PFC (_PWM_MIN_WIDTH)
#endif
#if (_PWM_MAX_HW) < (_PWM_MAX_HI_PFC) && (_PWM_MAX_HW) < (_PWM_PERIOD)
#define _PWM_MAX_DUTY_PFC (_PWM_MAX_HW)
#else
#if (_PWM_MAX_HI_PFC) < (_PWM_PERIOD)
#define _PWM_MAX_DUTY_PFC (_PWM_MAX_HI_PFC)
#else
#define _PWM_MAX_DUTY_PFC (_PWM_PERIOD)
#endif
#endif
#define PWM_UPDATE_RATE ((FRC_CLK_FREQ * 1000UL * 64UL) / _PWM_PERIOD)
// The following macros write to the selected PWM register
#define SET_PWM_DUTY(ch, value) _PWM_REG (PDC, ch) = value
#define SET_PWM_PHASE(ch, value) _PWM_REG (PHASE, ch) = value
#define SET_PWM_TRIG(ch, value) _PWM_REG (TRIG, ch) = value
// The following macros let us use symbolic names for the PWM channels
// by appending the numeric channel number to the register name.
// We need two levels of macro nesting for the preprocessor to
// do the proper substitution, since it won't substitute parameters
// that are the direct arguments of a '##' operation.
#define PWM_REG(reg, ch) _PWM_REG(reg, ch)
#define _PWM_REG(reg, ch) reg ## ch
#define PWM_REG_BITS(reg, bits, ch) _PWM_REG_BITS(reg, bits, ch)
#define _PWM_REG_BITS(reg, bits, ch) reg ## ch ## bits
enum {
PWM_MODE_off = 0, // Disable PWM output
PWM_MODE_run = 1, // Enable PWM mode
PWM_MODE_low = 2, // Set output low
PWM_MODE_high = 3 // Set output high
};
void PWM_init (void);
void PWM_mode (BYTE channel, BYTE mode);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -