STM32 输入捕获pwm频率和占空比

本贴记录STM32输入捕获pwm频率和占空比

STM32TUBEMX配置

1.PA6脚配置

2.按照下图配置参数

3.把上升沿触发改成Both Edges(上升沿和下降沿都触发)

4.打开全局中断

代码编写

1.开始输入捕获
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
2.在中断回调函数里面处理主要逻辑
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    // 当捕获输入触发时,此回调将被调用
    if(htim==&htim3) {
        // 如果触发的是定时器3的输入捕获事件,就进行进一步处理。
        static uint32_t up1=0,up2=0,fall=0,situation=0;
        // up1, up2和fall记录上升沿和下降沿的时间,situation记录当前的状态机阶段。
        switch(situation) {
            // 根据当前状态机阶段进行不同的处理。
            case 0: {
                // 在该阶段,代码期待看到PWM波形的上升沿。
                if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==1) {
                    // 如果GPIOA的6号针脚位高电平,代表捕获到了上升沿
                    situation=1;
                    // 进入下一阶段(期待下降沿)。
                    up1=__HAL_TIM_GetCounter(&htim3);
                    // 记录上升沿的时间(定时器计数器的值)。
                }
                break;
            }
            
            case 1: {
                // 在该阶段,代码期待看到PWM波形的下降沿。
                if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==0) {
                    // 如果GPIOA的6号针脚为低电平,代表捕获到了下降沿。
                    situation=2;
                    // 进入下一阶段(期待上升沿)。
                    fall=__HAL_TIM_GetCounter(&htim3);
                    // 记录下降沿的时间(定时器计数器的值)。
                } else {
                    situation=0;
                    // 如果没有看到下降沿并且引脚位高电平,则重置状态机并重新期待上升沿。
                }
                break;
            }
            
            case 2: {
                // 在该阶段,代码期待看到PWM波形的下一个上升沿。
                if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==1) {
                    // 如果GPIOA的6号针脚位高电平,代表捕获到了上升沿
                    situation=0;
                    // 重置状态机并重新期待下一个上升沿。
                    up2=__HAL_TIM_GetCounter(&htim3);
                    // 记录下一个上升沿的时间(定时器计数器的值)。
                    __HAL_TIM_SetCounter(&htim3,0);
                    // 重置定时器计数器以开始新的PWM周期。
                    pwm_duty=(fall-up1)*100/(up2-up1);
                    // 计算并更新PWM占空比。
                    pwm_pinlv=1000000/(up2-up1);
                    // 计算并更新PWM频率(假设定时器的计数频率为1MHz)。
                } else {
                    situation=0;
                    // 如果没有看到上升沿并且引脚位低电平,则重置状态机并重新期待上升沿。
                }
                break;
            }
        }
    }
}

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32F103微控制器进行输入捕获测量频率占空比和波长的示例代码: ```c #include "stm32f10x.h" #define TIMER_PRESCALER 72 #define PULSE_PERIOD 2000 // 2ms uint32_t pulse_start_time = 0; uint32_t pulse_end_time = 0; float frequency = 0; float duty_cycle = 0; float wavelength = 0; void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { if(pulse_start_time == 0) { pulse_start_time = TIM_GetCapture1(TIM2); } else { pulse_end_time = TIM_GetCapture1(TIM2); frequency = (float)TIMER_PRESCALER / (pulse_end_time - pulse_start_time); duty_cycle = (float)(pulse_end_time - pulse_start_time) / PULSE_PERIOD * 100; wavelength = frequency == 0 ? 0 : 1 / frequency; pulse_start_time = 0; pulse_end_time = 0; } TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } } void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = PULSE_PERIOD - 1; TIM_TimeBaseStructure.TIM_Prescaler = TIMER_PRESCALER - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = PULSE_PERIOD / 2 - 1; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); TIM_Cmd(TIM2, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } int main(void) { TIM2_Configuration(); while(1) { // Your code here } } ``` 在这个示例代码中,我们将TIM2定时器配置为PWM输出模式,并启用输入捕获来捕获PWM脉冲的上升沿和下降沿时间。当捕获到下降沿时间时,我们可以计算出频率占空比和波长,并将它们存储在相应的变量中。请注意,示例代码中的PWM周期为2ms,可以根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值