STM32 定时器单脉冲模式

发布者:TranquilMind88最新更新时间:2016-10-11 来源: eefocus关键字:STM32  定时器  单脉冲模式 手机看文章 扫描二维码
随时随地手机看文章
STM32的定时器可以设置成单脉冲模式(OPM)。所谓的单脉冲就是通过程序在一定可控延时后,产生一个脉宽可控的脉冲。这里的延时时间与脉冲宽度都可以设置,主要通过比较:定时器的计数值TIM_CNT、定时器的比较值TIM_CCRx与定时器的周期值TIM_ARR 这三个值来得出。具体如下:
增计数模式:延时时间 = TIM_CCRx - 0                      脉冲宽度 =  TIM_ARR - TIM_CCRx
减计数模式:延时时间 = TIM_ARR - TIM_CCRx        脉冲宽度 = TIM_CCRx - 0
一个简单的单脉冲模式例子的如下图所示:
STM32 定时器单脉冲模式 - ziye334 - ziye334的博客
当定时器的通道2(即图中的TI2)检测一个上升沿后,经过tDelay延时后,通道1原先的低电平就变成了高电平,再经过tPULSE时间后,有倍拉低了,这里高电平的时间就是脉冲宽度。
接下去就讲讲怎么实现上面这个简单的例程:定时器的通道2检测到上升沿,后延时一定时间后输出一定时间的脉冲。还是基于我自己的规范工程。
1、工程的修改
1)这里用到了定时器,所以需要将stm32f10x_tim.h添加到STM32F10x_StdPeriod_Driver工程组中。
2)打开stm32f0x_conf.h文件,将其中原先被屏蔽的语句:#include "stm32f10x_tim.h"的注释去掉。
3)新建OnePulse.c与OnePulse.h两个文件,分别保存在BSP文件夹里下的src与inc中,然后在将OnePulse.c添加到BSP工程组。
 
2、OnePulse.c与OnePulse.h文件程序的编写
首先是引脚的初始化。在这里我选择定时器4,定时器4的通道1作为输出单脉冲的通道,定时器的通道2设置成输入捕获,用来捕获上升沿。所以TIM4通道1对应的引脚PB6设置成复用推挽输出,TIM4的通道2对应的引脚PB7设置成悬空输入。代码如下:

/*************************************************************
Function : OnePulse_GPIO_Init
Description: 定时器器的引脚初始化
Input : none
return : none
*************************************************************/
static void OnePulse_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//TIM4 CH1对应的引脚配置成复用输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//TIM4 CH2对应的引脚配置成悬空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

接下去是定时器的配置。代码如下:

/*************************************************************
Function : OnePulse_TIM4_Init
Description: 定时器4配置
Input : none
return : none
*************************************************************/
static void OnePulse_TIM4_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//初始化TIM4的时钟

/*---------------------------------------------------------
TIM4的定时时基为1/(72M/72)=1us
TIM4的CH1配置成PWM2输出模式,TIM4的CH2配置成输入捕获模式,
PWM2模式增计数下,计数值小于比较值为无效电平即低电平,
TIM2 CH2检测到一个上升沿后,经过一定的延时时间,输出一个脉冲,
延时时间 = 10000 * 1us = 10ms
脉冲宽度 = (65535 - 10000) * 1us = 65.535ms。
---------------------------------------------------------*/
TIM_TimeBaseStructure.TIM_Period = 65535;//定时器周期值
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;//预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//增计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//初始化定时器时基

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//TIM4 CH1配置成PWM2输出模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = 10000;//设置跳变值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高电平
TIM_OC1Init(TIM4, &TIM_OCInitStructure);

TIM_ICStructInit(&TIM_ICInitStructure);//初始化输入捕获结构体
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//TIM4 CH2 配置为输入捕获模式
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管教与寄存器直接对应
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不与分频
TIM_ICInitStructure.TIM_ICFilter = 0;//不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);//初始化TIM4 CH2

TIM_SelectOnePulseMode(TIM4, TIM_OPMode_Single);//选择定时器为单脉冲模式
TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);//选择触发源为IC2
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);//选择定时器从模式为上升沿触发
}

先是设置定时器增计数,72预分频,然后设置周期值,这里设置为65535,也就是我们上面说过的TIM_ARR。接着设置定时器的通道1。上面讲过通道1是用来输出波形用的,所以采用PWM2模式,设定有效电平为高电平,然后设定它的比较值,也就是我们上面的TIM_CCRx,通道1就是TIM_CCR1了。在来设置通道2,通道2用于检查是否有上升沿,配置成输入捕获模式,不会上升沿。然后再设定定时器为单脉冲模式,触发源为IC2(也就是通道2),且上升沿触发。这样就配置好了定时器。由上面配置就可以计算出单脉冲的延长时间和脉冲宽度:
延长时间 = 1 / (72M/72/10000) = 10ms
脉冲宽度 = 1 / (72M/72/(65535 - 10000)) = 65.535ms
还要编写一个总函数:OnePulse_Init()来初始化下相关的代码:

/*************************************************************
Function : OnePulse_Init
Description: 单脉冲模式初始化
Input : none
return : none
*************************************************************/
void OnePulse_Init(void)
{
OnePulse_GPIO_Init();
OnePulse_TIM4_Init();
}

下面是OnePulse.h的代码,只是声明了OnePulse_Init()函数:

#ifndef __ONEPULSE_H__
#define __ONEPULSE_H__
#include "stm32f10x.h"

void OnePulse_Init(void);

#endif

3、main函数的编写
main函数很简单,只是调用下相关的初始化函数,代码如下:

/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
OnePulse_Init();
PRINTF("\nmain() is running!\r\n");
while(1)
{
LED1_Toggle();
Delay_ms(1000);
}
}

4、测试
将示波器的探头连接到TIM4通道1对应的引脚PB6,然后用杜邦线将TIM4通道2对应的引脚PB7连接到GND接地引脚,然后马上在将杜邦线拔掉,这样来模拟一个上升沿。在示波器上就检测到了一个脉冲,如下图所示:
STM32 定时器单脉冲模式 - ziye334 - ziye334的博客
通过测量可以等到示波器上得到的单脉冲波形,脉冲的长度为65ms左右。类似下图:
STM32 定时器单脉冲模式 - ziye334 - ziye334的博客

关键字:STM32  定时器  单脉冲模式 引用地址:STM32 定时器单脉冲模式

上一篇:STM32 六步PWM输出
下一篇:STM32 定时器输出比较翻转模式

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

单片机MSP430入门-理论⑤--定时器模块-WDT看门狗
上期大概给大家汇总介绍了,在MSP430环境下的时钟寄存器BCSCTL2,他每个位的意义以及他们的设置方法 本期将重点介绍下,定时器模块,这次先讲下看门狗定时器和他的寄存器,设置等 1.0 定义 1.1 定时器: MSP430的定时器大概有4种,看门狗定时器,基本定时器,定时器A,定时器B, 1.2 基本定时器功能: 基本定时,支持软件和各种外围模块工作在低频率,低功耗条件下 1.3 定时器A功能: 基本定时,支持同时进行的多种时序控制,多个捕获,比较功能和多种输出波形(PWM),可以以硬件方式支持串行通信 1.4 定时器B功能: 基本定时,功能基本跟定时器A差不多,但比较定时器A更灵活,功能更强大 1.5 看门口定时器功
[单片机]
单片机MSP430入门-理论⑤--<font color='red'>定时器</font>模块-WDT看门狗
STM32 F103USB官方例程枚举知识
下面是USB枚举方面用到的一些函数以及他们之间的调用关系,由于本人刚刚接触STM32,可能会有一些错误,还望指正
[单片机]
<font color='red'>STM32</font> F103USB官方例程枚举知识
ucOS学习笔记(4)——一步一步移植ucOS到STM32
准备工作: 1.到micrium官网下载最新的 OS在stm32上的移植资料。下载地址为: http://micrium.com/download/Micrium-ARM-OS-II-Cortex-M3.exe 2.平台搭建: a.将1下载得到的文件解压得到micrium文件夹,并在Micrium\Software\ OS-II下用UV4创建一个 OS工程,配置CPU为STM32F101C8 b.建立如图1所示的工程目录结构。其中APP层用于放置应用程序, OS用于放置所有 OS与处理器无关的源码,PORT用于放置移植 OS需要改动的文件,而BSP则用于放置系统的驱动程序,LIB为系统调用的库支持。该目录组织依据来源于micr
[单片机]
ucOS学习笔记(4)——一步一步移植ucOS到<font color='red'>STM32</font>
基于STM32定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程。 一般来讲,使用STM32定时器的捕获功能来实现脉宽测量,我们可以选用一个通道、也可以使用两个通道。使用1个通道时,只需使用定时器基本的输入捕获功能结合中断或DMA即可实现;若使用两个通道时可以将捕获功能与定时器的从模式来相结合完成。这里就两种方案的实现示例都做个简单介绍。 不妨先介绍基于单个通道的输入捕获功能来实现对1路信号脉冲宽度及占空比的测量,并在测量过程中统计用于测量的定时器自身的溢出事件,以保障即使被测信号脉宽长于测量定时器自身的溢出周期时也能有效测量。 这
[单片机]
基于<font color='red'>STM32</font><font color='red'>定时器</font>捕获测量脉宽的应用示例
stm32 浮点数问题
由于我后面的课题需要涉及较多的浮点运算,只熟悉f103,它不带FPU,所以软件浮点算法就显得很重要了。这几天在做些小研究和测试。 今天又仔细研读了谭浩强的C语言书的数据类型章节,上面有说到c编译系统总将float类型转换成double类型来进行浮点运算,然而一般应用中7位有效数字的占32位的float类型已基本满足需求,若转为16位有效数字64位double类型岂不是没什么必要?速度岂不是会降低? 今天将原子哥的内部温度传感器实验的浮点运算的代码作了个小小的改动,却是大大的改善,结果如下: 温度计算公式原代码为: temp=(1.43-temp)/0.0043+25; // 这句产生的代码量为1584字节改为单精度: te
[单片机]
STM32开发板入门教程 - 内部温度传感器
废话少说 先看看他的参数 1. STM32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量; 2. 测量范围 40~125℃,精度 1.5℃。 3. 温度传感器产生一个随温度线性变化的电压,转换范围在2V VDDA 3.6V之间。 转换公式如下图所示: 呵呵 其实 写代码的时候 公式直接简化就得啦 如果测量要求不怎么高的话 呵呵(其实高也高不了 呵呵) 我们都喜欢简单 简单明了 嘿嘿 简化的公式: vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25; 呵呵 重
[单片机]
<font color='red'>STM32</font>开发板入门教程 - 内部温度传感器
DMA传输实验
DMA简介 DMA(Direct Memory Access)一种直接存储器存取,单片机的一个外设,它的主要功能就是用传输数据的,好处就是传输数据的时候不占用CPU。数据传输的方向有 外设到存储器,存储器到存储器,外设到外设这里的存储器包括SRAM和FLASH。 DMA 的要素 1.DMA请求如果外设想要通过DMA传输数据,必须先给DMA控制器发送DMA请求。DMA收到信号后控制器会给外设发送一个应答信号,当外设收到应答信号且DMA控制器收到应答信号之后,就会启动DMA传输,直到传输完毕 2通道。DMA具有12个独立的可编程通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一
[单片机]
SD NAND在STM32应用上的保姆级教程
SD NAND与正点原子精英板的连接 由于正点原子精英板没有SD NAND接口,只有TF卡接口,所以SD NAND需要用到转接板来连接。 SD NAND正常运行现象 本次实验的程序是正点原子的SD卡实验例程,先用读卡器把SD NAND接到电脑上,并复制一个文件进去,再插到开发板上; 用送的数据线连接USB UART接口,下载好程序,打开电脑上的串口助手,按下KEY0,即可读取到数据, 具体实验步骤和现象可以看例程文件夹中的readme, 另外LED-DS0闪烁也表示SD NAND芯片在正常运行, SD NAND芯片用的是MK-米客方德的工业级芯片MKDV1GIL-AS;MK-米客方德家还有其他各种型号的SD NAN
[单片机]
SD NAND在<font color='red'>STM32</font>应用上的保姆级教程
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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