×
单片机 > 单片机程序设计 > 详情

stm32f0设置tim2单脉冲模式-tim1内部触发

发布时间:2020-06-09 发布时间:
|

TIM2产生单脉冲时,选择TIM1的CH1的OC1REF作为内部触发信号,先设置TIM1—CR2寄存器的MMS位为001


对应标准库函数: TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);


在TIM2_SMCR寄存器的TS位选择内部触发0


对应库函数:  TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发


示波器通道1是tim2输出,通道2是tim1输出

/**************************************************************************************************************

*以下TIM1和TIM2的设置实现TIM1输出40hz,占空比7%即高电平输出180us,TIM2输出单脉冲,周期360us,占空比50%,TIM2的触发是TIM1的OC1REF信号。

TIM2设置单脉冲需设置的参数:

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

    TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//单脉冲

  TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发

  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);

  TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);//在TIM1的初始化函数中,设置TIM1->CR2的MMS位100:比较 – OC1REF 信号被用于作为触发输出 (TRGO)。


****************************************************************************************************************************************/


void TIM1_PWM_Config(FunctionalState flag)

{

   uint16_t TimerPeriod = 0,PrescalerValue = 0,time2_Channel1Pulse;

/* TIM2 的配置 ---------------------------------------------------

   SystemCoreClock 为48 MHz

定时器时钟1000000hz

输出频率40hz

占空比:7%,高脉冲180us

*/  

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

//  TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 

    /*计算预定表的值,也就是多少个时钟计数为一个周期*/

  //TimerPeriod = (SystemCoreClock / 17570 ) - 1;//17570 

  /*计算CCR1 跳转值 在占空比为50%时*/

   //time2_Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

// /*计算CCR2 跳转值 在占空比为37.5%时*/

//  Channel2Pulse = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);

//  /*计算CCR3 跳转值 在占空比为25%时*/

//  Channel3Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);

// /*计算CCR4跳转值 在占空比为12.5%时*/

//  Channel4Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000);

     PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;

       TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;

time2_Channel1Pulse = (uint16_t) (((uint32_t) (7) * (TimerPeriod - 1)) / 1000);

  /* TIM1 时钟使能 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

  

  /* Time 定时基础设置*/

  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/

  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

 

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

 

  /* 频道1,2,3,4的PWM 模式设置 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low

//  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High//控制CH1N引脚的极性,这样配置是CH1和CH1N两引脚电平相反,TIM_OCNPolarity_High时电平相同

//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

 

  TIM_OCInitStructure.TIM_Pulse = time2_Channel1Pulse;//使能频道1配置

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置

//  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置

//  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置

//  TIM_OC4Init(TIM1, &TIM_OCInitStructure);

 

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 

// /*OC1PE:输出比较1预装载使能(Output compare 1 preload enable) 位3 

// 0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数值立即起作用。

// 1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。*/

// TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; 

// TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; 

// TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; 

// TIM_BDTRInitStructure.TIM_DeadTime =  0;  //死区时间0-0xff 

// TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; 

// TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; 

// TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; 

// TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

TIM_ARRPreloadConfig(TIM1, flag);

  /* TIM1 计算器使能*/

 // TIM_Cmd(TIM1, flag);

// TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);//清除更新中断请求位

//      TIM_ITConfig(TIM1,TIM_IT_CC1,flag);

 

// NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;

// NVIC_InitStructure.NVIC_IRQChannelPriority = 3;

// NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;

// NVIC_Init(&NVIC_InitStructure);

//       TIM_ITConfig(TIM1,TIM_IT_Update,flag);

 

// NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;

// NVIC_InitStructure.NVIC_IRQChannelPriority = 3;

// NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;

// NVIC_Init(&NVIC_InitStructure);

TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);

//  /* TIM1 计算器使能*/

  TIM_Cmd(TIM1, flag);

//  /* TIM1 主输出使能 */

  TIM_CtrlPWMOutputs(TIM1, flag);

}

/*****************************************************************************************

*函 数 名:TIM2_PWM_Config

*函数说明:定时器2配置

*形    参:定时器使能flag:ENABLE  DISABLE

***************************************************************************************************/

void TIM2_PWM_Config(FunctionalState flag)

{

   uint16_t TimerPeriod = 0,PrescalerValue = 0,time2_Channel1Pulse;

/* TIM2 的配置 ---------------------------------------------------

   SystemCoreClock 为48 MHz

   输出频率1/360us 占空比:50%,高脉冲180us

*/  

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

// NVIC_InitTypeDef NVIC_InitStructure;

//  TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 

    /*计算预定表的值,也就是多少个时钟计数为一个周期*/

  TimerPeriod = (SystemCoreClock / 2770 ) - 1;//17570 

  /*计算CCR1 跳转值 在占空比为50%时*/

   time2_Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

// /*计算CCR2 跳转值 在占空比为37.5%时*/

//  Channel2Pulse = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);

//  /*计算CCR3 跳转值 在占空比为25%时*/

//  Channel3Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);

// /*计算CCR4跳转值 在占空比为12.5%时*/

//  Channel4Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000);

    // PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;

      // TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;

// time2_Channel1Pulse = (uint16_t) (((uint32_t) (14) * (TimerPeriod - 1)) / 1000);

  /* TIM1 时钟使能 */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , flag);

  

  /* Time 定时基础设置*/

  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/

  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

 

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 

  /* 频道1,2,3,4的PWM 模式设置 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low

//  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High//控制CH1N引脚的极性,这样配置是CH1和CH1N两引脚电平相反,TIM_OCNPolarity_High时电平相同

//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

 

  TIM_OCInitStructure.TIM_Pulse = time2_Channel1Pulse;//使能频道1配置

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置

//  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置

//  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置

//  TIM_OC4Init(TIM1, &TIM_OCInitStructure);

 

TIM_OC1PreloadConfig(TIM2,


关键字:stm32f0  tim2  单脉冲模式  tim1  内部触发 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计