TIMER门控模式控制PWM输出长度

TIMER门控模式控制PWM输出长度

参照一些网友代码做了些修改,由TIM4来控制TIM2的PWM输出长度,

采用主从的门控模式,即TIM4输出高时候TIM2使能输出

//TIM2 PWM输出,由TIM4来控制其输出与停止
//frequency_tim2:TIM2 PWM输出周期:KHz
//duty_tim2:TIM2 PWM占空比  0-100
//period_tim4: TIM4控制TIM2总周期,单位0.1ms
//duty_tim4: TIM4控制TIM2输出时间,单位0.1ms

void TIM2_CH3_PA2_PWM_TIM4_CH4_GATE( unsigned short int frequency_tim2,
  char duty_tim2, unsigned short int period_tim4, unsigned short int duty_tim4 )
{

  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;

  RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4, ENABLE );
  //使能定时器2时钟
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE );
  //使能GPIO外设和AFIO复用功能模块时钟

  //设置该引脚为复用输出功能,输出TIM2 CH3的PWM脉冲波形 GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2_CH3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init( GPIOA, &GPIO_InitStructure );  //初始化GPIO

  //初始化TIM2
  TIM_TimeBaseStructure.TIM_Period = ( 1000 / frequency_tim2 );
  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,本身频率为1MHz,又分频器设置的下面一行
  TIM_TimeBaseStructure.TIM_Prescaler = ( 72 - 1 );
  //设置用来作为TIMx时钟频率除数的预分频值,72MHz/72=1MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  //设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //TIM向上计数模式
  TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure );
  //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  //初始化TIM2 Channel3 PWM模式
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_Pulse = ( 10 * duty_tim2 / frequency_tim2 );
  //(TIM_Period)*(duty/100) --> (1000/period)*(duty/100)
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  //比较输出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  //输出极性:TIM输出比较极性高
  TIM_OC3Init( TIM2, &TIM_OCInitStructure );
  //根据T指定的参数初始化外设TIM2 OC3

  TIM_OC3PreloadConfig( TIM2, TIM_OCPreload_Enable );
  //使能TIM2在CCR3上的预装载寄存器
  TIM_Cmd( TIM2, ENABLE );  //使能TIM2

  //初始化TIM4
  TIM_TimeBaseStructure.TIM_Period = period_tim4;
  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,本身频率为1MHz,又分频器设置的下面一行
  TIM_TimeBaseStructure.TIM_Prescaler = ( 7200 - 1 );
  //设置用来作为TIMx时钟频率除数的预分频值,72MHz/72=1MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  //设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //TIM向上计数模式
  TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure );
  //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  //初始化TIM4 Channel4 PWM模式
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_Pulse = duty_tim4;
  //(TIM_Period)*(duty/100) --> (1000/period)*(duty/100)
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  //比较输出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  //输出极性:TIM输出比较极性高
  TIM_OC4Init( TIM4, &TIM_OCInitStructure );
  //根据T指定的参数初始化外设TIM4 OC4

  TIM_OC4PreloadConfig( TIM4, TIM_OCPreload_Enable );
  //使能TIM4在CCR4上的预装载寄存器
  TIM_Cmd( TIM4, ENABLE );  //使能TIM4

  TIM_SelectInputTrigger( TIM2, TIM_TS_ITR3 );
  //选择有效输入端 ,查表得知TIM4对于TIM2是ITR3
  TIM_SelectSlaveMode( TIM2, TIM_SlaveMode_Gated );
  //配置为主从复位模式
  TIM_SelectOutputTrigger( TIM4, TIM_TRGOSource_OC4Ref );
  /* Enable timer‘s master/slave work mode */
  TIM_SelectMasterSlaveMode( TIM2, TIM_MasterSlaveMode_Enable );   //Slave
  TIM_SelectMasterSlaveMode( TIM4, TIM_MasterSlaveMode_Enable );   //Master

}
时间: 2024-11-03 21:49:03

TIMER门控模式控制PWM输出长度的相关文章

基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序

硬件设备   42步进电机,步进电机驱动器,正点原子F429开发板 开发软件    keil5,Cube 综述   一般要精准的控制电机,就要控制单片机的引脚输出指定个数的PWM波,有多种可实现的方法,其中最好用的方法是用定时器级联输出固定个数PWM脉冲,虽然多用了一个定时器,但大大减少了CPU的处理资源.STM32的每个定时器可以通过另外一个定时器的某一个条件被触发而启动.这里所谓某一个条件可以是定时到时.定时器超时.比较成功等许多条件.这种通过一个定时器触发另一个定时器的工作方式称为定时器的

IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog输出,NSLog两种不同情况的输出方式

[新年新气象,2016/01/04] 俺们在开发IOS程序过程中,经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程.但是一个发布的程序,里面带有太多的NSLog输出,肯定对于App性能有所影响,这时候我们可以使用一个宏定义来处理,在开发的时候使用DEBUG模式,在发布的时候使用RELEASE模式.这样,发布的App就不会在程序内部做大量的NSLog输出了

使用publisher模式控制频繁的UI输出,避免Winform界面假死

http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出到UI的信息过频,导致UI假死. private void TestMakeTasks(object obj) { string msg = ""; //循环创建task for (int i = 0; i < 3000; i++) { //主线程(winform)--子线程(Thr

(五)转载:通用定时器PWM输出

1.     TIMER输出PWM基本概念   脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是对脉冲宽度的控制.一般用来控制步进电机的速度等等. STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出. 1.1   PWM输出模式 S

Language Modeling with Gated Convolutional Networks(句子建模之门控CNN)--模型简介篇

最近忙着实验室的项目,一直没有时间做仿真,所以就先写一下之前看的一篇文章,总结一下吧.这次要说的是Gated CNN,这也是第一次将门限控制引入到CNN中的文章,感觉十分有新意,效果也很棒.下面我们来看一下,文章的主要贡献包括: 提出一种新的门控机制 缓解梯度传播,降低梯度弥散等现象 相比LSTM,模型更加简单,收敛速度更快 模型的结构图如下所示: 首先我们可以通过堆叠CNN来标识长文本,提取更高层.更抽象的特征,而且相比LSTM而言,我们需要的op更少(CNN需要O(N/k)个op,而LSTM

门控时钟-实际研究 ---- 转载

转载自: http://www.chipsbank.com/news_detail/newsId=124.html 4bit带使能计数器,包括正沿触发与负沿触发: 1.功能仿真: 1.电路结构与仿真波形: 2. 插入带latch的ICG(集成门控): 1.综合脚本: 2. 门控综合结果: 3.仿真波形: 3.插入不带latch的ICG: 1. 综合脚本: 1.需要查找库中是否存在不带Latch的ICG: 2. 需要分别选择上升沿触发寄存器和下降沿触发寄存器的对应门控单元: 3.脚本: 2.综合结

门控时钟-概述 ----- 转载

转载自:http://www.chipsbank.com/news_detail/newsId=122.html 1. 时钟信号的功耗占系统功耗的很大一部分(40%左右)占动态功耗的50%以上 1. DC门控时钟命令:intert_clock_gatingset_clock_gating_style 1. 门控时钟插入: 1. 使用效果实例: a. 对于一个180nm工艺的芯片:有clock gating和没有clock gating的结果相比(芯片实测): a. 功耗节省34%到43%(具体更

FPGA学习笔记之格雷码、边沿检测、门控时钟

一.格雷码 格雷码的优点主要是进位时只有一位跳变,误码率低. 1.二进制转格雷码 我们观察下表: 二进制码 格雷码 00 00 01 01 10 11 11 10 二进制码表示为B[],格雷码表示为G[],则有 G(i) = B(i),i为最高位 G(i-1) = B(i) xor B(i-1),i非最高位 用verilog可以这样写 1 reg [WIDTH-1:0] bin; 2 reg [WIDTH-1:0] gray; 3 parameter WIDTH = 8; 4 always @(

cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验

PWM 简介 脉冲宽度调制(PWM),是英文"Pulse Width Modulation" 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是对脉冲宽度的控制. STM32 的定时器除了 TIM6 和 7.其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM