STM32 输出方波的方法有两种比较类似的,一个是PWM模式,一个是输出比较模式。下面来看看这两种模式的不同处在哪。

先看看官方对两种模式的介绍

PWM模式:

输出比较模式

通过两种模式的介绍,好像不能直观的看出来具体差别在哪,再看看两种模式设置时寄存器里面的介绍。

通过CCMR寄存器中的OCM位可以看出来这两种模式的一点区别。

输出比较模式下: CCR = CNT 时,翻转输出电平。

PWM模式下:   CNT < CCR时输出一种电平,CNT > CCR时输出相反的电平。

通过图片来直观的看看这两种模式的区别。

PWM模式下: ARR 决定输出频率 ,CCR决定输出占空比。

输出比较模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位。

两种模式下最主要的差别就是CCR值代表的含义不一样。PWM模式下CCR可以控制占空比。输出比较模式下CCR可以控制初始相位。

下面通过一个程序来对比一下这两种模式

#include "pwm.h"void TIM3_PWM_Init( u16 arr, u16 psc )
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );                         //使能定时器3时钟RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );   //使能GPIO和AFIO复用功能模块时钟//设置TIM3 CH3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOB, &GPIO_InitStructure );//初始化TIM3TIM_TimeBaseInitStructure.TIM_Period = arr;TIM_TimeBaseInitStructure.TIM_Prescaler = psc;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );//初始化TIM3_CH3  PWM 模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC3Init( TIM3, &TIM_OCInitStructure );//使能TIM3在CCR2上的预装载寄存器TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );//使能TIM3TIM_Cmd( TIM3, ENABLE );
}void TIM3_CMP_Init( u16 arr, u16 psc )
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); //使能定时器3时钟  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );    //使能GPIOC时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化TIM3TIM_TimeBaseInitStructure.TIM_Period = arr;TIM_TimeBaseInitStructure.TIM_Prescaler = psc;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );//初始化TIM3_CH4 比较 模式  输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC4Init( TIM3, &TIM_OCInitStructure );TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );//使能TIM3TIM_Cmd( TIM3, ENABLE );
}

将定时器3通道3设置为PWM输出模式,定时器3通道4设置为输出比较模式。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
// LED0  PA8  LED1 PD2
int main(void)
{u16 led_pwm_val=0;u8 dir=1;delay_init();       //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LED_Init();  LED0 = 1;LED1 = 1;delay_ms(500);LED0 = 0;LED1 = 0;//比较输出模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位//PWM模式:        ARR 决定输出频率  CCRx 决定输出 的高电平时长TIM3_PWM_Init(1000-1,72-1); //比较翻转模式,一个周期只翻转一次,所以频率为 1/2 TIM3_CMP_Init(1000-1,71-1);  TIM_SetCompare3(TIM3,100);      //PWM 模式TIM_SetCompare4(TIM3,100);      //比较输出模式while(1){delay_ms(200);LED0 = !LED0;           }
}

主函数中分别初始化两种模式,然后设置CCR值为相同值,看看输出波形的区别。

蓝色波形为 PWM模式输出的波形,粉色为输出比较模式输出的波形。可以看到同样的设置参数,PWM输出方波频率为1KHz,输出比较输出的方波为500Hz,说明输出比较模式的频率为PWM模式频率的1/2。

PWM输出波形的高电平为100us,周期为1000us,占空比为10%,和主函数中设置的一样。

输出比较模式输出的波形起始相位滞后于PWM波形100us,滞后相位差为PWM波形的10%,滞后相位差为本身输出波形的20%。

输出比较模式的占空比为50%,是固定的不能修改占空比。

通过上面实验可以看到,这两种模式的主要差别是。

PWM模式: ARR设置频率,CCR设置占空比,频率和占空比可以任意设置,起始相位不能设置。

输出比较模式:ARR设置频率,CCR设置相位,频率和起始相位可以任意设置,占空比不能设置。输出频率为理论计算值一半。

STM32输出比较模式和PWM模式 比较相关推荐

  1. STM32输出互补死区刹车PWM

    互补死区刹车原理这里不详述 互补理解为相反的信号 死区简单理解为信号跳变的缓冲时间 刹车简单理解为暂停信号输出,既然是暂停意味着放开后会再次启动 代码分享 #include "Advance ...

  2. 【STM32】通用定时器的PWM输出(实例:PWM输出)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第14章  通用定时器 通用定时器PWM概述 STM32定时器输出通道引脚 这里以TIM3为例来讲解.STM32的通用定时器 ...

  3. HAL库教程10:定时器的PWM模式应用

      本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐.本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴 无源蜂鸣器驱动电路   蜂鸣器按照有无震荡源(不是电源),可以分为 ...

  4. 【STM32】HAL库——定时器PWM输出

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

  5. STM32F103单片机输出相位可调PWM波

    STM32定时器功能如下 通常使用的是PWM模式,可以通过PWM功能可以生成频率和占空比可调的方波信号,有时候需要生成初始相位可调的方波,PWM功能就就不能满足要求了.可以通过输出比较模式来实现. 输 ...

  6. 【转】STM32 定时器 输出比较模式和PWM输出模式的区别

    最近在做电机控制 ,看到一篇好总结!! 比较输出模式 这个模式的特点是4个通道的输出周期频率是一样的.. 频率周期由 预装载寄存器 ARR 的大小确定. Cubmx中叫Counter Period - ...

  7. STM32 - 定时器的设定 - 基础-04 - 输出波形控制 - PWM 模式

    PWM为诸多应用的基本波形,如何实现和如何定制,首先要了解STM32中PWM的实现方法. 在STM32中,PWM的实现主要通过控制 OCxRef (active high).:output compa ...

  8. 5. avr定时器/计数器1 --TC1 --快速PWM输出 (比较输出--快速PWM模式)

    快速PWM 模式(WGM13:0 = 5.6. 7.14 或15) 可用来产生高频的PWM 波形.快速PWM模式与其他PWM模式的不同之处是其单边斜坡工作方式.计数器从BOTTOM计到TOP,然后立即 ...

  9. 四轴无人机那些事 番外篇 4 关于PWM模式的理解

    前言: 之前做无人机的时候和pwm是经常打交道,不过最近这一年多由于"转行"已经很久不接触了,但是还是会在论坛默默潜水,发现好的资料也还是会仔细阅读,今天就分享一篇关于pwm的文章 ...

最新文章

  1. Deeplearning:windows多版本cuda安装、管理
  2. RabbitMQ的消息确认ACK机制
  3. 计算机专业的三行情书,各专业三行情书,看懂你就是全能学霸!
  4. 诺基亚正式收购阿朗:物联网时代再出发
  5. php 长剑设计模式,PHP设计模式(创建型)
  6. easyui的因为url名和视图名相同出现上面的异常。
  7. sklearn训练模型、保存模型文件(文本、pkl)、模型文件转换(pkl2onnx)以及模型可视化
  8. 贪吃蛇程序 php,PHP下利用PHPMailer Web程序【tofacebook.com】 - 贪吃蛇
  9. Excel VBA编程
  10. 文件加密系统,随时保护终端数据安全
  11. CDA Day1-3 Excel公式常用函数跟课学习
  12. SSRF利用 Gopher 协议拓展攻击面
  13. Docker 安装最新版禅道16.5版本 原创
  14. Java 语言中的实例初始化块 ( IIB) 详解
  15. 本周总结 卡迈克尔数,缩系与剩余系的重排与构造
  16. 集成百度语音sdk到智能家居平台中
  17. java后台接收微信小程序发送的post请求参数
  18. matlab 动态邻域粒子群,求解TSP问题的动态邻域粒子群优化算法
  19. 开源一套易语言网络验证源码
  20. 一 你好啊,我叫阿丁1

热门文章

  1. ofbiz 分开默认数据库
  2. TFS报表管理器无权限访问的配置
  3. 关于×××隧道技术在使用中的优势
  4. 【简●解】POJ 1845 【Sumdiv】
  5. 《瓦尔登湖》 感想及笔记
  6. CDOJ 1805 矩阵 数学
  7. Excel 关于新建xls文件 新建sheet 合并sheet的VBA操作代码
  8. systemtap原理及使用
  9. 【常见问题】hive、Hadoop(HA)、sqoop出现的问题的总结---各种问题以及解决方案-
  10. 02-03 Python json格式转化