STM32F103 TIM1输出PWM设置

2014-11-23 20:16:36 · 作者: · 浏览: 6
//TIM1 分频
#define	TIM1_DIV1	  (1-1)
#define	TIM1_DIV2	  (2-1)
#define	TIM1_DIV4	  (4-1)
#define	TIM1_DIV8	  (8-1)
#define	TIM1_DIV9	  (9-1)
#define	TIM1_DIV18	  (18-1)
#define	TIM1_DIV72	  (72-1)


#define		TIM1PinA_Enb  	 	TIM1->CCER |= 0X0001 //比较通道1输出到IO
#define		TIM1PinB_Enb 	 	TIM1->CCER |= 0X0010 //比较通道2输出到IO
#define		TIM1PinC_Enb  		TIM1->CCER |= 0X0100 //比较通道3输出到IO
#define		TIM1PinA_Dis   		TIM1->CCER &= ~0X0001 //比较通道1禁止输出到IO
#define		TIM1PinB_Dis  		TIM1->CCER &= ~0X0010 //比较通道2禁止输出到IO
#define		TIM1PinC_Dis  		TIM1->CCER &= ~0X0100 //比较通道3禁止输出到IO


#define		VT_PWM				1000 //PWM 计数最大值 频率8K
//#define		VT_PWM				500 //PWM 计数最大值 频率16K

//*************************************
// 函数名称:TIM1_PWMMode_Init
// 函数功能:TIM1 作PWM模式初始化	用作比较输出用
// 入口参数:计数个数 分频数
// 出口参数:无
// 返回值  :无
// 此设置适合用作BLDC驱动控制中驱动三对MOS
//***************************************
void TIM1_PWMMode_Init(int16_t Tcon,uint16_t psc)
{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    TIM_DeInit(TIM1);            //复位定时器

	TIM1->ARR = Tcon ;	 //定时器重装载值
 	TIM1->PSC = psc ;	//时钟预分频系数
 	TIM1->CR1 &= ~(1<<4) ; //向上计数

   	TIM1->CR1 |= (1<<7);  //使能自动重装载
			 
//清除更新中断  比较1234中断标志
	TIM1->SR &= ~0X001F ; 

 //	通道1 2 3 配置为PWM1模式
	TIM1->CCMR1 = 0X6868 ; //
	TIM1->CCMR2 = 0X0068 ;
// 不使能比较通道1 2 3输出到IO 且1电平为有效电平
	TIM1->CCER  = 0X0000 ;
//
	TIM1->CCR1 = 0 ;
	TIM1->CCR2 = 0 ;
	TIM1->CCR3 = 0 ;
	TIM1->CCR4 = 0 ;
	//	关更新中断 比较1-4中断
 	TIM1->DIER &= ~0X001F ;	
//	TIM1->DIER |= 0X0002 ;	 //开比较1 中断

    TIM1->BDTR |= (1<<15) ;	//主输出使能   !!!
//清除更新事件标记位 并初始化所有寄存器
	TIM1->
EGR &= ~0X0001 ; TIM1->CR1 |= 0X0001 ; //开启时钟 } //************************************* // 函数名称:ToPWM_Value // 函数功能:设置PWM占空比 // 入口参数:计数个数 分频数 // 出口参数:无 // 返回值 :无 //***************************************/ void ToPWM_Value(uint16_t InValue) { TIM1->CCR1 = InValue ; TIM1->CCR2 = InValue ; TIM1->CCR3 = InValue ; } //************************************* // 函数名称:BLDC_RUN_ONESTEP // 函数功能:电机六步走向 // 入口参数:电机运行的当前步 // 出口参数:无 //***************************************/ void BLDC_RUN_ONESTEP(uint32_t STEP) { switch(STEP) { case 1 : // AB TIM1PinB_Dis ; TIM1PinC_Dis ; TIM1PinA_Enb ; UdePinA_Off ; UdePinC_Off ; UdePinB_On ; break ; case 2 : //AC TIM1PinB_Dis ; TIM1PinC_Dis ; TIM1PinA_Enb ; UdePinA_Off ; UdePinB_Off ; UdePinC_On ; break ; case 3 : //BC TIM1PinA_Dis ; TIM1PinC_Dis ; TIM1PinB_Enb ; UdePinA_Off ; UdePinB_Off ; UdePinC_On ; break ; case 4 ://BA TIM1PinA_Dis ; TIM1PinC_Dis ; TIM1PinB_Enb ; UdePinB_Off ; UdePinC_Off ; UdePinA_On ; break ; case 5 ://CA TIM1PinA_Dis ; TIM1PinB_Dis ; TIM1PinC_Enb ; UdePinB_Off ; UdePinC_Off ; UdePinA_On ; break ; case 6 : //CB TIM1PinA_Dis ; TIM1PinB_Dis ; TIM1PinC_Enb ; UdePinA_Off ; UdePinC_Off ; UdePinB_On ; break ; default : break ; } } //----实例应用------ //72M/(9) = 8M pwm周期=(1/8)*1000=125U TIM1_PWMMode_Init(VT_PWM,TIM1_DIV9) ; //PWM 频率设置初始化 频率F=8K // ToPWM_Value(500) ; //设置三相驱动的PWM占空比 500/1000 = 50% // TIM1PinA_Enb ; //PWM输出到IO 此时可在IO上看到有PWM信号输出