STM32之关于通用定时器的输出比较方式

发布者:brian808090最新更新时间:2017-10-25 来源: eefocus关键字:STM32  通用定时器  比较方式 手机看文章 扫描二维码
随时随地手机看文章

1.简单介绍

对于STM32中通用定时器的应用,定时器可以测量输入信号的脉冲长度(输入采集)或者产生输出波形(输出比较和PWM)。

如果小伙伴对于STM32的PWM不满意,因为相位无法控制,只能改变占空比。所以如果想改变PWM的相位的话,我们就可以用到输出比较方式了。

2.知识的架构

1)输出比较:打开一个TIMx计数器,再打开TIMx的一路或几路输出比较器(共4路),都配置好以后,计数器开始计数,当计数器里的值和比较寄存器里的值相等时,产生输出比较中断,在中断中将计数器中的值读出,与翻转周期相加再写道比较寄存器中,使得和下一个事件有相同的翻转周期。

大致意思为打开计数器后,计数值不断增加,到增加到比较寄存器的值时,电平翻转,也会产生比较中断,在比较中断中在把计数器的值读出与周期相加,一并写入比较寄存器,使得有相同的翻转周期。

但是初始值可以自己设置,换句话说,相位可以自己定。

2)举例说明:例如TIM时钟频率设置为12MHZ,输出比较寄存器中的自装载值为600(高电平或低电平计数值),则输出的PWM频率为

                   frequency = 12MHZ/(600*2)=10KHZ。

3.实例代码

1)TIM计数器和输出比较器的配置

void TIM_Configuration(void)

 

{

 

  TIM_TimeBaseStructure.TIM_Period = 65535;         //这里必须是65535   这里我也不太懂

  TIM_TimeBaseStructure.TIM_Prescaler = 2;            //3分频

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;      //

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式

 

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);          //初始化TIM3

//输出外设的设置

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;    //输出比较翻转模式

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //使能通道1

 

  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;                       //待装入输出比较寄存器中的脉冲值,初始值

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);        //写入配置

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);          //使能或者失能TIMx在CCR1上的预装载寄存器

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;                           //初始值

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

  TIM_Cmd(TIM3, ENABLE);//开启计数器

  TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 , ENABLE);//TIM3中断源设置,开启相应通道的捕捉比较中断

}

 2)时钟配置

3)GPIO配置

4)中断服务程序

void TIM3_IRQHandler(void){

if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)               //检查指定的TIM中断发生与否

  {

    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );               //清除TIMx的中断待处理位

    capture = TIM_GetCapture1(TIM3);                            //获得输入捕获值,即计数器中的计数值

    TIM_SetCompare1(TIM3, capture + period1 );        //将计数值加上翻转的脉冲值写入输出比较寄存器中,以保证下一个TIM事件也是相同的脉冲数 period1为周期值

 

  }

if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)

  {

    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

    capture = TIM_GetCapture2(TIM3);

    TIM_SetCompare2(TIM3, capture +period2);  //period2为周期值


  }

}


关键字:STM32  通用定时器  比较方式 引用地址:STM32之关于通用定时器的输出比较方式

上一篇:STM32输出比较模式和PWM模式
下一篇:STM32串口使用总结

推荐阅读最新更新时间:2024-03-16 15:41

STM32 GPIO输出高低电平转换速率测试
最近对STM32 GPIO的输出端高低电平变化速率产生兴趣,于是用我所知道的控制GPIO的不同方法做了测试。 单片机CPU:STM32F103ZET6 软件平台:kEIL MDK 逻辑分析仪:金沙滩 LA2016 从图中看出,最快的是 GPIOA - ODR = 0x1; GPIOA - ODR = 0x0; 和 PA0 = 0x01;PA0 = 0x00; 和 GPIOA - BSRR = 0x01; GPIOA - BRR = 0x01; 转换周期是220ns,4.55Mhz 最慢的是 *PAO0 = !*PAO0 ; 和 PA0 =!PA0; 取反操作浪费不少
[单片机]
<font color='red'>STM32</font> GPIO输出高低电平转换速率测试
STM32-(20):I2C通信(实验:读写EEPROM)
硬件电路连接 底板上的 I2C 接口 A0、A1是用来确定器件的地址的。 排针上的引脚图: 核心板上的引脚图: 通过I2C总线实现对EEPROM的读写操作的准备工作: 1、掌握芯片(目标对象)特性,才能对其正确的读和写。 2、掌握 I2C 通信,读写过程需要用到。 3、Cortex的一些操作,编程方法。 实验内容:通过I2C总线实现对EEPROM的读写操作 main.c #include stm32f10x_lib.h #include IIC.h /*------------函数的声明---------------*/ void Delay_MS(u16 dly); void RCC_Configurati
[单片机]
STM32-(20):I2C通信(实验:读写EEPROM)
STM32 | STM32如何收发float类型数据?
实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: union float_data { float f_data; uint8_t byte ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: union float_data rx_float_data, tx_float_data; 收发相关代码: 左右滑动查看全部代码 if(HAL_UART_Receive(&huart3, rx_float_
[单片机]
<font color='red'>STM32</font> | <font color='red'>STM32</font>如何收发float类型数据?
STM32一个定时器输出不同频率
1个定时器输出4路频率相同,占空比不同的PWM比较容易实现,只需要改变每个通道的比较值就可以了 要想输出频率不同,占空比相同,需要用到比较模式,当比较成功IO翻转。 同时还需要用到定时器中断去重新设置比较值。 稍微解释下面语句: Period是计数值 prescaler是对总线时钟的分频 这个函数是设置比较值 基本要点是理解上面这些。没接触过定时器的会比较抽象,不能理解。 下面直接上代码吧 定时器初始化: u16 capture = 0; vu16 CCR1_Val = 32768; vu16 CCR2_Val = 16384; vu16 CCR3_Val = 8192; vu16 CCR4
[单片机]
<font color='red'>STM32</font>一个<font color='red'>定时器</font>输出不同频率
stm32入门系列程序
折腾了两三天,程序终于下载到了stm32的开发办上面去了。 一开始是因为没有设置正确,同时可能是因为自己使用的MDK和j link驱动的版本太低,所以用MDK下载不进去。 后来将软件更新,采用新的版本,下载进去后却发现好像并没有运行。 原来,每次下载完必须重新启动一下开发板才可以。 为了明白这些道理又浪费了我好几天的时间。总之,还是独自一个人在黑暗中摸索。 废话少说,代码如下: 流水灯 /******************************************************************************* * File Name : main.c * Auth
[单片机]
基于STM32单片机光学指纹识别模块
1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 光学指纹识别模块(FPM10A)淘宝网址是: http://item.taobao.com/item.htm?id=5380075198 2.购买指纹模块,可以获得三份资料 1.简要使用说明 2.使用指纹模块的功能函数 3.FPM10A用户手册. 3.硬件搭建 根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。 FPM10A光学指纹模块共有5个管脚 1 为
[单片机]
基于<font color='red'>STM32</font>单片机光学指纹识别模块
STM32 CRC寄存器
1、CRC计算公式 所有的STM32芯片都内置了一个硬件的CRC计算模块,可应用到通信程序中,这个CRC计算模块使用常见的、在以太网中使用的计算多项式: X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2 + X + 1 写成16进制就是:0x04C11DB7 2、使用这个内置CRC模块操作步骤: 复位CRC模块(设置CRC_CR=0x01),这个操作把CRC计算的余数初始化为0xFFFFFFFF 把要计算的数据按每32位分割为一组数据字,并逐个地把这组数据字写入CRC_DR寄存器(既下图中的绿色框) 写完所有的数据字后
[单片机]
意法半导体量产STM32 F0系列入门级MCU
意法半导体(ST)5月15日在北京媒体沟通会上宣布,开始量产基于ARM Cortex-M0处理器内核的入门级STM32 F0系列32位MCU。其适于工业控制器、家庭自动化、打印机和白色家电等应用。   STM32 F0的主要特性包括:①工作频率48MHz时,性能为38DMIPS,独立第三方评测机构的CoreMark评分为68;24MHz时,22DMIPS,CoreMark39。11项外设映射在5通道的DMA,结合总线矩阵,使闪存中执行代码与DMA数据传输同步操作。   ②四个低功耗模式包括5.3μA停止模式,实时时钟运行的2.8μA待机模式,电池供电模式下且实时时钟运行时0.4μA。1.8V/2-3.6V电源电压。功耗效率如图
[模拟电子]
意法半导体量产<font color='red'>STM32</font> F0系列入门级MCU
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved