一,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呼吸灯相关推荐

  1. 使用STM32输出PWM波形LED呼吸灯的效果

    文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...

  2. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果

    实验的STM32型号: STM32F103C8T6   48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...

  3. ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

    ESP32 Arduino开发之路(2)- 使用PWM实现LED呼吸灯 一.前言 在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示: 参考文章:在 ESP32 上使用 LEDC ...

  4. 【嵌入式知识12】使用PWM实现LED呼吸灯

    本次实验使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果 ...

  5. GD32F303的PWM实现LED呼吸灯的方法

    GD32F303的PWM实现LED呼吸灯的方法 首先配置TIMER1,定义初始化结构体变量 static void ConfigTIMER1ForPWMPB10(unsigned short arr, ...

  6. 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯

    小熊派gd32f303学习之旅(7)-使用PWM实现LED呼吸灯 一.前言 通过查看gd32f30x的参考手册,可以知道gd32f303的通用定时器和高级定时器可以硬件生成PWM波,然后我们查看gd3 ...

  7. 使用STM32输出PWM波形并驱动LED呼吸灯

    目录 前言 一.PWM 二.工程代码 1.用STM32CubeMx创建工程 创建新项目 配置RCC和SYS 配置定时器TIME3 配置定时器TIM4 配置时钟 生成项目 2.用Keil编写代码 3.硬 ...

  8. 利用PWM实现LED呼吸灯

    一.实验目的 本实验使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LE ...

  9. STM32实现定时器和LED呼吸灯

    目录 一.实现定时器 1.定时器的介绍 1.1定时器的概念及作用 1.2定时器的分类 2.新建项目 2.1新建 2.2选择STM32F103C8T6芯片 2.3配置SYS 2.4配置RCC 2.5配置 ...

最新文章

  1. oracle 新增自增字段,SQL server、Oracle中拿到新增列时的自增字段值
  2. 加载XML 添加删除节点
  3. Makefile注意点总结
  4. java for(o t :object) 获取顺序号_java中线程的生命周期
  5. UVa --10566
  6. [css] 你用过outline属性吗?它有什么运用场景
  7. c++获取图像的长宽 opencv_【第一篇:C++与opencv】图片的读取和显示 | 学步园
  8. 区块连教程(一):前置知识-linux补充
  9. html5shiv主要解决IE6-8 无法识别HTML5的新标签,父节点不能包裹子元素,以及应用CSS样式...
  10. ubuntu中关闭防火墙
  11. css 精灵图的使用
  12. HTTPS 证书生成原理和部署细节
  13. qemu前后端features协商过程分析(vhost_user后端)
  14. centos solr4.5 tomcat 简单安装[已测试ok]
  15. 基于阿里云服务器使用宝塔面板进行Hexo建站
  16. 百度统计的使用技巧_SEO建议
  17. 20175212童皓桢 实验五 网络编程与安全
  18. AD fanout 各选项说明
  19. Servlet本身的init,service,destory生命周期方法
  20. VMware-WorkStation 序列号(转)

热门文章

  1. 年报 | 公众号2020年文章汇总
  2. c语言图书馆管理系统(功能众多)
  3. 设计模式(五) —— 行为型模式(中)
  4. Crackme 28
  5. 阿里巴巴CEO马云演讲
  6. OC 获取手机运营商信息
  7. csdn程序竞赛第六期-python题解
  8. 关于 海康威视 摄像头的整理
  9. matlab 矩阵维度受限,matlab中变量问题——readonly 索引超出矩阵维度 workspacefunc 215...
  10. python数据挖掘建模实战_#Python3组数据挖掘实战总结#