基于STM32的PWM驱动LED呼吸灯
一,PWM基本原理
所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比。频率,就是周期的倒数;占空比,就是高电平在一个周期内所占的比例。如当周期T=T1+T2;T1为高电平时间,T2为低电平时间,此时频率F的值为1/(T1+T2),占空比D的值为T1/(T1+T2)。通过改变单位时间内脉冲的个数可以实现调频;通过改变占空比可以实现调压。占空比越大,所得到的平均电压也就越大,幅值也就越大;占空比越小,所得到的平均电压也就越小,幅值也就越小,如动图演示所示。PWM方波的示意图如下图所示:
二,PWM基本结构及配置PWM步骤
第1步,RCC开启时钟,把我们要用的TlM外设和GPIO外设的时钟打开。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
第2步,配置时基单元,包括时钟源选择
TIM_InternalClockConfig(TIM2);//这里选用内部时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置参数
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
第3步,配置输出比较单元
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
OC就是Output Compare(输出比较)OC1,OC2,OC3,OC4,一个函数配置一个单元(输出比较通道),上面这四个函数用于设置输出PWM时用到的参数,包括选择PWM输出模式,选择输出极性,设置比较值。注意:设置输出时是按输出通道分的库函数。即需要初始化哪个通道,就调用哪个函数。不同的通道对应的GPIO口也是不一样的。
TIM_OCInitTypeDef TIM_OCInitStructure;配置参数 TIM_OCStructInit(&TIM_OCInitStructure);//用来给输出比较结构体成员赋一个默认值的,下面 就可以再更改你想改的值就行了。可以避免结构体成员没有配置完整。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
第4步,配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
第五步,运行控制,启动计数器,这样就能输出PWM了。
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
这四个函数是用来单独更改CCR寄存器值的函数,可以运行的时候,更改占空比。TIM_Cmd(TIM2, ENABLE);
TIM_SetCompare1(TIM2, Compare1);
第6步,主程序
while(1)
{
for (uint8_t i = 0; i < 100; i ++)
{
PWM_SetCompare1(i);
delay_ms(10);
}
for (uint8_t i = 0; i < 100; i ++)
{
PWM_SetCompare1(100 - i);
delay_ms(10);
}
delay_ms(500);
}
基于STM32的PWM驱动LED呼吸灯相关推荐
- 使用STM32输出PWM波形LED呼吸灯的效果
文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...
- stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果
实验的STM32型号: STM32F103C8T6 48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...
- ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯
ESP32 Arduino开发之路(2)- 使用PWM实现LED呼吸灯 一.前言 在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示: 参考文章:在 ESP32 上使用 LEDC ...
- 【嵌入式知识12】使用PWM实现LED呼吸灯
本次实验使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果 ...
- GD32F303的PWM实现LED呼吸灯的方法
GD32F303的PWM实现LED呼吸灯的方法 首先配置TIMER1,定义初始化结构体变量 static void ConfigTIMER1ForPWMPB10(unsigned short arr, ...
- 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯
小熊派gd32f303学习之旅(7)-使用PWM实现LED呼吸灯 一.前言 通过查看gd32f30x的参考手册,可以知道gd32f303的通用定时器和高级定时器可以硬件生成PWM波,然后我们查看gd3 ...
- 使用STM32输出PWM波形并驱动LED呼吸灯
目录 前言 一.PWM 二.工程代码 1.用STM32CubeMx创建工程 创建新项目 配置RCC和SYS 配置定时器TIME3 配置定时器TIM4 配置时钟 生成项目 2.用Keil编写代码 3.硬 ...
- 利用PWM实现LED呼吸灯
一.实验目的 本实验使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LE ...
- STM32实现定时器和LED呼吸灯
目录 一.实现定时器 1.定时器的介绍 1.1定时器的概念及作用 1.2定时器的分类 2.新建项目 2.1新建 2.2选择STM32F103C8T6芯片 2.3配置SYS 2.4配置RCC 2.5配置 ...
最新文章
- oracle 新增自增字段,SQL server、Oracle中拿到新增列时的自增字段值
- 加载XML 添加删除节点
- Makefile注意点总结
- java for(o t :object) 获取顺序号_java中线程的生命周期
- UVa --10566
- [css] 你用过outline属性吗?它有什么运用场景
- c++获取图像的长宽 opencv_【第一篇:C++与opencv】图片的读取和显示 | 学步园
- 区块连教程(一):前置知识-linux补充
- html5shiv主要解决IE6-8 无法识别HTML5的新标签,父节点不能包裹子元素,以及应用CSS样式...
- ubuntu中关闭防火墙
- css 精灵图的使用
- HTTPS 证书生成原理和部署细节
- qemu前后端features协商过程分析(vhost_user后端)
- centos solr4.5 tomcat 简单安装[已测试ok]
- 基于阿里云服务器使用宝塔面板进行Hexo建站
- 百度统计的使用技巧_SEO建议
- 20175212童皓桢 实验五 网络编程与安全
- AD fanout 各选项说明
- Servlet本身的init,service,destory生命周期方法
- VMware-WorkStation 序列号(转)