使用stm32主从门控模式精确控制脉冲个数

来源:互联网 发布:mac 安装非app store 编辑:程序博客网 时间:2024/06/05 00:33

1,主从门控模式的介绍

STM32的每个定时器都可以由另一个定时器触发启动定时器一般是通过软件设置而启动,STM32的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动.这里所谓某一个条件可以是定时到时、定时器超时、比较成功等许多条件.这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式。


从这个图中可以TIM3(master)控制TIM1(slave)需要将TIM1的ITR设置为ITR2

2,使用主从门控模式输出如下要求的波形


使用TIM3的CH1控制TIM1的CH1和CH2,每一个波的周期是25us,一组波的频率是10HZ

3,TIM的配置

TIM3:





从3,



4,代码实现

使用的芯片是stm32f051k6u6,HCLK= 48MHZ

/* TIM3 init function */static void MX_TIM3_Init(void){  TIM_MasterConfigTypeDef sMasterConfig;  TIM_OC_InitTypeDef sConfigOC;  htim3.Instance = TIM3;  htim3.Init.Prescaler = 480-1;  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;  htim3.Init.Period = 10020-1; //100ms一组  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)  {    Error_Handler();  }  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)  {    Error_Handler();  }  sConfigOC.OCMode = TIM_OCMODE_PWM1;  sConfigOC.Pulse = 25;//10个波  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)  {    Error_Handler();  }  HAL_TIM_MspPostInit(&htim3);}

/* TIM1 init function */static void MX_TIM1_Init(void){  TIM_SlaveConfigTypeDef sSlaveConfig;  TIM_MasterConfigTypeDef sMasterConfig;  TIM_OC_InitTypeDef sConfigOC;  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;  htim1.Instance = TIM1;  htim1.Init.Prescaler = 48-1;  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;  htim1.Init.Period = 25-1;  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  htim1.Init.RepetitionCounter = 0;  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)  {    Error_Handler();  }  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)  {    Error_Handler();  }  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED;  sSlaveConfig.InputTrigger = TIM_TS_ITR2; //TIM3 control TIM1  if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK)  {    Error_Handler();  }  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)  {    Error_Handler();  }  sConfigOC.OCMode = TIM_OCMODE_PWM1;  sConfigOC.Pulse = 12;  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)  {    Error_Handler();  }  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)  {    Error_Handler();  }  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;  sBreakDeadTimeConfig.DeadTime = 0;  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)  {    Error_Handler();  }  HAL_TIM_MspPostInit(&htim1);}

在main函数中:

        HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

在刚上电的时候PIN脚的电平我们可以在初始的时候拉高或者拉低:

    GPIO_InitStruct.Pull = GPIO_PULLDOWN;

但是PWM波输出停止之后的PIN脚的电平我们不容易控制,他跟PWM波停止时的电平状态相关,可以使用PIN重新初始化的方式,但是需要耗费较长的时间。



0 0