你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TIM 单脉冲输出后的电平如何设置?

[复制链接]
饕餮的阿周 提问时间:2026-1-8 17:45 / 未解决

80d8d160527fbde42049e4a77ffecb8d.jpg

这个是TIM8 ch1单脉冲输出的波形(周期为1ms,占空比为50%),可以见到,输出完毕后,引脚电平为高电平;

请问如何使输出完毕后引脚电平为低电平?困惑中,谢谢大家

核心设置代码如下:

/* TIM8 init function */
void MX_TIM8_Init(void)
{

  /* USER CODE BEGIN TIM8_Init 0 */

  /* USER CODE END TIM8_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM8_Init 1 */

  /* USER CODE END TIM8_Init 1 */
  htim8.Instance = TIM8;
  htim8.Init.Prescaler = 16-1;
  htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim8.Init.Period = 9999;
  htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim8.Init.RepetitionCounter = 0;
  htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OnePulse_Init(&htim8, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 4999;
  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(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  __HAL_TIM_DISABLE_OCxPRELOAD(&htim8, TIM_CHANNEL_1);
  if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  __HAL_TIM_DISABLE_OCxPRELOAD(&htim8, TIM_CHANNEL_2);
  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.BreakFilter = 0;
  sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
  sBreakDeadTimeConfig.Break2Filter = 0;
  sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM8_Init 2 */

  /* USER CODE END TIM8_Init 2 */
  HAL_TIM_MspPostInit(&htim8);

}
收藏 评论9 发布时间:2026-1-8 17:45

举报

9个回答
HyunYong 回答时间:2026-1-9 05:47:12

没理解错的话 图中是你要的波形 输出一次脉冲以后希望持续高电平输出

sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; 这两行从RESET 改为SET

那么就是单脉冲输出结束后高电平了 不然改的话就会呈现输出完一次脉冲以后持续低电平

做波形的话 大部分这些简单的波形都能从cubemx上直接配置 你只需要在使用的时候初始化一次

这些都是cubemx上可以设置的 可以看看正点原子的或者是问一下AI这个芯片在cubemx中要怎么配置 会给你引导思路的 找到对应 的位置 截图翻译一下 基本配置都是直译 cubemx内容换成中文的话你就能马上找到了

饕餮的阿周 回答时间:2026-1-9 08:47:22

HyunYong 发表于 2026-1-9 05:47
没理解错的话 图中是你要的波形  输出一次脉冲以后希望持续高电平输出</p>
<p>sConfigOC.OCIdleState = TIM_O ...

[md]感谢,不好意思写错了,我是想在一个脉冲输出后引脚拉到电平。上面的图和代码,一个脉冲输出后引脚为电平。

HyunYong 回答时间:2026-1-9 09:17:33

饕餮的阿周 发表于 2026-1-9 08:47
感谢,不好意思写错了,我是想在一个脉冲输出后引脚拉到<strong>低</strong>电平。上面的图和代码,一个脉冲输出后 ...

[md]我设计的时候 一般这种东西允许的话 我喜欢脉冲结束自动进入低电平以后 把引脚绑定退出来 让它变成普通IO 然后再主动拉低一次 那样就不会有意外高电平的可能

HyunYong 回答时间:2026-1-9 09:19:19

饕餮的阿周 发表于 2026-1-9 08:47
感谢,不好意思写错了,我是想在一个脉冲输出后引脚拉到<strong>低</strong>电平。上面的图和代码,一个脉冲输出后 ...

[md]如果想要学波形的话 建议玩STM32G474系列的芯片 因为它还多一个HTIM 应该是叫这个 我叫高级定时器 这个是其他芯片没有的 这个芯片上把所有波形搞会了 其他芯片也是一样的

xmshao 回答时间:2026-1-9 09:36:04

方法不定。

这里最简单的办法就是将PWM模式改为PWM2模式,其它不动。

饕餮的阿周 回答时间:2026-1-9 10:03:14

xmshao 发表于 2026-1-9 09:36
方法不定。</p>
<p>这里最简单的办法就是将PWM模式改为PWM2模式,其它不动。

[md]改为PWM2模式后,互补通道在输出一个PWM周期波形后,电平也是高电平了

butterflyspring 回答时间:2026-1-9 10:06:16
参考手册上有这部分的详细描述

STM32F103 ONEPULSE RM.PNG
xmshao 回答时间:2026-1-9 10:24:40

饕餮的阿周 发表于 2026-1-9 10:03
改为PWM2模式后,互补通道在输出一个PWM周期波形后,电平也是高电平了
...

如果使用互补通道来实现的话 就要复杂些了。此时简单地改个PWM模式的确不太好满足要求。

如果不是必须这样,最好不要使用互补通道,可以使用多个TIMER进行同步启动、同步输出,都工作在单脉冲模式。

如果非要使用互补通道的话,可能需要手动参与下,往往借助更新事件。可以基于互补输出特性来操作。

qintian0303 回答时间:2026-1-14 16:09:55

能不能设定输出固定的个数脉冲

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版