分享

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

 denvice 2018-08-04

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

  1. /* TIM3 init function */
  2. static void MX_TIM3_Init(void)
  3. {

  4. TIM_MasterConfigTypeDef sMasterConfig;
  5. TIM_OC_InitTypeDef sConfigOC;

  6. htim3.Instance = TIM3;
  7. htim3.Init.Prescaler = 480-1;
  8. htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  9. htim3.Init.Period = 10020-1; //100ms一组
  10. htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  11. htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  12. if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  13. {
  14. Error_Handler();
  15. }

  16. sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
  17. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  18. if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  19. {
  20. Error_Handler();
  21. }

  22. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  23. sConfigOC.Pulse = 25;//10个波
  24. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  25. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  26. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  27. {
  28. Error_Handler();
  29. }

  30. HAL_TIM_MspPostInit(&htim3);

  31. }

  1. /* TIM1 init function */
  2. static void MX_TIM1_Init(void)
  3. {

  4. TIM_SlaveConfigTypeDef sSlaveConfig;
  5. TIM_MasterConfigTypeDef sMasterConfig;
  6. TIM_OC_InitTypeDef sConfigOC;
  7. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

  8. htim1.Instance = TIM1;
  9. htim1.Init.Prescaler = 48-1;
  10. htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  11. htim1.Init.Period = 25-1;
  12. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  13. htim1.Init.RepetitionCounter = 0;
  14. htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  15. if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  16. {
  17. Error_Handler();
  18. }

  19. if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  20. {
  21. Error_Handler();
  22. }

  23. sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED;
  24. sSlaveConfig.InputTrigger = TIM_TS_ITR2; //TIM3 control TIM1
  25. if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK)
  26. {
  27. Error_Handler();
  28. }

  29. sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
  30. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  31. if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  32. {
  33. Error_Handler();
  34. }

  35. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  36. sConfigOC.Pulse = 12;
  37. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  38. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  39. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  40. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  41. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  42. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  43. {
  44. Error_Handler();
  45. }

  46. sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  47. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  48. {
  49. Error_Handler();
  50. }

  51. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  52. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  53. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  54. sBreakDeadTimeConfig.DeadTime = 0;
  55. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  56. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  57. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  58. if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  59. {
  60. Error_Handler();
  61. }

  62. HAL_TIM_MspPostInit(&htim1);

  63. }

在main函数中:

  1. HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);

  2. HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);

  3. HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

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

    GPIO_InitStruct.Pull = GPIO_PULLDOWN;

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



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多