STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

这篇具有很好参考价值的文章主要介绍了STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、PWM简介

PWM (Pulse Width Modulation)就是对外输出脉宽(即占空比)可调的方波信号,简称脉宽调制;

信号频率由自动重装寄存器ARR 的值决定,占空比由比较寄存器CCR 的值决定。

PWM工作模式

PWM模式1 :
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

总结就是:PWM模式1,无论是向上还是向下计数,当计数值小于重装载值是输出有效电平

PWM模式2 :
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

总结就是:PWM模式2,无论是向上还是向下计数,当计数值大于重装载值是输出有效电平

在两种模式下TIMx_CNT(计数器当前值)TIMx_CCR1(捕获/比较值) 只是决定是有效电平还是无效电平,有效电平可以是高电平也可以是低电平

以向上计数图例为例介绍

STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

上图中:CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)

当CNT小于CCRx时,TIMx_CHx通道输出低电平;
当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。

其中 预分频系数决定了PWM的时钟速度ARR(自动重装载值)的大小决定了PWM的周期CRRx(捕获/比较寄存器值)决定了输出有效信号的时间

有效信号: 高电平、低电平

PWM的一个周期
定时器从0开始向上计数;
0 ~ t1 ,定时器计数器TIMx_CNT值小于CCRx值 ,输出低电平
t1 ~ t2 ,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
TIMx_CNT值达到ARR时 ,定时器溢出,重新向上计数;
循环上述过程;

PWM时间计算

PWM周期计算:

Tpwm = ( (ARR + 1) * (PSC + 1) ) / Tclk

ARR 是自动重装载的值
PSC 是预分频系数
Tclk 是对应的时钟频率

示例:Tclk = 72M 、ARR (自动重装载的值)= 9999、PSC (预分频系数)= 7199
Tpwm = ( (ARR + 1) * (PSC + 1) ) / Tclk = (7200*10000) / 72 000 000 = 1s

占空比:

Duty circle = TIM3->CCR1 / ARR (单位:%)

二、STM32Cube MX配置

基本配置可以参考:STM32 CubeMx教程 – 基础知识及配置使用教程

配置RCC,配置为外部晶振模式

STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

配置SYS ,Debug为Serial Wire

STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

配置TIM,设置为内部时钟,选择通道一为PWM输出模式,正好对应到PA8,用于输出呼吸灯

STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)
STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

配置PWM的具体参数,预分频系数为 71,自动重装载值为 499,定时器溢出频率,即PWM的周期,就是 72MHz/(71+1)/(499+1) = 2kHz

STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

Mode: PWM模式1或模式2

Pulse: 占空比;对应捕获/比较寄存器2(TIMx_CCR2)中的CCR2[15:0]。

Output compare preload: 输出自动比较;对应捕获/比较模式寄存器1中的OC2PE位。输出比较2预装载使能

Fast Mode: PWM脉冲快速输出;对应捕获/比较模式寄存器1中的OC2FE位。输出比较2快速使能。

CH Polarity: 有效电平;对应捕获/比较使能寄存器(TIMx_CCER)中的CC2P位。定义输出极性。

配置时钟树

STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

三、代码详解

涉及到的HAL库函数:

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);  //开启PWM输出

__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,50);  //设置默认的占空比值

代码示例:

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint8_t pwm_value=0;   //PWM占空比
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */	
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);	//使能TIM1的PWM Channel1 输出
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		while (pwm_value < 500)
	  {
		  pwm_value++;
		  __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm_value);    //修改比较值,修改占空比
//		  TIM1->CCR1 = pwm_value;    //与上方作用相同,直接修改寄存器
		  HAL_Delay(1);
	  }
	  while (pwm_value)
	  {
		  pwm_value--;
		  __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm_value);    //修改比较值,修改占空比
//		  TIM1->CCR1 = pwmVal;    	 //与上方作用相同,直接修改寄存器
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);
  }
  /* USER CODE END 3 */
}

附录

本文涉及到的代码:STM32 HAL库 PWM例程文章来源地址https://www.toymoban.com/news/detail-428174.html

到了这里,关于STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源!自制一个桌面宠物(STM32CUBEMX HAL库 PWM波 小项目)

    原视频: 好,自制一个桌面宠物!_哔哩哔哩_bilibili 基础所需 : 基础电路认识,C语言,STM32开发,STM32CUBEIDE或CUBEMX和Keil使用(重要),一点点艺术细胞、一点点耐心。 CAUTION:本文重点在代码部分的开源,是基于HAL库。硬件手工部分不出教程(没必要)可以直接看视频P2,文

    2024年02月04日
    浏览(107)
  • 【11】STM32·HAL库开发-STM32CubeMX简介、安装 | 新建STM32CubeMX工程步骤

      STM32CubeMX是ST开发的一款图形配置工具,可通过配置自动生成 初始化代码 (并不包括逻辑代码)。以下是STM32CubeMX官方宣传图片,适用于Windows和macOS系统,用于生成初始化代码,一个图形配置工具,搭配不同系列的STM32Cube固件包,即可支持不同系列的STM32芯片,初始化代码

    2024年02月17日
    浏览(59)
  • STM32开发——简介、开发环境(Keil5、CubeMX)、HAL库

    目录 1.简介-初识STM32 2.开发环境 2.1使用Keil5  2.2使用STM32CubeMX  3.标准库与HAL库区别 4.推挽输出与开漏输出 什么是单片机? 单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处 理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时

    2024年02月16日
    浏览(58)
  • 【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

    2024年02月03日
    浏览(52)
  • stm32之PWM呼吸灯

            呼吸灯是灯从渐亮到渐灭周而复始形成的一个效果。由于51没有PWM所以需要定时器模拟PWM才能实现呼吸灯的效果,但是stm32的通用定时器是有PWM模式的,所以不需要再用软件模拟,精准度也高。 本实验用的基于stm32f103C8t6。在PB8引脚上接了一个led, led的另一端接到

    2024年02月05日
    浏览(33)
  • STM32自学☞PWM驱动LED呼吸灯

    常用函数简单说明 ①用来配置输出比较模块  TIM_OC1Init()     (初始化)             TIM_OC2Init()                               TIM_OC3Init()                               TIM_OC4Init() ②TIM_OCStructInit();用来给输出比较结构体赋一个默认值 ③用来配置强制输出模式  TIM

    2024年02月19日
    浏览(36)
  • stm32定时器输出pwm&IO口模拟pwm——呼吸灯

    什么是pwm波?pwm就是脉冲宽度调制,就是占空比可变的脉冲波形,通过改变占空比,输出不同的pwm波,就能实现许多有趣的功能,比如说我们生活中常见的呼吸灯就是通过这样实现的。接下来我们就以呼吸灯为例,学习stm32通过定时器输出pwm波和io口模拟输出pwm波。 控制方式就

    2024年01月18日
    浏览(50)
  • 基于STM32利用PWM完成呼吸灯的实现

    1.高级控制定时器功能实现框图 其中分为6个板块:①时钟源②控制器 ③时基单元 ④输入捕获 ⑤输出比较 ⑥断路功能 2.pwm的定义 pwm是​​​​​​​一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间

    2024年02月03日
    浏览(41)
  • STM32自学历程——PWM呼吸灯的实现(下)

    成功实现LED灯的呼吸效果,先由暗到亮,再由亮到暗,以此循环往复。 VID20240116160256 因为,PWM部分是挂靠在定时器里面的,所以代码必须要先初始化定时器,当然初始化定时器就可以直接用之前的定时器初始化,这里不再需要中断NVIC模块,所以可以直接去掉。 定时器初始化

    2024年01月23日
    浏览(39)
  • 嵌入式-stm32-用PWM点亮LED实现呼吸灯

    答:LED需要低电平才能亮,高电平是灯灭。 答:这是用到不同占空比来实现的,控制LED实现呼吸灯,就是通过占空比的高低电平和其持续时间来实现。 ①例如,要定时500ms,则:PSC=7199,ARR=4999,Tclk=72Mhz。 ②假如频率为 2kHz ,则:PSC=71,ARR=499, 频率和周期是描述波形的两个基

    2024年02月03日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包