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)
还没有任何评论哟~
