嵌入式作业使用STM32输出PWM波形实现led流水灯

目录

前言 

一.PWM简介

MX6ULL的PWM外设

二.用STM32CubeMx创建项目 

1.项目的创建和设置

​编辑

 2.设置RCC和SYS

3.配置定时器 

4.时钟配置 

 5.GPIO端口设置

6.创建项目 

三.keil仿真调试  

1.修改工程

2.观察波形

3.烧录

4.结果 

四.总结

五.参考资料


 

前言 

软件版本: STM32CubeMX:6.61

KEIl:5.61

mcusip

硬件: STM32F103C8T6

一.PWM简介

PWM 全称是 PulseWidth Modulation,也就是脉冲宽度调制。
它有什么用呢?利用它我们可以控制灯光的亮度、电机的转速、屏幕背光亮度等等。
假如一个IO高电平可以点亮一盏led灯,那么此时的亮度是最亮,当输出低电平时led熄灭。如果不停的开关led灯,那么只要速度足够快,我们人眼就无法发现led灭了,但是可以发现亮度改变。利用这种原理我们就可以控制屏幕背光的亮度。

PWM的两个关键术语:频率和占空比。
频率: 就是开关的速度,在一秒内可以开关多少次。把一次开关叫做一个周期。
占空比: 在一个周期内高电平所占的比例。一个周期内高电平的时间越长占空比就越大,对于高电平点亮的灯来说,占空比越大,灯也就越亮。占空比是相对于周期的。

嵌入式作业使用STM32输出PWM波形实现led流水灯_第1张图片
一个周期内高电平时间=周期*占空比。

 

MX6ULL的PWM外设

嵌入式作业使用STM32输出PWM波形实现led流水灯_第2张图片
PWM外设实际上和计时器很相似,拥有计数功能(记时),中断功能等。
如上图I.MX6ULL的PWM外设可选择3路时钟源、一个12位的分频器、16位的向上计数器、16位的周期寄存器、16位的采样寄存器,4个FIFO,比较中断和FIFO空中断。

16位计数器: 按一定的频率计数从0x0000开始向上计数。
16位周期寄存器: 存储着一个数值x,当计数器大于x+1时就会滚回0x0000,所以从0数到x+1的时间就是一个周期的时间。
16位采样寄存器: 存储着占空值y,控制占空比。I.MX6ULL的PWM默认输出高电平,当计数等于y+1时就会输出低电平,直到新的一个周期开始输出高电平,也就是计数值>x+1时。

I.MX6UUU的PWM外设拥有4个FIFO,对采样计数器写数据其实就是对FIFO写数据,每次计数器比较的时候读一次FIFO的数据就会空,可以设置多少个FIFO空的时候触发FIFO空中断,再中断函数中对FIFO写数据,这样就一直有数据啦。

通过上面两个寄存器就可以设置I.MX6ULL的占空比和频率,但并不是这么简单就可以使用,还要对pwm做一些初始化,这里忽略,只讲简单的原理。
 

二.用STM32CubeMx创建项目 

1.项目的创建和设置

嵌入式作业使用STM32输出PWM波形实现led流水灯_第3张图片

 2.设置RCC和SYS

嵌入式作业使用STM32输出PWM波形实现led流水灯_第4张图片

 嵌入式作业使用STM32输出PWM波形实现led流水灯_第5张图片

3.配置定时器 

配置定时器3。选中定时器3;位置2选择时钟源为“Internal Clock”,通道2选择“PWM Generation CH2”

嵌入式作业使用STM32输出PWM波形实现led流水灯_第6张图片

再来一次 ,配置定时器4。选中定时器4;位置2选择时钟源为“Internal Clock”,通道2选择“PWM Generation CH2”

嵌入式作业使用STM32输出PWM波形实现led流水灯_第7张图片

 

4.时钟配置 

嵌入式作业使用STM32输出PWM波形实现led流水灯_第8张图片

 5.GPIO端口设置

嵌入式作业使用STM32输出PWM波形实现led流水灯_第9张图片

6.创建项目 

嵌入式作业使用STM32输出PWM波形实现led流水灯_第10张图片

三.keil仿真调试  

1.修改工程

定义一个变量,用来存储占空比,初值设为10.

uint16_t duty_num = 10;

开始TIM3和TIM4的通道2,输出PWM 

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);

嵌入式作业使用STM32输出PWM波形实现led流水灯_第11张图片 

 

每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0.

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(50);
		duty_num = duty_num + 10;
		if(duty_num > 500)
		{
			duty_num = 0;
		}
		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty_num);
		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,duty_num);
  }
  /* USER CODE END 3 */
}

 嵌入式作业使用STM32输出PWM波形实现led流水灯_第12张图片

修改后,保存,编译 

2.观察波形

嵌入式作业使用STM32输出PWM波形实现led流水灯_第13张图片

打开Keil自带的示波器

嵌入式作业使用STM32输出PWM波形实现led流水灯_第14张图片PWM波形 

 嵌入式作业使用STM32输出PWM波形实现led流水灯_第15张图片

3.烧录

嵌入式作业使用STM32输出PWM波形实现led流水灯_第16张图片

4.结果 

嵌入式作业使用STM32输出PWM波形实现led流水灯_第17张图片

四.总结

通过这次实验,我对于PWM产生原理和配置方法以及使用领域有了更加深刻的了解和认识,我更喜欢用STM32CubeMx来实现实验,但是网上关于STM32CubeMx实现的资料实在很少,所以我在此之上做了很多改变

五.参考资料

STM32CUBEMX_基于PWM的呼吸灯 | MCU起航 (mcublog.cn)

你可能感兴趣的:(stm32,单片机,arm)