单片机
返回首页

stm32系列--PWM捕获功能

2025-09-08 来源:cnblogs

Capture_Init(59999,120-1);  // 可捕获最小频率 72M/(120*60000)= 17*0.6=10Hz  PA1


// TIM2_CH2  PA7 做为捕获通道 

// 输入捕获能捕获到的最小的频率为 72M/{ (ARR+1)*(PSC+1) }

void Capture_Init(u16 arr, u16 psc)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;

    TIM_ICInitTypeDef TIM_ICInitSturcture;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_IN_FLOATING

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    TIM_TimeBaseInitSturcture.TIM_Period = arr;

    TIM_TimeBaseInitSturcture.TIM_Prescaler = psc;

    TIM_TimeBaseInitSturcture.TIM_ClockDivision = TIM_CKD_DIV1;                                                                       

    TIM_TimeBaseInitSturcture.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitSturcture);


    TIM_ICInitSturcture.TIM_Channel = TIM_Channel_2;

    TIM_ICInitSturcture.TIM_ICFilter = 0x0f; //0x00

    TIM_ICInitSturcture.TIM_ICPolarity = TIM_ICPolarity_Rising;

    TIM_ICInitSturcture.TIM_ICPrescaler = TIM_ICPSC_DIV1;

    TIM_ICInitSturcture.TIM_ICSelection = TIM_ICSelection_DirectTI;

    //TIM_ICInit(TIM2, &TIM_ICInitSturcture);


    TIM_PWMIConfig(TIM2, &TIM_ICInitSturcture);            //初始化PWM输入模式

    // 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期)

    // 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置


    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);            //选择输入捕获触发信号

    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);       // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位

    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);



    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);          // 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)

    TIM_Cmd(TIM2, ENABLE);

}


//float DutyCycle = 0;

//float Frequency  = 0;

u32  DutyCycle = 0;

u32  Frequency  = 0;

u32 IC1Value = 0;

u32 IC2Value = 0;

//

 // 如果是第一个上升沿中断,计数器会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0,

 // 无法计算频率和占空比。当第二次上升沿到来的时候,CCR1和CCR2捕获到的才是有效的值。其中

 // CCR1对应的是周期,CCR2对应的是占空比。

 //

void TIM2_IRQHandler(void)

{

 


    IC1Value = TIM_GetCapture1(TIM2);        // 占空比

    IC2Value = TIM_GetCapture2(TIM2);        // 总长度


      if( myusart.reflag==0)

        {    

            if(IC1Value != 0 && (IC2Value>IC1Value))

            {

                DutyCycle = ((IC1Value + 1) * 10000) / (IC2Value + 1); //5050  50.5%

                Frequency = 600000 / (IC2Value + 1);

            }

            else

            {

                DutyCycle = 0;

                Frequency = 0;

            }        

    }    

    

        TIM_ClearITPendingBit(TIM2,  TIM_IT_CC2);

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 锂离子/锂聚合物USB电池充电器

  • 6晶体管H桥

  • AVR LCD温度计—LM35

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

  • JDM2 PIC 18F 编程器

    相关电子头条文章