赞
踩
使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。
实验平台:KEIL5、STMCubeMX。
实验器材:STM32103C8,LED灯两只。
实验语言:C语言
什么是PWM
PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
原理
PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
优点及应用
由于其控制简单、灵活和动态响应好等优点而成为电力电子技术应用最广泛的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。
PWM产生
STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:(其他定时器框图类似)
打开头文件路径(我的路径是:breathing\User\breathinglight\bsp_breathing.h),进行硬件的宏观定义.
#ifndef __PWM_BREATHING_H #define __PWM_BREATHING_H #include "stm32f10x.h" /*PWM±íÖеĵãÊý*/ extern uint16_t POINT_NUM ; //¿ØÖÆÊä³ö²¨ÐεÄƵÂÊ extern __IO uint16_t period_class ; #define RED_LIGHT 1 #define GREEN_LIGHT 2 #define BLUE_LIGHT 3 /*ҪʹÓÃʲôÑÕÉ«µÄºôÎüµÆ£¬¿ÉÑ¡RED_LIGHT¡¢GREEN_LIGHT¡¢BLUE_LIGHT*/ #define LIGHT_COLOR RED_LIGHT /********************¶¨Ê±Æ÷ͨµÀ**************************/ #if LIGHT_COLOR == RED_LIGHT /************ºìµÆ***************/ #define BRE_TIMx TIM3 #define BRE_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd #define BRE_TIM_CLK RCC_APB1Periph_TIM3 #define BRE_TIM_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd #define BRE_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO) #define BRE_GPIO_REMAP_FUN() GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //ºìµÆµÄÒý½ÅÐèÒªÖØÓ³Éä #define BRE_TIM_LED_PORT GPIOB #define BRE_TIM_LED_PIN GPIO_Pin_5 #define BRE_TIM_OCxInit TIM_OC2Init //ͨµÀÑ¡Ôñ£¬1~4 #define BRE_TIM_OCxPreloadConfig TIM_OC2PreloadConfig #define BRE_CCRx CCR2 #define BRE_TIMx_IRQn TIM3_IRQn //¶¨Ê±Æ÷ÖÐ¶Ï #define BRE_TIMx_IRQHandler TIM3_IRQHandler #elif LIGHT_COLOR == GREEN_LIGHT /************Â̵Æ***************/ #define BRE_TIMx TIM3 #define BRE_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd #define BRE_TIM_CLK RCC_APB1Periph_TIM3 #define BRE_TIM_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd #define BRE_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB) #define BRE_GPIO_REMAP_FUN() //Â̵Ʋ»ÐèÒªÖØÓ³Éä #define BRE_TIM_LED_PORT GPIOB #define BRE_TIM_LED_PIN GPIO_Pin_0 #define BRE_TIM_OCxInit TIM_OC3Init //ͨµÀÑ¡Ôñ£¬1~4 #define BRE_TIM_OCxPreloadConfig TIM_OC3PreloadConfig #define BRE_CCRx CCR3 #define BRE_TIMx_IRQn TIM3_IRQn //ÖÐ¶Ï #define BRE_TIMx_IRQHandler TIM3_IRQHandler #elif LIGHT_COLOR == BLUE_LIGHT /************À¶µÆ***************/ #define BRE_TIMx TIM3 #define BRE_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd #define BRE_TIM_CLK RCC_APB1Periph_TIM3 #define BRE_TIM_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd #define BRE_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB) #define BRE_GPIO_REMAP_FUN() //À¶µÆ²»ÐèÒªÖØÓ³Éä #define BRE_TIM_LED_PORT GPIOB #define BRE_TIM_LED_PIN GPIO_Pin_1 #define BRE_TIM_OCxInit TIM_OC4Init //¶¨Ê±Æ÷Êä³öͨµÀÑ¡Ôñ£¬1~4 #define BRE_TIM_OCxPreloadConfig TIM_OC4PreloadConfig #define BRE_CCRx CCR4 #define BRE_TIMx_IRQn TIM3_IRQn //¶¨Ê±Æ÷ÖÐ¶Ï #define BRE_TIMx_IRQHandler TIM3_IRQHandler #endif
bsp_breathing.c 文件中
其中由于红灯使用的引脚需要用到第二功能,本代码使用宏 BRE_GPIO_REMAP_FUN ()进行了该引脚的功能重定义操作。
观察TIM3输出的波形,查表可知,TIM3在PA7,利用逻辑分析仪观察PA7,效果如下:
定义一个变量,用来存储占空比:
uint16_t duty_num = 10;
初值设为10.
uint16_t duty_num = 10;
开始TIM2的通道2,输出PWM。
在main函数中添加代码
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
while函数中添加代码
编译运行并烧录,实现效果如下:
本次实验让我学会了如何查看PWM波形,如何观察PWM波形,并利用它实现了呼吸灯的效果,在实现过程中,虽然很困难,不过好在查阅了许多资料也能解决,加深了我的印象。
参考:
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-pwm-huxideng
https://blog.csdn.net/qq_42992084/article/details/108547321?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。