初级会员

- 积分
- 188
- 金钱
- 188
- 注册时间
- 2019-7-17
- 在线时间
- 48 小时
|
发表于 2019-7-18 09:32:35
|
显示全部楼层
使用 TIM 的 TIM_OCMODE_PWM1 或者 TIM_OCMODE_PWM2
再配置对应的极性即可
下面是我用过的,但是不是你的那个需求,应该只需要修改我两处就行了,
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_MasterConfigTypeDef sMasterConfig;
GPIO_InitStruct.Pin = HVC_LLN_CH1N_PIN|HVC_LLP_CH1_PIN|
HVC_RLN_CH2N_PIN|HVC_RLP_CH2_PIN|
TIM1_BRK_IN_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
HAL_GPIO_Init(HVC_GPIO_PORT_E, &GPIO_InitStruct);
SHOCK_RELEASE_TIM_CLK_ENABLE();
// 暂时使用内部晶振
tim1_shock_release.Instance = SHOCK_RELEASE_TIM;
tim1_shock_release.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
tim1_shock_release.Init.Prescaler = SHOCK_RELEASE_TIM_PRESCALER - 1; // 1us
tim1_shock_release.Init.CounterMode = TIM_COUNTERMODE_UP;
tim1_shock_release.Init.Period = SHOCK_RELEASE_TIM_PERIOD - 1;
tim1_shock_release.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
//tim1_shock_release.Init.RepetitionCounter = 3;
HAL_TIM_OC_Init(&tim1_shock_release);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&tim1_shock_release, &sMasterConfig);
tim1_sConfigOC.OCMode = TIM_OCMODE_PWM2; // TIM_OCMODE_ACTIVE
tim1_sConfigOC.Pulse = 5 ;
tim1_sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; // 需修改
tim1_sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
tim1_sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; // 需修改
tim1_sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
tim1_sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_OC_ConfigChannel(&tim1_shock_release, &tim1_sConfigOC, TIM_CHANNEL_1);
HAL_TIM_OC_ConfigChannel(&tim1_shock_release, &tim1_sConfigOC, TIM_CHANNEL_2);
/* Tdts = (1/64)us
* dead time 0xC8 = 1100 1000
* DT = ( 32 + 0x8 )*8*(1/64)us = 5us
*/
tim1_sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
tim1_sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
tim1_sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
tim1_sBreakDeadTimeConfig.DeadTime = 0xC8;//0xC8; // dead time keep 5us constant
tim1_sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
tim1_sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
tim1_sBreakDeadTimeConfig.BreakFilter = 0;
tim1_sBreakDeadTimeConfig.Break2State = TIM_BREAK2_ENABLE;
tim1_sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
tim1_sBreakDeadTimeConfig.Break2Filter = 0;
tim1_sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
HAL_TIMEx_ConfigBreakDeadTime(&tim1_shock_release, &tim1_sBreakDeadTimeConfig) ;
HAL_NVIC_SetPriority(SHOCK_RELEASE_TIM_CC_IRQ, 2, 0);
HAL_NVIC_EnableIRQ(SHOCK_RELEASE_TIM_CC_IRQ);
Stop_Shock_Release();
} |
|