GD32实战13__PWM

原理

1.与定时器章节共用代码
2.PWM(Pulse Width Modulation脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。如下图,PWM输出的信号就是一串方波,PWM控制方波输出的频率和占空比(t1/t2)。

在这里插入图片描述

​ 面积等效原理:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。在这里插入图片描述

​ 虽然PWM非常简单,但当其配合上面积等效原理后,作用就变的非常的大了。例如,利用PWM输出一个正玄半波。

在这里插入图片描述

配置流程

​ 由于PWM对时间的控制的高度依赖,因此GD32使用定时器来实现PWM,所以在配置时基本步骤是

  1. 配置GPIO,TIMER2 通道3和串口Tx共用GPIOA,此处需要使能RCC_APB2PERIPH_AF

        RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_AF, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_2;
        GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
    
  2. 配置定时器,配置PWM的频率为100Hz,周期10ms

        TIMER_DeInit(TIMER2);
        TIMER_BaseInitParaStructure.TIMER_Prescaler = 108-1; /* 1MHz */
        TIMER_BaseInitParaStructure.TIMER_CounterMode = TIMER_COUNTER_UP;
        TIMER_BaseInitParaStructure.TIMER_Period = 10000-1; /* 10000*1MHz = 10ms */
        TIMER_BaseInitParaStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
        TIMER_BaseInit(TIMER2,&TIMER_BaseInitParaStructure);
    
  3. 配置PWM,配置占空比,脉冲宽度为5000*100Hz=5ms,即占空比5ms/10ms = 50%

        TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
        TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
        TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;
        TIMER_OCInitStructure.TIMER_OCIdleState = TIMER_OC_IDLE_STATE_RESET;
        TIMER_OCInitStructure.TIMER_Pulse = 4999; /* 5000*1MHz=5ms */
        TIMER_OC3_Init(TIMER2, &TIMER_OCInitStructure);
    
  4. 完整代码如下

VOID DRV_TIMER_Timer2PwmInit(VOID)
{
    GPIO_InitPara GPIO_InitStructure;
    TIMER_BaseInitPara TIMER_BaseInitParaStructure;
    TIMER_OCInitPara   TIMER_OCInitStructure;

    RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2,ENABLE); 
    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_AF, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_2;
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
	
    TIMER_DeInit(TIMER2);
    TIMER_BaseInitParaStructure.TIMER_Prescaler = 108-1; /* 1MHz */
    TIMER_BaseInitParaStructure.TIMER_CounterMode = TIMER_COUNTER_UP;
    TIMER_BaseInitParaStructure.TIMER_Period = 10000-1; /* 10000*1MHz = 10ms */
    TIMER_BaseInitParaStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
    TIMER_BaseInit(TIMER2,&TIMER_BaseInitParaStructure);
    
    TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
    TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
    TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;
    TIMER_OCInitStructure.TIMER_OCIdleState = TIMER_OC_IDLE_STATE_RESET;
    TIMER_OCInitStructure.TIMER_Pulse = 4999; /* 5000*1MHz=5ms */
    TIMER_OC3_Init(TIMER2, &TIMER_OCInitStructure);
    
    TIMER_Enable(TIMER2,ENABLE);
}

代码路径

https://github.com/YaFood/GD32F103/tree/master/TestTimer

猜你喜欢

转载自blog.csdn.net/qq_17854661/article/details/91951400
今日推荐