1.PWM概念

PWM叫脉冲宽度调制(Pulse Width Modulation),通过编程控制输出方波的频率和占空比(高低电平的比例),广泛应用在测量,通信,功率控制等领域(呼吸灯,电机)。

PWM由定时器驱动,PWM周期就是定时器的周期,为了调节占空比,需要在定时器的基础上加上一个比较计数器,同时需要GPIO输出波形。

——————————————————————————————————————————

2.stm32中的PWM

stm32中的PWM属于定时器功能,通过配置定时器就可以使用PWM,除了定时器的基本配置以外,还要加入一个比较计数值确定翻转电平的时机,还需要GPIO的复用功能输出PWM。

stm32中PWM高低电平的顺序是由极性,PWM模式和计数模式共同决定。极性决定默认电平(有效电平),PWM模式指的是一个周期内有效电平和无效电平的顺序。

—————————————————————————————————————————

3.使用库函数实现PWM配置D1为呼吸灯

(1)开启时钟

GPIOF时钟 TIM14时钟,函数略

(2)初始化GPIO为复用功能

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(...);  函数略

(3)将定时器14通道1的复用功能映射到PF9

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); 参数:     GPIOx - 哪一组GPIO

GPIO_PinSource - 哪个GPIO引脚

GPIO_AF - 哪个复用功能(只能映射具有的复用功能)

(4)初始化定时器

TIM_TimeBaseInit(......); 函数略

(5)初始化PWM

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

参数:     TIMx - 哪个定时器

TIM_OCInitStruct - 初始化结构      t

ypedef struct {

uint16_t TIM_OCMode;        /*!< PWM模式 @ref TIM_Output_Compare_and_PWM_modes */   uint16_t TIM_OutputState;   /*!< 输出状态使能 @ref TIM_Output_Compare_State */   uint16_t TIM_OutputNState;  /*!< 忽略 only for TIM1 and TIM8. */

uint32_t TIM_Pulse;         /*!< 比较计数值 0x0000 and 0xFFFF */

uint16_t TIM_OCPolarity;    /*!< 极性 @ref TIM_Output_Compare_Polarity */   uint16_t TIM_OCNPolarity;   /*!< 忽略 only for TIM1 and TIM8. */   uint16_t TIM_OCIdleState;   /*!< 忽略 only for TIM1 and TIM8. */   uint16_t TIM_OCNIdleState;  /*!< 忽略 only for TIM1 and TIM8. */ } TIM_OCInitTypeDef;

(6)使能PWM的预装载和重装载功能

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM14, ENABLE);

(7)启动定时器

TIM_Cmd(...); //高级定时器(TIM1/TIM8),还需要开启另一个开关 void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

参数:     TIMx - 哪个定时器

NewState - ENABLE/DISABLE

(8)运行时可调节占空比

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1); 参数:     TIMx - 哪个定时器     Compare1 - 新的比较值

__________________________________________________________________________________________________________________________________________________________

使用库函数配置GPIOF,TIM14,使得D1灯呼吸闪烁,代码实现如下:

pwm.c

#include <stm32f4xx.h>
#include <pwm.h>void timer14_pwm_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;//1.开启GPIOF和TIM14时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//2.初始化PF9为复用功能GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//高速GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//PF9GPIO_Init(GPIOF,&GPIO_InitStruct);//3.将PF9复用映射到TIM14GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//4.初始化定时器14 84M / 84 = 1MHz 1M ------ 1000 ----- 1msTIM_TimeBaseInitStruct.TIM_Prescaler = 84-1;//预分频系数TIM_TimeBaseInitStruct.TIM_Period = 1000-1;//初始计数值TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;//向下计数TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟因子TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);//5.PWM初始化TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;//低电平有效TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//使能TIM_OCInitStruct.TIM_Pulse = 800;//比较计数值TIM_OC1Init(TIM14,&TIM_OCInitStruct);//6.使能PWM的预装载和重装载功能TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM14, ENABLE);//7.使能定时器14TIM_Cmd(TIM14,ENABLE);
}

pwm.h

#ifndef _KEY_H_
#define _KEY_H_#define S1 PAin(0)
#define S2 PEin(2)
#define S3 PEin(3)
#define S4 PEin(4)void key_init(void);#endif

主函数main.c

#include <stm32f4xx.h>
#include <includes.h>int main()
{   u32 comp = 0;//1.中断优先级分组 2:2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//初始化//led_init();//key_init();beep_init();exti_init();mq2_init();delay_init();//timer2_init();//timer10_init();timer14_pwm_init();//D1为呼吸灯while(1){//1s从最暗到最亮while(comp<1000){TIM_SetCompare1(TIM14,comp);comp++;delay_ms(1);}//1s从最亮到最暗while(comp>0){TIM_SetCompare1(TIM14,comp);comp--;delay_ms(1);}delay_ms(200);}}

练习:

使用TIM1的通道4控制D4作为呼吸灯

TIM1是高级定时器 通道4

第六篇,STM32脉冲宽度调制(PWM)编程相关推荐

  1. STM32F103C8T6脉冲宽度调制(PWM)

    关于STM32F103C8T6工程文件自己免积分下载https://download.csdn.net/download/weixin_45488643/12522971这个仅仅是一个核心工程文件,只 ...

  2. CPS攻击案例(一)——基于脉冲宽度调制PWM的无人机攻击

    本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 原论文链接:sec22-dayanikli.pdf ( ...

  3. 脉冲宽度调制PWM的原理及应用

    目录 一.什么是PWM信号 二.PWM信号是如何产生的 三.PWM有什么优点? 四.PWM的应用 一.什么是PWM信号 PWM,英文全称Pulse Width Modulation,是脉冲宽度调制的缩 ...

  4. STM32的脉冲宽度调制(PWM)

    文章目录 32的PWM资源 PWM输出原理 PWM相关寄存器 捕获/比较模式寄存器(TIMx_CCMR1/2) 捕获/比较使能寄存器(TIMx_CCER) 捕获/比较寄存器(TIMx_CCR1~4) ...

  5. 脉冲宽度调制pdm_脉冲宽度调制(PWM)技术原理

    二.正弦波脉宽调制 (sPwM ) 1 . sPwM 的概念 工程实际中应用最多的是正弦 PwM 法 ( 简称 sPwM) , 它是在每半 个周期内输出若干个宽窄不同的矩形脉冲波, 每一矩形波的面积近 ...

  6. 脉冲宽度调制(PWM)和DAC转换练习

    目录 一.STM32F103输出一路PWM波形 二.STM32F103的DAC功能输出 参考链接 一.STM32F103输出一路PWM波形 STM32F1除了基本定时器TIM6和TIM7,其他定时器都 ...

  7. c语言延时变频1kHz和2kHz,用C语言实现:采用中断方式,P1.0输出脉冲宽度调制(PWM)信号,即脉冲频率为2kHz,占空比为...

    满意答案 qaz8140036 2014.11.04 采纳率:42%    等级:7 已帮助:309人 /*用keil3与proteus7.4联调,自己下载后开启联调设置,在proteus中画个最小单 ...

  8. PWM脉冲宽度调制——它是什么?

    脉冲宽度调制 (PWM) 的良好定义就在名称本身.为了更好地理解 PWM 是什么,让我们首先看一些基本术语. 微控制器是基于二进制信号的智能数字元件.二进制信号的最佳表示是方波(高低电平).下图解释了 ...

  9. 脉冲宽度调制pdm_STM32第七章-脉冲宽度调制

    先说在开头啊,我们学习定时器总感觉它是很难的,这里我就不说他的编程难度,而是对于它的理解难度.学习定时器你就必须了解他的来龙去脉. 比如说你现在要使用一个定时器,那么先要决定你要用哪一个定时器,是高级 ...

最新文章

  1. nginx学习之静态内容篇(五)
  2. L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT
  3. HDU多校4 - 6988 Display Substring(后缀自动机+二分)
  4. linux u盘 uid pid,linux下的pid文件的作用
  5. 使用Google WebP图片格式帮助控制网站页面大小
  6. 特征筛选:WOE值与IV值
  7. 微信-支付宝---人脸识别认证
  8. 计算机在开机时会进行自检遇到,电脑开机自检卡住了怎么办
  9. 看漫画学焊接!5分钟教你电烙铁的焊接方法
  10. 自动反冲洗叠片过滤器
  11. android支持gif图片格式,Android 支持Gif动态图 的imagview
  12. XILINX Ultrascale/Ultrascale+ 高速收发器时钟MGTHREFCLK原语调用
  13. OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用。
  14. 对几个汇编编译器的初步评价(MASM/FASM/NASM/GOASM)
  15. python基础部分学习笔记2
  16. 动态库装载及 dlsym的RTLD_NEXT参数详解
  17. 蚂蚁金服分布式链路跟踪组件 SOFATracer 总览 | 剖析 1
  18. 工作技巧篇--职场邮箱
  19. 一对一直播源码开发基础方案全面讲解,拯救不开心
  20. qt代码实现添加按钮功能

热门文章

  1. 下载了免费的txt电子书,如何用IOS苹果手机打开?
  2. 完全卸载TeamViewer与重新安装TeamViewer 7(含单文件版V12主控端)
  3. 【经验分享】IT领域7年工作经验和建议
  4. 编写python程序按照单利方式计算理财产品收益
  5. 3.6Python之sys模块
  6. [精简]托福核心词汇112——114
  7. Apple Catching经典dp
  8. Java腾讯企业邮箱发送邮件
  9. mongo启动报错:ERROR: child process failed, exited with error number 1
  10. starrocker关联hive外表