STM32CubeIDE基础学习-定时器PWM实验
文章目录
- STM32CubeIDE基础学习-定时器PWM实验
- 前言
- 第1章 硬件介绍
- 第2章 工程配置
- 2.1 基础工程配置部分
- 2.2 生成工程代码部分
- 第3章 代码编写
- 3.1 查看PWM波
- 3.2 设置单个比较值
- 3.3 呼吸灯
- 第4章 实验现象
- 总结
前言
在平时单片机开发时,需要用到单片机输出一个固定占空比,那么就可以采取PWM脉冲调制技术了。
PWM在STM32的应用中还是比较常用的,比较多的设备是需要用PWM来驱动的,比如舵机、步进电机等。
STM32CubeIDE基础知识学习回顾
实验目的:
学习使用定时器输出PWM功能,实现定时器输出占空比从而可以在开发板的LED灯看效果功能。
注意:查看本实验现象要要用到示波器工具,这个要懂得示波器基础使用才行。
第1章 硬件介绍
LED灯的连接原理图如下:
由上图硬件连接原理图可知,LED接到主控芯片的PA8引脚上,想要看输出的PWM波,可以直接选择LED所在的引脚作为定时器输出通道就可以看到具体现象了。
实验过程中,用肉眼单纯看PWM的占空比是看不出来的,那么需要借助工具才行,我查看波形采用正点原子的DS100示波器,这个示波器的性能用在本实验是足够了,可以查看占空比、周期、时间宽度和占空比对应的电压等。
接着打开芯片数据手册,下拉找到PA8引脚所在的位置,如下图所示:
该PA8引脚所在定时器1的通道1上,所以后面配置这个定时器通道输出PWM即可。
当然,如果手上有示波器,就不一定要选LED所在的输出通道了,直接选一个定时器输出通道即可,直接用示波器来看输出的波形或占空比也是很方便的。
第2章 工程配置
2.1 基础工程配置部分
本实验采用LED实验的工程作为模板,直接在上面添加定时器PWM的功能配置即可。
第一步:配置定时器时钟源。
按照标号步骤依次选择即可,定时器1使用的是内部时钟源,通道1输出。
第二步:配置定时器相关参数。
根据定时器公式,PSC取7199,ARR取99,向上计数模式。
第三步:配置PWM参数。
采用PWM1模式,极性为高电平有效,这里参数Pulse的值就是CCRx的值,用来设置初始占空比的值,在初始化时,可以设置也可以不设置,让其默认为0,这里问题不大,后面在实际使用时还是会改变该值的。那么为了查看初始PWM的情况这里就初始化设置为ARR值的一半,即初始为50%的占空比。输出比较默认为使能即可。
到此,定时器及PWM功能配置完成之后,可以看到芯片的PA8引脚被配置为了TIM1_CH1了,如下图所示:
2.2 生成工程代码部分
配置完功能之后就可以点击生成工程代码了。
可以看到main文件多了一个定时器的初始化函数和tim.c文件,如下图所示:
进入定时器初始化函数后如下图所示:
里面主要是设置定时器相关参数等。
到此,检查生成初始化代码部分没有问题后就可以编写完成后面的控制功能代码就可以了。
第3章 代码编写
3.1 查看PWM波
在输出PWM之前,需要使能输出通道才可以,即使能CC1E位,使能之后就可以输出PWM了,不然是无法正常输出的。main函数调用使能函数如下图所示:
到此,前面设置PWM参数时,已经设置了Pulse的值为50了,那么使能输出通道之后不用写其它代码就可以正常输出一个50%占空比的PWM波了。
下面就用示波器来查看该波形情况,效果如下图所示:
根据公式计算和结合示波器输出参数,可以看到占空比是50%,周期是10ms,频率100Hz。经过示波器的参数显示分析,它们参数一致则说明代码的设置是正确的。
3.2 设置单个比较值
使能初始化正常之后,就可以调用函数来设置CCRx的值来设置指定PWM占空比了。
HAL库提供了一个设置比较值函数,__HAL_TIM_SET_COMPARE(HANDLE, CHANNEL, COMPARE);
该函数的第一个参数是定时器句柄、第二个是定时器输出通道、第三是比较值。
函数具体定义如下所示:
在while循环里面调用该函数,然后传入相关参数,如下图所示:
这里传入100则是占空比为100%了。下面以传入30为例演示:
代码片示例如下:
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 30);/* USER CODE END WHILE */}
下载代码后,示波器检测波形如下图所示:
函数比较值传入30,即占空比为30%,高电平电压为1.07接近1.1了。说明这个函数设置的比较值是没有问题的。
3.3 呼吸灯
能正常独立设置单个比较值之后,就可以把该变量设置为实时动态变化的数值,按规律递增或递减改变,这样就可以实现一个类似呼吸灯的效果了。
代码片示例如下:
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_Delay(30); /* 控制速度 */if(dir){pwm_val++;if(pwm_val >= 99){dir = 0;}}else{pwm_val--;if(pwm_val == 0){dir = 1;}}__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_val);/* USER CODE END WHILE */}
定义局部变量如下图所示:
下载代码后,就可以看到开发板的LED逐渐变亮,再由最亮逐渐变暗了,类似呼吸灯效果。要是想要显示呼吸的快慢不一样,设置延时参数即可,时间越短,速度越快。
注意:这个比较值最大是100,实际测试时发现到80时LED基本可以达到最亮了,所以会看到亮的时间会比较长些,如果要亮的时间和灭的时间差不多,可以设置最大的值限制为80,而不用到99了,根据实际情况设置即可。
第4章 实验现象
看上面具体内容介绍即可。
总结
定时器输出PWM功能还是比较好玩的,能弄懂这个功能的使用,可以应用到很多的场景了,可以控制输出固定的电压,STM32的IO最大输出是3.3v的,按照前面的例子来等分就可以得到相应的电压值了。呼吸灯的效果也很有意思,类似手机的消息提示了。