Advertisement

STM32F407ZGTx 输出三相PWM信号

阅读量:

三相PWM信号

三相方波在电机驱动领域得到了广泛应用,在如图所示的电路中 Ha、Hb 和 Hc 分别代表了三个独立的方波信号序列,在每次控制周期内仅实现对三相对称电动机的两个子电路供电

在这里插入图片描述

STM32F407生成三相PWM信号

便于辨识地将最终所需的三相PWM波形分别命名为Ha、Hb和Hc,并以此对应上图中的三条方波曲线。
其中:

  • TIM1_CH1输出第1个PWM波形命名为Ha;
  • TIM1_CH2输出第二个PWM波形作为触发源用于生成Hb;
  • TIM3_CH1输出第三个PWM波形作为Hb的触发辅助波;
  • TIM3_CH2输出第四个PWM波形命名为Hc;
  • TIM4_CH1输出第五个PWM波形命名为Hc(此波形受 TIM3_CH2 输出信号控制)。
复制代码
    TIM1_PWM_Init(3000-1,56-1);	//168M/56 = 3M   频率   3M /3000 = 1K Hz
    TIM3_PWM_Init(3000-1,28-1); //84M/28  = 3M 
    TIM3_IN_Config(); 
    TIM_SetCompare1(TIM1,1500);	//
    TIM_SetCompare1(TIM3,1500);	//
    TIM4_PWM_Init(3000-1,28-1);
    TIM_SetCompare1(TIM4,1500);
    TIM4_IN_Config();	

TIM1配置代码

复制代码
      //TIM1-CH1  PA8
      //TIM1-OC2  
    void TIM1_PWM_Init(u32 arr,u32 psc)
    {		 					 
    	/*结构体声明*/
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRStructure;
    /*时钟使能*/
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  	
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	
    	
    /*IO复用*/
    	GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); 
    	
    	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;           //PA.8 TIM1_CH1
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       
    	GPIO_Init(GPIOA,&GPIO_InitStructure);              
    	 
    	TIM_TimeBaseStructure.TIM_Prescaler=psc;  
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
    	TIM_TimeBaseStructure.TIM_Period=arr;   
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
    
      	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; 
      	TIM_OCInitStructure.TIM_Pulse=0; 	
      	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  
      	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; 
      	TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; 
     
    // TIM1_CH1 PWM输出
    TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;	
    TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; 
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);  
    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);   
      
    //TIM1_CH2 触发信号
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active; 
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;  
    	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
    	TIM_OCInitStructure.TIM_Pulse = 2000;                
    	TIM_OC2Init(TIM1,&TIM_OCInitStructure);
    	TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC2Ref);  
    TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);   
    TIM_ARRPreloadConfig(TIM1,ENABLE);
    	
    	TIM_Cmd(TIM1, ENABLE);  
    TIM_CtrlPWMOutputs(TIM1, ENABLE); 									  
    }  

TIM3配置代码

复制代码
    TIM3_CH1  PB.4
    TIM3_Ch2  PB.5  
    void TIM3_PWM_Init(u32 arr,u32 psc)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRStructure;
      
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  	
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 	
    	
    	GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_TIM3); 
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;           
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        
    	GPIO_Init(GPIOB,&GPIO_InitStructure);              
    	 
    	TIM_TimeBaseStructure.TIM_Prescaler=psc;  
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
    	TIM_TimeBaseStructure.TIM_Period=arr;   
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
    
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; 
    TIM_OCInitStructure.TIM_Pulse=0; 	
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; 
    
       // TIM3_CH1 PWM输出
    TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable; 
    TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;	
    TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; 
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);  // OC1
    TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);   
      
    	//TIM3_CH2 触发信号
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active; 
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;  
    	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
    	TIM_OCInitStructure.TIM_Pulse = 2000;
    	TIM_OC2Init(TIM3,&TIM_OCInitStructure);
    	TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC2Ref);  
    TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);  
    		   
    TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);  //TIM1 OC2??????
    TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); 
     
    TIM_ARRPreloadConfig(TIM3,ENABLE);
    	TIM_Cmd(TIM3, ENABLE);  
    TIM_CtrlPWMOutputs(TIM3, ENABLE); 		
    }
    
    void TIM3_IN_Config(void)
    {
    	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
    	TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);     
    }
复制代码
    void TIM4_PWM_Init(u32 arr,u32 psc)
    {
    	//½á¹¹ÌåÉùÃ÷
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
      TIM_BDTRInitTypeDef TIM_BDTRStructure;
      
    	//ʱÖÓʹÄÜTIM4_Ch1  PD.12  TIM4_CH1 
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  	//
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); 	//
    	
      //IO¸´ÓÃ
    	GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4); //
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;           //GPIOD.12
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //????
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//??100MHz
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //??????
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //??
    	GPIO_Init(GPIOD,&GPIO_InitStructure);              //
    	 
    	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //84M/168 = 0.5M ¼ÆÊýƵÂÊ
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //??????
    	TIM_TimeBaseStructure.TIM_Period=arr;   // 0.5M /25000 = 20 Hz
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//??????1
    
       //
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; 
    TIM_OCInitStructure.TIM_Pulse=0; 	
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  //?????
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //????
    TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; // ???????
     
       // TIM4_CH1 PWMÊä³ö
    TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable; //??????
    TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;	// ????????
    TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; //?????????
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  // OC1
    TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);   //??
      	    
    //    TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_OC2Ref);  //TIM1 OC2??????
    //    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable); 
     
    TIM_ARRPreloadConfig(TIM4,ENABLE);//ARPE?? 
    	  TIM_Cmd(TIM4, ENABLE);  
    TIM_CtrlPWMOutputs(TIM4, ENABLE); //??OC?OCN??		
    }
     void TIM4_IN_Config(void)
    {
    	  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
    		TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);      //ITRO??
    }

全部评论 (0)

还没有任何评论哟~