STM32定时器功能如下

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

输出比较模式是将计数器CNT的值和捕获比较寄存器CCR的对比,当CNT值等于CCR的值时,翻转输出电平。

通过捕获比较寄存器CCMR模式设置位的描述可以看出,输出比较模式只有当 CCR = CNT时,输出电平才会翻转。而PWM模式下 CNT < CCR 时输出一个电平,CNT > CCR时输出相反的电平。

通过一个示意图来看看PWM输出模式

上图中是PWM输出的示意图,可以看出CNT的值从变化范围是 0---ARR,之间,CNT的值在CCR值左边时输出一个电平,CNT值在CCR右边时,输出相反电平。这样改变CCR值就可以改变输出PWM的占空比。

下面在看看输出比较模式

输出比较模式下不关心CNT比 CCR值大还是小,只关心CNT和CCR值什么时候相等,两个值相等时,就翻转输出电平。在PWM模式下,CNT值从0增加到ARR一个周期内输出电平有两次变化,而在输出比较模式下时CNT值从0增加到ARR一个周期内输出电平只有一次变化。所以输出比较模式下,定时器输出方波的频率为PWM模式下定时器输出方波频率的一半。

下面就看看代码如何实现

// arr 自动装载值  psc 分频系数
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时钟  36M RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE ); //使能GPIOC时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | 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 比较 模式  输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init( TIM3, &TIM_OCInitStructure );TIM_OC2Init( TIM3, &TIM_OCInitStructure );TIM_OC3Init( TIM3, &TIM_OCInitStructure );TIM_OC4Init( TIM3, &TIM_OCInitStructure );TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable );TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable );TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );//使能TIM3TIM_Cmd( TIM3, ENABLE );
}

这里用的是定时器3,定时器3的4个通道全部设置为输出比较模式。

定时器初始化代码,输出比较模式设置方法和PWM模式设置方法只有模式设置这一行代码不同。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

将输出模式由TIM_OCMode_PWM1 改为  TIM_OCMode_Toggle 就可以了。

下面看主函数代码

#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 决定输出 的高电平时长//比较翻转模式,一个周期只翻转一次,所以频率为 1/2TIM3_CMP_Init( 1000 - 1, 36 - 1 );            //1KTIM_SetCompare1( TIM3, 0 );TIM_SetCompare2( TIM3, 200 );TIM_SetCompare3( TIM3, 400 );TIM_SetCompare4( TIM3, 600 );while( 1 ){delay_ms( 200 );LED0 = !LED0;}
}

定时器3时钟为72MHz,36分频后为2MHz,自动装载值为1000-1,输出频率为 2M / 1000 = 2KHz。输出比较模式的频率要在减一半,所以输出方波信号频率为 2K / 2 = 1KHz.

下来分别设置4个通道输出的初始相位,通道1相位设置为0,通道2延迟1/5周期,通道3延迟2/5周期,通道4延迟3/5周期。

4个通道的输出频率都是1KHz,周期为1000us。

通过输出波形可以看出来,起始相位依次滞后,通道1为0起点的话,通道2滞后100us,通道3滞后200us,通道4滞后300us。

上面计算的通道2滞后1/5周期,周期为1000us,1/5周期应该为200us,实际测出来为100us,说明相位计算的理论值也要减半。

这样利用定时器输出比较模式,通过设置改变定时器CCR寄存器的值,就可以控制输出方波的起始相位了。

STM32F103单片机输出相位可调PWM波相关推荐

  1. 利用STM32F103单片机输出SPWM波

    最近需要用到单片机输出SPWM波功能,在网上找了好多资料,发现都不完整,有算法的没有代码,有代码的看不懂算法.于是只好自己摸索,现将方法整理如下. 关于什么是SPWM波,为什么要用SPWM波,网上的介 ...

  2. STM32F103输出多路死区互补PWM波

    TIM1,TIM8可以产生死区互补PWM波,学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考.Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定 ...

  3. 利用stm32高级定时器的重复计数实现输出精确个数的pwm波

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 利用该配置完成输出精确数量的PWM波形,但是该值取值范围是[0, 255], 如果需要大于该数值的pw ...

  4. STM32 - CubeMX 的使用实例详细(04.1)- STM32F103的 - 定时器设定详细解释 - PWM波的产生 - 频率占空比的设定 - 软件代码分析

    前言:本文详细条例STM32 103定时器的设定 1 定时器简介 中等容量的STM32F103xx增强型系列产品包含1个高级控制定时器.3个普通定时器,以及2个看门 狗定时器和1个系统嘀嗒定时器. 下 ...

  5. c语言写51单片机可调pwm,AT89C52单片机输出可调PWM波的方法设计

    PWM 是"脉冲宽度调制"的意思. PWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的:而其高电平.低电平所占用的时间,是可以受控调整的. 高电平.低电平所占 ...

  6. 【蓝桥杯单片机(14)】PWM波实现呼吸灯

    PWM:Pulse-Width Modulation的缩写,中文意思为脉冲宽度调制,它是一种占空比可控制的脉冲波形 占空比:一个完整的脉冲周期,是由高电平和低电平组成的,而占空比表示在一个脉冲周期里, ...

  7. MSP432库函数输出多路任意占空比PWM波

    一.在电赛开始的前一天中午,突然得知2021电赛电赛推迟至8月11号至14号,现在晚上又通知变成了择期,比赛时间遥遥无期 既然如此那就再继续拼搏吧,顺便也分享一下备赛以来对msp432的学习 二.前情 ...

  8. STM32F103输出互补PWM波

    STM32F103单片机定时器自带互补PWM波形输出功能,利用定时器输出比较模式,不仅可以输出互补的 PWM波,还可以设置输出方波的起始相位和死区时间. 下面就总结一下如何实现PWM互补输出. voi ...

  9. STM32F103 PA8不能输出PWM波问题

    在调试STM32F103单片机输出PWM波时,单独测试PA8和PA11输出PWM波(也就是TIM1_CH1和TIM1_CH4),输出PWM波正常.然后用串口1输出数据时,发现一个问题,串口输出正常,但 ...

最新文章

  1. 11/1787, 哈工大小学妹的比赛上分经验,附战友招募
  2. SP4062电路接口芯片保护IC
  3. 制作一本《First Love, Last Rites》之二
  4. [iptables]Redhat 7.2下使用iptables实现NAT
  5. pyqt入门教程(一)
  6. tensorflow综合示例7:LeNet-5实现mnist识别
  7. 51nod-1640--天气晴朗的魔法(简单最小生成树)
  8. mysql主从复制读写分离
  9. 实现前后端分离的心得
  10. 回溯法和树的先序遍历
  11. 阶段3 2.Spring_08.面向切面编程 AOP_1 AOP的概念
  12. log函数 oracle power_Oracle 函数大全详细介绍
  13. 脑电EEG代码开源分享 【5.特征选择】
  14. 华为手机热点无法连接_华为手机热点无法连接
  15. 四川眉山中院宣判两起特大跨国电信诈骗案
  16. C++词法记号规则之标识符 关键字 操作符 分隔符 空白符
  17. Arduino Timer
  18. 三元一次方程组例题_三元一次方程组典型例题讲解.doc
  19. 加密芯片ATSHA204之使用
  20. IT真的不如卖爆米花的?

热门文章

  1. Codeforces Round #219 (Div. 2) 解题报告
  2. Windows rundll32的用法-批处理管理打印机
  3. kvm启动报错Could not access KVM kernel module: Permission denied
  4. 安装Harbor1.4.0开源docker镜像仓库(含letsencrypt证书)
  5. python split()函数
  6. FMS3 参数设定档修改
  7. 有效的括号——字符串匹配问题
  8. MySql 时间戳存char还是存int?
  9. 验证时间php,php中时间日期验证函数
  10. stata基本操作(二)