STM32F103ZET6 用定时器级联方式输出特定数目的PWM

发布者:心灵清澈最新更新时间:2017-02-19 来源: eefocus关键字:STM32F103ZET6  定时器  级联方式  PWM 手机看文章 扫描二维码
随时随地手机看文章

STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5、TIM8,共6个。

这里需要使用定时器的级联功能,ST的RM0008 REV12的P388和P399页上有说明对于特定的定时器,怎么去选择级联功能,参见表86。

我这里输出PWM的定时器是TIM2,空闲的定时器是TIM3。以TIM2为主定时器,TIM3为从定时器对TIM2的输出脉冲数进行计数。

查表可知,TIM3为从定时器选择TIM2为触发源,需要配置TS=001,即选择ITR1。

实现通过定时器控制输出PWM个数的功能,可以有如下一种配置方式:


void TIM2_Master__TIM3_Slave_Configuration(u32 PulseFrequency)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_OCInitTypeDef       TIM_OCInitStructure;


    u16 nPDTemp ;

    /* -----------------------------------------------------------------------

    TIMx Configuration: generate 4 PWM signals with 4 different duty cycles:

    TIMxCLK = 72 MHz, Prescaler = 0x0, TIMx counter clock = 72 MHz

    TIMx ARR Register = 0 => TIMx Frequency = TIMx counter clock/(ARR + 1)

    TIMx Frequency = 72MHz.

    ----------------------------------------------------------------------- */

    TIM_Cmd(TIM2, DISABLE);

    nPDTemp = 72000000UL/PulseFrequency;    


// 时基配置:配置PWM输出定时器——TIM2

    /* Time base configuration */

    TIM_TimeBaseStructure.TIM_Period          = nPDTemp-1;

    TIM_TimeBaseStructure.TIM_Prescaler       = 0;

    TIM_TimeBaseStructure.TIM_ClockDivision   = 0;

    TIM_TimeBaseStructure.TIM_CounterMode     = TIM_CounterMode_Up;

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    

// 输出配置:配置PWM输出定时器——TIM2

    /* PWM1 Mode configuration: Channel1 */

    TIM_OCInitStructure.TIM_OCMode            = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OCPolarity        = TIM_OCPolarity_High;    

    TIM_OCInitStructure.TIM_OutputState       = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_Pulse             = nPDTemp>>1;//50%


    TIM_OC1Init(TIM2, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    

// 时基配置:配置脉冲计数寄存器——TIM3

    TIM_TimeBaseStructure.TIM_Period        = 0xFFFF;

    TIM_TimeBaseStructure.TIM_Prescaler     = 1;

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);    

    

    /* Output Compare Active Mode configuration: Channel1 */

    TIM_OCInitStructure.TIM_OCMode                        = TIM_OCMode_Inactive;

    TIM_OCInitStructure.TIM_OCPolarity                = TIM_OCPolarity_High;

    TIM_OCInitStructure.TIM_OutputState                = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_Pulse                        = 0xFFFF; // 这里的配置值意义不大

    

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);

    

// 配置TIM2为主定时器

    /* Select the Master Slave Mode */

    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

    /* Master Mode selection */

    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

    

// 配置TIM3为从定时器

    /* Slave Mode selection: TIM3 */

    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);

    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);

    

    TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

   

    TIM_Cmd(TIM2, DISABLE);

    TIM_Cmd(TIM3, DISABLE);

}


中断服务程序如下:



u8  TIM2_Pulse_TIM3_Counter_OK = 0;

void TIM3_IRQHandler(void)

{

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

    {

        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);    // 清除中断标志位

        

        TIM_Cmd(TIM2, DISABLE); // 关闭定时器

        TIM_Cmd(TIM3, DISABLE); // 关闭定时器

        

        TIM2_Pulse_TIM3_Counter_OK = 1;

    }

}


应用程序为:


u16 pulsecnt = 10000;

void main(void)

{

    SystemSetup();        // 初始化内核和外设

    TIM2_Master__TIM3_Slave_Configuration(10000);//配置TIM2的脉冲输出为10k

    while(1)

    {

        TIM_ITConfig(TIM3, TIM_IT_CC1, DISABLE);        /* TIM enable counter */

        TIM_Cmd(TIM3, ENABLE);

        TIM3->CCR1  = pulsecnt;

        TIM3->CNT   = 0;

        TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

        TIM_Cmd(TIM2, ENABLE);    /* TIM enable counter */

        

        while(TIM2_Pulse_TIM3_Counter_OK  == 0);

    }

}


这种配置方式下,使用的是TIM3的比较中断,我还没试验过其他的方式,想来应该也是可以的,比如用定时器更新中断……

关键字:STM32F103ZET6  定时器  级联方式  PWM 引用地址:STM32F103ZET6 用定时器级联方式输出特定数目的PWM

上一篇:STM32 FSMC配置之SRAM
下一篇:STM32|4-20mA输出电路

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

stm32 定时器 通用定时器
STM32F10xxx 2个基本定时器(TIM6、TIM7) 4个通用定时器(TIM2、 TIM3、 TIM4和TIM5) 2个高级定时器(TIM1、TIM8) 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作 TIMx主要功能 16位向上、向下、向上/向下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值 4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 使用外部信号控制定时器和定时器互连的同步电路 如下事件发生时产生中断/DMA: ─ 更新:计数器
[单片机]
AVR单片机TO定时器快速PWM模式范例
AVR单片机TO定时器快速PWM模式范例: /*/////////////////////////////////////////////// ///////定时器TO的使用例程 快速PWM模式///////// //编译环境:ICCV7 for AVR //晶体: 11.0592Mhz ///////////////////////////////////////////////*/ #include #include void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x08; //PB3为PWM输出 PORTC = 0x00; /
[单片机]
PWM输出实验详细示例
PWM输出实验 PWM的工作原理(以向上计数为例) CCRX寄存器中的值是用来和计数器中的值比较的,当CNT计数器中的值等于CCRX寄存器时,通用定时器输出信号电平翻转。最终当计数器计数至MAX(ARR中的值)时,(还可以触发“更新中断”)立刻返回0并且重新进行向上计数。 PWM与AFIO引脚重映射综合实验 库函数使用说明 PWM配置的基础知识点 GPIO端口功能重映射 首先我们必须要清楚我们要将TIM功能重映射到那个引脚: 我们从AFIO的GPIO复用功能重映射了解到,当我们使用“TIM3部分部分重映射”功能时,我们可以将TIM3的TIM3_CH3引脚映射至PB5引脚上,用它去驱动LED0显示PWM的功能。
[单片机]
<font color='red'>PWM</font>输出实验详细示例
一种基于PWM的CMOS数据接口电路设计
1 引言 随着电路系统需求的扩展,集成电路设计与制造技术的进步,现代数字系统多工作在几百Mbps的速率上,这些高速系统常包含多个电路模块。系统中不同模块间的接口十分重要,它一般采用总线结构。为了获得更高的数据传输速率必须增加内部总线宽度,实际应用中,采用更大芯片面积和更多端口数目。这类问题也出现在板级系统中。为此,提出一个端口同时传输多个比特的概念以解决该问题,即采用调制技术,在电路中将数据与时钟信号合并为一个通道以减少端口数。为解调该信号,接收端则采用时钟恢复电路(CRC)从数据流中提取时钟信号。常用的调制技术包括PPM ,PCM及PWM 。 给出了一采用PWM,传输速率达400Mbps的数据接口电路。用脉冲宽度对数据进
[嵌入式]
stc12单片机LED_PWM调光
本程序一共有3个文件下面分别列出: stc12c5a.h 头文件下载: http://www.51hei.com/mcu/3282.html main.c #include stc12c5a.h #include type.h #define FRE 22118400 #define TIME_FRE 10000 //计时1/10000=0.0001s=0.1ms (此时间是用来加快LED闪烁频率) #define T0RELOAD (65536 - (FRE / TIME_FRE)) //***************************************初始化变量 v
[单片机]
stc12单片机LED_<font color='red'>PWM</font>调光
基于51单片机的PWM温控风扇
#include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include intrins.h #include stdio.h #include 18b20.h #include delay.h #include key.h sbit RS = P2^5; //定义LCD1602端口 sbit RW = P2^6; sbit EN = P2^7; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET E
[单片机]
基于51单片机的<font color='red'>PWM</font>温控风扇
STM32 PWM功能在关闭时GPIO电平不确定的情况
  刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况。在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确定。   解决方法:1、在关闭PWM输出时随即将相应GPIO强制为低(这个高/低看各人的需要)   tiM_Cmd(TIM3 ,DISABLE);//关闭PWM输出   TIM_ForcedOC1Config(TIM3, TIM_ForcedAction_InActive);//将PWM输出强制为低   2、在下次打开PWM时使用下面的函数   /*因前面使用PWM强制输出为低,此处需要重新打开PWM输出*/   TI
[单片机]
利用555定时器构成白光LED电压调节器的方法
本文以一个555定时器为主要器件构成电压调节电路(如图所示),用来控制一个或多个白光LED。定时器IC1与R1、R2、C2构成了可复位非稳态多谐振荡器。 首次输入电压V S 后,D1将使存储电容器C1充电直到其电压略低于V S 。最初,晶体管Q2处于截止状态,IC1的复位输入为高电平,输出端(OUTPUT)为高电平,以让电流能经过R1给C2充电。 这段时间内,R4拉动放电端(DISCHARGE)导通晶体管Q1,电感L1中的电流I L 开始斜线增大。由于Q1饱和,因此D3和LED都处于反向偏压状态。 当C2的电压超过IC1中管脚6的极限电压(THRESHOLD)时,输出端(OUTPUT)与放电端(DISCHARGE)都变为低电平
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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