⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.h

📁 单相电机变频驱动原码,采用DISPIC30芯片
💻 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 + -