STM32-PWM配置流程及作用

STM32F407ZET6单片机配置PWM(脉冲宽度调制)

PWM配置流程

STM32F407ZET6单片机配置PWM的流程通常包括以下几个步骤:

  1. 时钟使能:
    • 首先,需要使能定时器和相关IO口的时钟。这通常通过调用RCC(Reset and Clock Control)相关的函数来实现,比如RCC_APB1PeriphClockCmd()用于使能APB1总线上的定时器时钟,RCC_AHB1PeriphClockCmd()用于使能AHB1总线上的GPIO时钟。
  2. IO口初始化:
    • 接着,需要初始化用于PWM输出的IO口。这包括设置IO口的模式为复用功能输出(因为PWM输出通常是通过定时器的复用功能实现的),并配置IO口的输出类型(如推挽输出)、速度等参数。
  3. 复用映射:
    • 将GPIO引脚复用映射到指定的定时器上。这是通过调用GPIO的复用映射函数实现的,比如GPIO_PinAFConfig()
  4. 定时器初始化:
    • 初始化定时器,包括设置定时器的预分频器(Prescaler)、自动重装载寄存器(ARR)的值、时钟分频(ClockDivision)等。这些参数决定了PWM的频率和周期。
  5. PWM模式配置:
    • 配置定时器的输出比较参数,以设置PWM的模式(如PWM模式1或PWM模式2)、输出状态(使能或禁用)、输出极性(高电平有效或低电平有效)等。
  6. 使能预装载寄存器:
    • 使能定时器的预装载寄存器,以确保在更新事件发生时,新的参数值能够正确地加载到活动寄存器中。
  7. 使能定时器:
    • 最后,使能定时器,开始PWM波形的生成。

PWM的作用

PWM在STM32F407ZET6单片机中有多种应用,主要包括:

  1. 控制电机速度:

    • 通过改变PWM波的占空比,可以控制直流电机或步进电机的速度。占空比越大,电机转速越快;占空比越小,电机转速越慢。
  2. 调节灯光亮度:

    • PWM信号同样可以用于调节LED等光源的亮度。通过调整PWM波的占空比,可以改变LED的平均电流,从而改变其亮度。
  3. 精确控制电源:

    • 在一些需要精确控制电源输出的场合,如开关电源、逆变器等,PWM信号可以用来调节输出电压或电流的大小。
  4. 信号传输:

    • 在通讯等信号传输领域,PWM信号因其数字形式的优点(如抗干扰能力强)而得到广泛应用。通过PWM编码,可以将模拟信号转换为数字信号进行传输。

    综上所述,STM32F407ZET6单片机配置PWM的流程涉及多个步骤,包括时钟使能、IO口初始化、复用映射、定时器初始化、PWM模式配置、使能预装载寄存器和使能定时器等。而PWM的作用则主要体现在电机控制、灯光调节、电源控制和信号传输等方面。

    代码示例

    /*******************************************************************
    *
    *	函数名称:	TIM14_Config
    *	函数功能:   配置定时器输出pwm,改变LED的亮度
    * 	函数参数:	无
    *   返回结果:   
    * 	注意事项:   None
    * 	函数作者:  m17872844806@163.com
    *	创建日期:   2024/04/25
    *	修改历史:
    *	函数版本:	V1.0
    * *****************************************************************/
    void  TIM14_Config()
    {
    	//1.打开TIM14+GPIOF的时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,  ENABLE);
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,  ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	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(GPIOF, &GPIO_InitStructure);
    	GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
    	
    	//2.定义结构体变量并对结构体变量的成员进行赋值,1s可以生成100个脉冲
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        //预分频值,TIM14的时钟是84MHZ,所以可以降低频率 100us计数一次
    	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;
        //计数次数,这个值会写入自动重载寄存器 100us * 100 = 10ms    
    	TIM_TimeBaseStructure.TIM_Period = 100-1;
        //计数模式,基本定时器TIM6和TIM7只允许递增计数
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
        
    	//3.对定时器进行初始化
    	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
        TIM_OCInitTypeDef  TIM_OCInitStructure;
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInitStructure.TIM_Pulse = 95;//可以改变此占空比改变CCR的值
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //此赋值为低电平有效 
    	TIM_OC1Init(TIM14, &TIM_OCInitStructure);
    
    	TIM_OC4PreloadConfig(TIM14, TIM_OCPreload_Enable);
    
        TIM_ARRPreloadConfig(TIM14, ENABLE);
    	//6.打开定时器TIM14
    	TIM_Cmd(TIM14, ENABLE);
    }
    
posted @ 2024-07-03 22:42  琨为玉也  阅读(94)  评论(0编辑  收藏  举报