/*
TIM1_CCMR
BIT 6-4:
110:PWM模式1- 在向上计数时,一旦TIM1_CNT
,否则为无效电平;在向下计数时,一旦TIM1_CNT>TIM1_CCR1时通道1为无效电平(OC1REF=0)
,否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIM1_CNT
,否则为有效电平;在向下计数时,一旦TIM1_CNT>TIM1_CCR1时通道1为有效电平
,否则为无效电平。
*/
//PWM模式选择
#define TIM1_MODE_PWM1 0X6C//PWM1模式
#define TIM1_MODE_PWM2 0X7C//PWM2模式
#define TIM1_MODE_OFF 0x08 //冻结模式
//预分频选择
#define TIM1_DIV1 (uint16)0//不分频
#define TIM1_DIV2 (uint16)1//2分频
#define TIM1_DIV4 (uint16)3//4分频
#define TIM1_DIV8 (uint16)7//8分频
#define TIM1_DIV16 (uint16)15//16分频
#define TIM1_DIV32 (uint16)31//32分频
//TIM1 PWM 输出指向的使能位
_Bool PWMPC1OUT_PINENBLE @TIM1_CCER1:0 ;//TIM1_CH1 -- PC1
_Bool PWMPC2OUT_PINENBLE @TIM1_CCER1:4 ;//TIM1_CH2 -- PC2
_Bool PWMPC3OUT_PINENBLE @TIM1_CCER2:0 ;//TIM1_CH3 -- PC3
_Bool PWMPC4OUT_PINENBLE @TIM1_CCER2:4 ;//TIM1_CH4 -- PC4
#define PWMPC1OUT_EN PWMPC1OUT_PINENBLE=1//PC1输出PWM
#define PWMPC1OUT_DIS PWMPC1OUT_PINENBLE=0//PC1不输出PWM
#define PWMPC2OUT_EN PWMPC2OUT_PINENBLE=1
#define PWMPC2OUT_DIS PWMPC2OUT_PINENBLE=0
#define PWMPC3OUT_EN PWMPC3OUT_PINENBLE=1
#define PWMPC3OUT_DIS PWMPC3OUT_PINENBLE=0
#define PWMPC4OUT_EN PWMPC4OUT_PINENBLE=1
#define PWMPC4OUT_DIS PWMPC4OUT_PINENBLE=0
// PWM 频率设定
//#define MDIV2
//16M 2分频的设置
#if defined(MDIV2)
#define TIM1_DIV_SET TIM1_DIV2
#define PWMFRE_8KHZ 1000
#define PWMFRE_4KHZ 2000
#define PWMFRE_2KHZ 4000
#define PWMFRE_1KHZ 8000
#define PWMFRE_05KHZ 16000
#define PWMFRE_38KHZ 210//用于红外38KHZ载波
#define PWMFRE_OPEN 70//1/3的PWM占空比
#else
//16M 不分频的设置
#define TIM1_DIV_SET TIM1_DIV1
#define PWMFRE_8KHZ 2000
#define PWMFRE_4KHZ 4000
#define PWMFRE_2KHZ 8000
#define PWMFRE_1KHZ 16000
#define PWMFRE_05KHZ 32000
#define PWMFRE_38KHZ 421//用于红外38KHZ载波
#define PWMFRE_OPEN 140//1/3的PWM占空比
#endif
//*************************************
// 函数名称:Init_Timer1_PWM
// 函数功能:定时器1作PWM输出时初始化
// 入口参数: 设置频率 分频系数
// 出口参数:无
//***************************************
void Init_Timer1_PWM(uint16 Tcon,uint16 Pscr)
{
//16M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRH = (Pscr >> 8) & 0xff ;
TIM1_PSCRL = Pscr & 0xff ;
//设定重装载时的寄存器值,255是最大值
TIM1_ARRH = (Tcon >> 8) & 0xff ;
TIM1_ARRL = Tcon & 0xff ;//输出频率为:16M/ ARR
//设置刹车寄存器
TIM1_BKR|=0X80 ;
//PWM1模式,TIM1_CNT
TIM1_CCMR1 =TIM1_MODE_PWM1 ;
//冻结模式,TIM1_CNT
TIM1_CCMR2 =TIM1_MODE_OFF ;
//冻结模式,TIM1_CNT
TIM1_CCMR3 =TIM1_MODE_OFF ;
//冻结模式,TIM1_CNT
TIM1_CCMR4 =TIM1_MODE_OFF ;
//PWM 占空比 清0
TIM1_CCR1H = 0;
TIM1_CCR1L = 0;
TIM1_CCR2H = 0;
TIM1_CCR2L = 0;
TIM1_CCR3H = 0;
TIM1_CCR3L = 0;
TIM1_EGR = 0X01 ;
//UG = 1 ;初始化计数器 预装载载入影子寄存器中
TIM1_CNTRH = 0 ; //计数器清0
TIM1_CNTRL = 0 ;
TIM1_CR1 |= 0X01; // 计数器使能,开始计数
}
//*************************************
// 函数名称:PWM_CCR1_SET
// 函数功能:设置PWM占空比
// 入口参数:占空比值
// 出口参数:无
//***************************************
void PWM_CCR1_SET(uint16 OPEN_PWM)
{
TIM1_CCR1H= (uint8)((OPEN_PWM >> 8 ) & 0xFF);
TIM1_CCR1L = (uint8)(OPEN_PWM & 0xFF);
}
//*************************************
// 函数名称:PWM_CCR2_SET
// 函数功能:设置PWM占空比
// 入口参数:占空比值
// 出口参数:无
//***************************************
void PWM_CCR2_SET(uint16 OPEN_PWM)
{
TIM1_CCR2H= (uint8)((OPEN_PWM >> 8 ) & 0xFF);
TIM1_CCR2L = (uint8)(OPEN_PWM & 0xFF);
}
//*************************************
// 函数名称:PWM_CCR3_SET
// 函数功能:设置PWM占空比
// 入口参数:占空比值
// 出口参数:无
//***************************************
void PWM_CCR3_SET(uint16 OPEN_PWM)
{
TIM1_CCR3H= (uint8)((OPEN_PWM >> 8 ) & 0xFF);
TIM1_CCR3L = (uint8)(OPEN_PWM & 0xFF);
}
//*************************************
// 函数名称:PWM_CCR3_SET
// 函数功能:设置PWM占空比
// 入口参数:占空比值
// 出口参数:无
//***************************************
void PWM_CCR4_SET(uint16 OPEN_PWM)
{
TIM1_CCR4H= (uint8)((OPEN_PWM >> 8 ) & 0xFF);
TIM1_CCR4L = (uint8)(OPEN_PWM & 0xFF);
}
//应用:
Init_Timer1_PWM(PWMFRE_38KHZ,TIM1_DIV_SET) ;//16M 设置38K PWM输出
PWM_CCR1_SET(PWMFRE_OPEN);
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』