简介:本文介绍STM32系列如何使用timer1的第TIM1_CH1N/TIM1_CH1通道(PE8/PE9)产生PWM。
1、PWM是什么
1、概念
脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
2、占空比详解
pwm占空比就是一个脉冲周期内高电平的所整个周期占的比例。1秒高电平1秒低电平的PWM波占空比是50%。
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
举例:
图中使用9V电池来给一个白炽灯泡供电。如果将连接电池和灯泡的开关闭合50ms,灯泡在这段时间中将得到9V供电。如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。如果在1秒钟内将此过程重复10次,灯泡将会点亮并像连接到了一个4.5V电池(9V的50%)上一样。这种情况下,占空比为50%,调制频率为10Hz。(补充:频率=次数/时间,10hz=10/1)
3、特点
PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换,让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也能对数字信号产生影响。
对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。
总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。
2、互补输出
1、什么是互补通道
TIM1_CH2N通道就是TIM1_CH2的互补通道,它们的波形完全反向。
2、具体波形观察:
3、软件代码实现,引脚只用到两个,代码为六步驱动程序中复制,因此引脚数量较多
一些宏定义
#define PWM_DUTY_CYCLE 1000
#define PWM_STEP 1
#define PWM1_PORT GPIOB
#define PWM1_PIN GPIO_Pin_14
#define MOTOR_PORT GPIOE
#define LIN1_PIN GPIO_Pin_8
#define HIN1_PIN GPIO_Pin_9
#define LIN2_PIN GPIO_Pin_10
#define HIN2_PIN GPIO_Pin_11
#define LIN3_PIN GPIO_Pin_12
#define HIN3_PIN GPIO_Pin_13
具体配置
void Three_phaseMotor_PWM_Init(u8 Prescaler)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
TIM_DeInit(TIM1);
TIM_InternalClockConfig(TIM1);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);
GPIO_InitStructure.GPIO_Pin = LIN1_PIN|HIN1_PIN|LIN2_PIN|HIN2_PIN|LIN3_PIN|HIN3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MOTOR_PORT,&GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period = PWM_DUTY_CYCLE-1;//根据需求设置即可
TIM_TimeBaseInitStructure.TIM_Prescaler = Prescaler-1;//根据需求配置
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1模式
TIM_OCInitStructure.TIM_Pulse = 0;//占空比设置 根据需求设置即可
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//互补输出极性
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;//死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;//死区后互补输出状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
//后面的基本属于多余 使用六步驱动时可参考
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_OC3Init(TIM1,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);
//死区和刹车功能配置,使用了高级定时器
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;//锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 36;//死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;//刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自动输出使能
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
TIM_CtrlPWMOutputs(TIM1,ENABLE);//******输出使能必须要有
TIM_Cmd(TIM1,ENABLE);
}
void pwm_init(void)
{
Three_phaseMotor_PWM_Init(72);
}
主函数while(1)中直接打开,连接示波器即可观察波形,改变占空比反复观察!!!
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);//W上管
TIM_CCxNCmd(TIM1,TIM_Channel_1, TIM_CCxN_Enable);//W下管