TIM2 PWM输出测试


  今天给大伙分享一个TIM2 PWM输出小实验。

  实验开发板:Nucleo-L053R8,即STM32L053R8T6。

  开发环境:MDK5

图1 - 工程界面

  本次实验测试的是通用定时器TIM2,PWM输出模式。

附上代码:

bsp_tim.h

 /**
******************************************************************************
* File Name : bsp_tim.h
* Description : This file provides code for the configuration
* of the TIM instances.
******************************************************************************
*/
#ifndef __BSP_TIM_H
#define __BSP_TIM_H #include "stm32l0xx_hal.h" // 使用宏定义,代码易于移植 #define TIM_CH1_PORT GPIOA
#define TIM_CH1_PIN GPIO_PIN_0 #define TIM_x TIM2
#define TIM_CHANNEL_x TIM_CHANNEL_1
#define TIM_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE() // PWM信号的频率 F = TIM_CLK/((ARR+1)*(PSC+1))
#define TIM_PSC (1-1)
#define TIM_PERIOD (200-1)
#define TIM_PULSE 100 extern void _Error_Handler(void);
void HAL_TIM2_Init(void); #endif /* __BSP_TIM_H */

bsp_tim.c

 /**
******************************************************************************
* File Name : bsp_tim.c
* Description : This file provides code for the configuration
* of the TIM instances.
******************************************************************************
*/ #include "bsp_tim.h" static void HAL_TIM2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // TIM2_PWM输出GPIO初始化 PA0 ----> TIM2_CH1
GPIO_InitStruct.Pin = TIM_CH1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;
HAL_GPIO_Init(TIM_CH1_PORT, &GPIO_InitStruct);
} static void HAL_TIM2_Mode_Config(void)
{
TIM_HandleTypeDef TIM_HandleStruct;
TIM_MasterConfigTypeDef TIM_MasterStruct;
TIM_OC_InitTypeDef TIM_OC_InitStruct; // 开启定时器时钟
TIM_CLK_ENABLE; TIM_HandleStruct.Instance = TIM_x;
TIM_HandleStruct.Init.Prescaler = TIM_PSC;
TIM_HandleStruct.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_HandleStruct.Init.Period = TIM_PERIOD;
TIM_HandleStruct.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&TIM_HandleStruct) != HAL_OK)
{
_Error_Handler();
} TIM_MasterStruct.MasterOutputTrigger = TIM_TRGO_RESET;
TIM_MasterStruct.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&TIM_HandleStruct, &TIM_MasterStruct) != HAL_OK)
{
_Error_Handler();
} TIM_OC_InitStruct.OCMode = TIM_OCMODE_PWM1;
TIM_OC_InitStruct.Pulse = TIM_PULSE;
TIM_OC_InitStruct.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM_OC_InitStruct.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&TIM_HandleStruct, &TIM_OC_InitStruct, TIM_CHANNEL_x) != HAL_OK)
{
_Error_Handler();
} HAL_TIM_PWM_Start(&TIM_HandleStruct, TIM_CHANNEL_x);
} void HAL_TIM2_Init(void)
{
HAL_TIM2_GPIO_Config();
HAL_TIM2_Mode_Config();
}

main.c

 /**
******************************************************************************
* @file main.c
* @author Tuple
* @brief Main program body
******************************************************************************
*/ #include "stm32l0xx_hal.h"
#include "bsp_tim.h" void _Error_Handler(void);
void SystemClock_Config(void); int main(void)
{
//重置所有外围设备,初始化Flash接口和Systick
HAL_Init(); //系统时钟配置
SystemClock_Config(); //TIM2 PWM输出配置
HAL_TIM2_Init(); } void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct; //Configure the main internal regulator output voltage
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); //Initializes the CPU, AHB and APB busses clocks
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = ;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler();
} //Initializes the CPU, AHB and APB busses clocks
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
_Error_Handler();
} HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); //Configure the Systick interrupt time
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/); //Configure the Systick
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); //SysTick_IRQn interrupt configuration
HAL_NVIC_SetPriority(SysTick_IRQn, , );
} void _Error_Handler()
{
while()
{
}
}

  如果你不清楚Nucleo板子上PA0在哪个引脚,请查阅RCC时钟配置实验的Figure 20  -->   Figure 20.NUCLEO-L053R8

  用两根杜邦线从Nucleo板子上引出PA0、GND,然后用数字示波器来监控PWM输出。实物连接如下:

图2 - 实物连接图

  把编译好的程序下载到Nucleo开发板,PWM输出设置成不同的占空比,用示波器监控 PWM输出的波形。下面给大伙展示3组不同占空比的PWM输出波形:

图3 - 占空比25%的PWM波形

图4 - 占空比50%的PWM波形

图5 - 占空比75%的PWM波形

  附:工程源码(百度云)

NUCLEO-L053R8 TIM定时器 PWM输出的更多相关文章

  1. (五)转载:通用定时器PWM输出

    1.     TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  2. STM32(7)——通用定时器PWM输出

    1.TIMER输出PWM基本概念         脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种 ...

  3. STM32F103ZET6 PWM输出

    1.通用定时器的PWM功能 STM32F103ZET6有4个通用定时器,分别是TIM2.TIM3.TIM4.TIM5. 通用定时器由一个可编程预分频器驱动的16位自动装载计数器构成. 通用定时器的很多 ...

  4. 定时器TIM,pwm

    一.定时器 1.     定义 设置等待时间,到达后则执行指定操作的硬件. 2.    STM32F407的定时器有以下特征 具有基本的定时功能,也有PWM输出(灯光控制.电机的转速).脉冲捕获功能( ...

  5. 合宙AIR105(三): 定时器, 定时器中断和PWM输出

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...

  6. 关于普通定时器与高级定时器的 PWM输出的初始化的区别

    不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  TIM_ ...

  7. STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置

    基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...

  8. 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形

    主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...

  9. STM32F0使用LL库实现PWM输出

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...

随机推荐

  1. Last_SQL_Error: Error 'Can't drop database 'ABC'; database doesn't exist' on query. Default database: 'ABC'. Query: 'drop database ABC'

    查看从库状态发现报错: show slave status\G; 发现是主库上删除了一个数据库,但是从库上面没有,从库执行这个语句的时候失败报错. 解决方法: 停止从库 stop slave; 创建语 ...

  2. 利息力(force of interest)

    一.提出问题 二.定义 设积累函数连续可导,则时刻 t 的利息力为 三.单利在 t 时刻的利息力 单利的利息力是时间的递减函数 四.复利在时刻 t 的利息力 复利的利息力是常数!与时间无关. 称为复利 ...

  3. 设置C++ cout输出精度

    cout.precision(5); 数字表示小数点位数 // modify precision #include <iostream> // std::cout, std::ios in ...

  4. July 05th 2017 Week 27th Wednesday

    No man can make a good coat with bad cloth. 巧妇难为无米之炊. One can't make bricks without straw. There is ...

  5. ZT-Android深入浅出之Binder机 制

    转贴 不是原创! Android深入浅出之Binder机 制 一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交 ...

  6. 如何跟踪比特币SV(BSV)地址余额?

    Coin Balance Tracker 能够查看任何BSV/BCH/BTC地址的当前余额.您只需要确保你的电脑能连接Internet以及地址正确.此程序非常安全,因为它只使用公共数据,不需要登录和密 ...

  7. C#图解教程读书笔记(第8章 表达式和运算符)

    表达式 字面量 整数字面量 字符字面量 字符串字面量 求值顺序 优先级 结合性 与C和C++不同,在C#中的数字不具有布尔意义. 各种运算符的作用(过) 用户定义类型转换 class XiXiInt ...

  8. MySQL语法一:数据定义语句

    MySQL语句语法主要分为以下三大类: 一.数据定义语句DDL(CREATE,ALTER,DROP,DECLARE) 数据定义语句是用于修改表结构的. 一).语法提炼: 二).由上图可知,数据定义语句 ...

  9. BZOJ3196:二逼平衡树(线段树套Splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在 ...

  10. PHP-------抽象和接口

    静态的关键字是:static Class ren { Public static $yanse;    //yanse是一个静态的成员 Static function show() ; // stat ...