
这个是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);
}
|
没理解错的话 图中是你要的波形 输出一次脉冲以后希望持续高电平输出
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; 这两行从RESET 改为SET
那么就是单脉冲输出结束后高电平了 不然改的话就会呈现输出完一次脉冲以后持续低电平
做波形的话 大部分这些简单的波形都能从cubemx上直接配置 你只需要在使用的时候初始化一次
这些都是cubemx上可以设置的 可以看看正点原子的或者是问一下AI这个芯片在cubemx中要怎么配置 会给你引导思路的 找到对应 的位置 截图翻译一下 基本配置都是直译 cubemx内容换成中文的话你就能马上找到了
[md]感谢,不好意思写错了,我是想在一个脉冲输出后引脚拉到低电平。上面的图和代码,一个脉冲输出后引脚为高电平。
[md]我设计的时候 一般这种东西允许的话 我喜欢脉冲结束自动进入低电平以后 把引脚绑定退出来 让它变成普通IO 然后再主动拉低一次 那样就不会有意外高电平的可能
[md]如果想要学波形的话 建议玩STM32G474系列的芯片 因为它还多一个HTIM 应该是叫这个 我叫高级定时器 这个是其他芯片没有的 这个芯片上把所有波形搞会了 其他芯片也是一样的
方法不定。
这里最简单的办法就是将PWM模式改为PWM2模式,其它不动。
[md]改为PWM2模式后,互补通道在输出一个PWM周期波形后,电平也是高电平了
如果使用互补通道来实现的话 就要复杂些了。此时简单地改个PWM模式的确不太好满足要求。
如果不是必须这样,最好不要使用互补通道,可以使用多个TIMER进行同步启动、同步输出,都工作在单脉冲模式。
如果非要使用互补通道的话,可能需要手动参与下,往往借助更新事件。可以基于互补输出特性来操作。
能不能设定输出固定的个数脉冲