stm32f103c8t6外设——通用定时器PWM模式及IO复用实现呼吸灯

一、通用定时器

通用计数器可以实现输入捕获、输出捕获、定时器级联(一个定时器作为另一个定时器的预分频器)、中断等。

本实验通过输出捕获实现PWM波,PWM1与PWM2模式输出相反(本文以PWM1模式为例)。

二、PWM模式配置

本实验将PB5重映射为TIM3_CH2(IO复用)。

1、gtim.h文件

(1)初始化TIM3为向上计数模式

TIM_HandleTypeDef g_timx_pwm_chy_handle;

/* 通用定时器PWM输出初始化函数 */

void gtim_timx_pwm_chy_init(uint16_t psc,uint16_t arr)

{

    g_timx_pwm_chy_handle.Instance = TIM3;

    g_timx_pwm_chy_handle.Init.Prescaler = psc;

    g_timx_pwm_chy_handle.Init.Period = arr;

g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;    /* 向上计数模式 */

}

(2)定时器输出PWM MSP初始化函数

/* 定时器输出PWM MSP初始化函数 */

/* 1、使能TIM时钟;2、使能IO时钟及引脚复用. */

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)

{

    if(htim->Instance == TIM3)

    {

        GPIO_InitTypeDef g_init_struct;

   

        __HAL_RCC_GPIOB_CLK_ENABLE();

        __HAL_RCC_TIM3_CLK_ENABLE();

       

        g_init_struct.Pin = GPIO_PIN_5;

        g_init_struct.Mode = GPIO_MODE_AF_PP;               /* 推挽复用功能 */

        g_init_struct.Pull = GPIO_PULLUP;                   /* 上拉 */

        g_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;         /* 高速 */

        HAL_GPIO_Init(GPIOB, &g_init_struct);

       

        __HAL_RCC_AFIO_CLK_ENABLE();                        /* 复用IO时钟使能 */

        __HAL_AFIO_REMAP_TIM3_PARTIAL();                    /* 部分复用使能 */

    }

}

__HAL_AFIO_REMAP_TIM3_PARTIAL();                    /* 部分复用使能 */

(3)在(1)函数体中继续配置PWM模式、比较值(初始占空比)及极性,配置TIM3通道2,开启对应PWM通道。

void gtim_timx_pwm_chy_init(uint16_t psc,uint16_t arr)

{

TIM_OC_InitTypeDef timx_oc_pwm_chy;



    timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;                       /* 模式选择PWM1 */

    timx_oc_pwm_chy.Pulse = arr / 2;                                /* 设置比较值CCRx,此值用来确定占空比 */

                                                                    /* 这里默认设置比较值为自动重装载值的一半,即占空比为50% */

    timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW;                /* 设定CCxP的值,低电平有效 */

    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle,&timx_oc_pwm_chy, TIM_CHANNEL_2);   /* 配置TIM3通道2 */

    HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, TIM_CHANNEL_2);       /* 开启对应PWM通道 */





}

2、main.c文件

(1) __HAL_TIM_SET_COMPARE()修改比较值控制占空比。

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"

extern TIM_HandleTypeDef g_timx_pwm_chy_handle;

int main(void)
{
    uint32_t ledpwmval = 0;
    uint8_t dir = 1;
    
    HAL_Init();                                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);                     /* 设置时钟, 72Mhz */
    delay_init(72);                                         /* 延时初始化 */
    usart_init(115200);                                     /* 初始化串口 */
    gtim_timx_pwm_chy_init(72 - 1, 500 - 1);

    printf("程序开始:\r\n");
    while(1)
    { 
        delay_ms(10);
        
        /* 根据方向修改ledpwmval */
        if (dir == 1)
        {
            ledpwmval++;
        }
        else
        {
            ledpwmval--;
        }
        
        /* 当ledpwmval大于500时,方向改为递减 */
        if (ledpwmval > 500)
        {
            dir = 0;
        }
        
        /* 当ledpwmval等于0时,方向改为递增 */
        if (ledpwmval == 0)
        {
            dir = 1;
        }

        /* 修改比较值控制占空比 */
        __HAL_TIM_SET_COMPARE(&g_timx_pwm_chy_handle, TIM_CHANNEL_2, ledpwmval);
    }
}

三、PWM为什么能控制led灯或者电机的速度?

        原因是,PWM波形是具有一定占空比的矩形波,呈现高低电平交替的状态,频率较高,即波形周期较小。在高速变化过程中,led灯会呈现出一个平均亮度(人眼看出来的状态),通过不断改变PWM波的占空比,高低电平交替的速度会发生变化,此时这个平均亮度也会发生变化,故就可以通过改变PWM波的占空比以改变led灯的亮度,实现呼吸灯的效果。电机也相同,不再赘述。

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F103C8T6上配置定时器3进行PWM输出,可以使用STM32CubeMx软件和STM32F1xx/STM32F4xx HAL库函数来实现。下面是配置定时器3的步骤: 1. 打开STM32CubeMx软件,创建一个新的工程。 2. 选择正确的芯片型号(STM32F103C8T6)。 3. 在"Pinout & Configuration"选项卡中,选择定时器3的输出引脚。例如,选择一个GPIO引脚作为PWM输出引脚。 4. 在"Configuration"选项卡中,找到"TIM3"并启用它。 5. 在"TIM3 Configuration"中,选择PWM模式。 6. 配置PWM的频率和占空比。 7. 在"Project"选项卡中,生成代码并下载到STM32F103C8T6开发板上。 在生成的代码中,可以使用STM32F1xx/STM32F4xx HAL库函数来配置和控制定时器3。下面是一个示例代码: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim3; void TIM3_Init(void) { TIM_OC_InitTypeDef sConfigOC; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; // 设置PWM周期 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim3); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 设置PWM占空比 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); } int main(void) { HAL_Init(); TIM3_Init(); while (1) { // 可以在这里修改PWM占空比 } } ``` 这段代码使用HAL库函数初始化定时器3,并配置为PWM模式。可以通过修改`sConfigOC.Pulse`的值来改变PWM的占空比。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成为不掉头发的工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值