stm32输出两路指定脉冲的PWM

先上效果图


代码如下,直接调用“TIM4_TIM3_PulseOut”就可以输出两路波形

/***************************************************************************************
 * 2018/11/26 - 14:46:02
 * 主定时器4
 * 从定时器3
 * 配置主机模式
 * 选择通道                         SelectChannel
 * 当前通道输出频率                     Cycle
***************************************************************************************/
static void Tim4Tim3Config(uint32_t Cycle, unsigned short PulseNum)
{
    uint16_t Prescaler = SystemCoreClock / 1000000;
    uint16_t Period = 1000000 / Cycle;

    TIM_DeInit(TIM3);
    TIM_DeInit(TIM4);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_TIM4 , ENABLE);                                      // 复用端口映射
    
    GPIO_Init(GPIOD, &(GPIO_InitTypeDef){GPIO_Pin_13|GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_AF_PP});

    TIM_TimeBaseInit(TIM3, &(TIM_TimeBaseInitTypeDef) {
        .TIM_Prescaler =0,                                                              // 设置预分频
         .TIM_CounterMode = TIM_CounterMode_Up,                                         // 向上计数模式
          .TIM_Period = PulseNum>1?PulseNum-1:PulseNum,                                                       // 时钟分频因子
           .TIM_ClockDivision = TIM_CKD_DIV1,                                           // 预分频系数
            .TIM_RepetitionCounter = 0,
    });

    TIM_TimeBaseInit(TIM4, &(TIM_TimeBaseInitTypeDef) {
        .TIM_Prescaler =Prescaler-1,                                                    // 设置预分频
         .TIM_CounterMode = TIM_CounterMode_Up,                                         // 向上计数
          .TIM_Period = Period-1,
           .TIM_ClockDivision = TIM_CKD_DIV1,                                           // 时钟分频为1
            .TIM_RepetitionCounter = 0,
    });

    NVIC_Init(&(NVIC_InitTypeDef) {
        .NVIC_IRQChannel = TIM3_IRQn,
         .NVIC_IRQChannelPreemptionPriority = 0,
          .NVIC_IRQChannelSubPriority = 1,
           .NVIC_IRQChannelCmd = ENABLE,
    });

//    TIM_SetCounter(TIM4, Period );
    TIM_OC2Init(TIM4, &(TIM_OCInitTypeDef) {
        .TIM_OCMode = TIM_OCMode_PWM2,                                                  // 设置PWM输出模式
         .TIM_OutputState = TIM_OutputState_Enable,
          .TIM_OutputNState = TIM_OutputNState_Disable,
           .TIM_Pulse = Period / 2,                                                     // 设置占空比
            .TIM_OCPolarity = TIM_OCPolarity_High,                                        // 空闲默认为高电平,因为第一个脉冲款是后面的两倍,电机是上升沿触发,所以此处设置为高
             .TIM_OCNPolarity = TIM_OCNPolarity_Low,
              .TIM_OCIdleState = TIM_OCIdleState_Reset,
               .TIM_OCNIdleState = TIM_OCNIdleState_Reset
    });

    TIM_OC4Init(TIM4, &(TIM_OCInitTypeDef) {
        .TIM_OCMode = TIM_OCMode_PWM2,                                                  // 设置PWM输出模式
         .TIM_OutputState = TIM_OutputState_Enable,
          .TIM_OutputNState = TIM_OutputNState_Disable,
           .TIM_Pulse = Period / 2,                                                     // 设置占空比
            .TIM_OCPolarity = TIM_OCPolarity_High,                                      // 空闲默认为高电平,因为第一个脉冲款是后面的两倍,电机是上升沿触发,所以此处设置为高
             .TIM_OCNPolarity = TIM_OCNPolarity_Low,
              .TIM_OCIdleState = TIM_OCIdleState_Reset,
               .TIM_OCNIdleState = TIM_OCNIdleState_Reset
    });

    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);

    TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);                        // 设置主从机模式
    TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);                               // 更新事件被选为触发输入TRGO、一个主定时器的时钟可以用作另一个从定时器的预分频器
    TIM_ARRPreloadConfig(TIM4, ENABLE);                                                 // 使能自动重装载
    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);                                   // CC2通道被配置为输入、IC2映射在TRC上。此模式仅工作在内部触发器输入被选中时
}
//

/***************************************************************************************
 * 2018/11/26 - 14:06:52
 * 主定时器 TIM4
 * 从定时器 TIM3
***************************************************************************************/
void TIM4_TIM3_PulseOut(uint32_t Cycle,uint32_t PulseNum)
{
    Tim4Tim3Config(Cycle, PulseNum);

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM3, ENABLE);

    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
    TIM_Cmd(TIM4, ENABLE);
}
//

/***************************************************************************************
 * 2018/11/26 - 14:07:41
 * 从定时器计数个数
***************************************************************************************/
void TIM3_IRQHandler(void)
{

    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);

        TIM_Cmd(TIM3, DISABLE);
        TIM_Cmd(TIM4, DISABLE);
    }
}
//

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值