OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 239|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第十八章 通用定时器PWM输出实验

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2024-4-7 16:49:13 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-4-2 15:51 编辑

第十八章 通用定时器PWM输出实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将介绍使用STM32F103的通用定时器输出PWM。通过本章的学习,读者将学习到通用定时器输出比较的使用。
本章分为如下几个小节:
18.1 硬件设计
18.2 程序设计
18.3 下载验证

18.1 硬件设计
18.1.1 例程功能
1. PB4引脚输出频率为2KHz占空比不断变化的PWM
2. LED0闪烁,提示程序正在运行

18.1.2硬件资源
1. LED
       LED0 - PB5
2. TIM3
       CH1 - PB4

18.1.3 原理图
本章实验使用的TIM3为STM32F103的片上资源,因此没有对应的连接原理图。

18.2 程序设计
18.2.1 HAL库的TIM驱动
本章实验将使用TIM3从CH1(PB4引脚)输出PWM,因此需要配置通用定时器从指定通道输出PWM,具体的步骤如下:
①:初始化定时器PWM
②:配置定时器PWM输出通道
③:开始定时器PWM输出
在HAL库中对应的驱动函数如下:
①:初始化定时器PWM
该函数用于初始化定时器PWM,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240402154935.png
表18.2.1.1 函数HAL_TIM_PWM_Init()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240402154944.png
表18.2.1.2 函数HAL_TIM_PWM_Init()返回值描述
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.    TIM_HandleTypeDef tim_handle = {0};
  5.    
  6.     /* 初始化TIM3 PWM */
  7.    tim_handle.Instance = TIM3;
  8.    tim_handle.Init.Prescaler = 72 - 1;
  9.    tim_handle.Init.Period = 500 - 1;
  10.    HAL_TIM_PWM_Init(&tim_handle);
  11. }
复制代码
②:配置定时器PWM输出通道
该函数用于配置定时器的PWM输出通道,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(   TIM_HandleTypeDef *htim,
  2.                                                  TIM_OC_InitTypeDef*sConfig,
  3.                                                  uint32_t Channel);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240402154954.png
表18.2.1.3 函数HAL_TIM_PWM_ConfigChannel()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240402155001.png
表18.2.1.4 函数HAL_TIM_PWM_ConfigChannel()返回值描述
该函数使用TIM_OC_InitTypeDef类型结构体指针传入了定时器输出比较通道的配置参数,该结构体的定义如下所示:
  1. typedef struct
  2. {
  3.     uint32_t OCMode;        /* 输出比较模式 */
  4.     uint32_t Pulse;         /* 占空比 */
  5.     uint32_t OCPolarity;    /* 输出极性 */
  6.     uint32_t OCNPolarity;   /* 互补输出极性 */
  7.     uint32_t OCFastMode;    /* 快速模式 */
  8.     uint32_t OCIdleState;   /* 空闲状态 */
  9.     uint32_t OCNIdleState;  /* 互补空闲状态 */
  10. }TIM_OC_InitTypeDef;
复制代码
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.    TIM_OC_InitTypeDef tim_oc_init_struct = {0};
  5.    
  6.     /* 配置定时器通道1PWM输出 */
  7.    tim_oc_init_struct.OCMode = TIM_OCMODE_PWM1;
  8.    tim_oc_init_struct.Pulse = 250 - 1;
  9.    tim_oc_init_struct.OCPolarity = TIM_OCPOLARITY_HIGH;
  10.    HAL_TIM_PWM_ConfigChannel(&tim_handle, &tim_ic_init_struct, TIM_CHANNEL_1);
  11. }
复制代码
③:开始定时器PWM输出
该函数用于开始定时器的PWM输出,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240402155011.png
表18.2.1.5 函数HAL_TIM_PWM_Start()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240402155019.png
表18.2.1.6 函数HAL_TIM_PWM_Start()返回值描述
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.     /* 开启定时器通道1PWM输出 */
  5.    HAL_TIM_PWM_Start(&tim_handle, TIM_CHANNEL_1);
  6. }
复制代码
18.2.2 通用定时器驱动
本章实验的通用定时器驱动主要负责向应用层提供通用定时器的初始化函数。本章实验中,通用定时器的驱动代码包括gtim.c和gtim.h两个文件。
通用定时器驱动中,对TIM、GPIO的相关宏定义,如下所示:
  1. #define GTIM_TIMX_PWM                  TIM3
  2. #define GTIM_TIMX_PWM_CLK_ENABLE()     \
  3.     do {                                \
  4.          __HAL_RCC_TIM3_CLK_ENABLE();   \
  5.     }while (0)
  6. #define GTIM_TIMX_PWM_CHY              TIM_CHANNEL_1
  7. #define GTIM_TIMX_PWM_CHY_GPIO_PORT    GPIOB
  8. #define GTIM_TIMX_PWM_CHY_GPIO_PIN     GPIO_PIN_4
  9. #define GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE()    \
  10.     do {                                        \
  11.          __HAL_RCC_GPIOB_CLK_ENABLE();          \
  12.     }while (0)
复制代码
通用定时器驱动中TIM3的初始化函数,如下所示:
  1. /**
  2. *@brief   初始化通用定时器PWM
  3. *@param   arr: 自动重装载值
  4. *@param   psc: 预分频系数
  5. *@retval  无
  6. */
  7. voidgtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)
  8. {
  9.    TIM_OC_InitTypeDef timx_oc_pwm_struct = {0};
  10.    
  11.     /* 初始化定时器PWM */
  12.    g_timx_pwm_handle.Instance = GTIM_TIMX_PWM;
  13.    g_timx_pwm_handle.Init.Prescaler = psc;
  14.    g_timx_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
  15.    g_timx_pwm_handle.Init.Period = arr;
  16.    HAL_TIM_PWM_Init(&g_timx_pwm_handle);
  17.    
  18.     /* 配置定时器PWM输出通道 */
  19.    timx_oc_pwm_struct.OCMode = TIM_OCMODE_PWM1;
  20.    timx_oc_pwm_struct.Pulse = (arr + 1) >> 1;
  21.    timx_oc_pwm_struct.OCPolarity = TIM_OCPOLARITY_HIGH;
  22.    HAL_TIM_PWM_ConfigChannel(  &g_timx_pwm_handle,
  23.                                  &timx_oc_pwm_struct,
  24.                                  GTIM_TIMX_PWM_CHY);
  25.    
  26.     /* 开始定时器PWM输出 */
  27.    HAL_TIM_PWM_Start(&g_timx_pwm_handle, GTIM_TIMX_PWM_CHY);
  28. }
复制代码
从TIM3的初始化代码中可以看到,初始化函数中初始化了TIM3的PWM并配置了TIM3的PWM输出通道1,最后开始TIM3的PWM输出。

18.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint16_t compare = 0;
  4.     uint8_t counter = 0;
  5.    
  6.    HAL_Init();                                 /* 初始化HAL库 */
  7.    sys_stm32_clock_init(RCC_PLL_MUL9);         /* 配置时钟,72MHz */
  8.    delay_init(72);                             /* 初始化延时 */
  9.    usart_init(115200);                         /* 初始化串口 */
  10.    led_init();                                 /* 初始化LED */
  11.    gtim_timx_pwm_chy_init(500 - 1, 72 - 1);   /* 初始化通用定时器PWM */
  12.    
  13.     while (1)
  14.     {
  15.          if (compare++ >= 300)
  16.          {
  17.              compare = 100;
  18.          }
  19.          __HAL_TIM_SET_COMPARE(&g_timx_pwm_handle, GTIM_TIMX_PWM_CHY, compare);
  20.          
  21.          if (counter++ == 20)
  22.          {
  23.              counter = 0;
  24.              LED0_TOGGLE();
  25.          }
  26.          
  27.          delay_ms(10);
  28.     }
  29. }
复制代码
从上面的代码中可以看到,在初始化完TIM3输出PWM后,就不断地改变TIM3通道1的比较值,以达到改变PWM占空比。

18.3 下载验证
在完成编译和烧录操作后,可以观察到PB4引脚输出频率为2KHz,占空比不断变化的PWM。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 21:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表