单片机PWM输入技术

碧海潮生 2020-10-25 ⋅ 11 阅读

导言

脉冲宽度调制(PWM)是一种常见的数字信号调制技术,在单片机中有广泛应用。通常情况下,我们更熟悉的是单片机生成PWM输出信号,用于控制电机、LED灯等外部设备。然而,在某些特定应用下,我们也需要通过单片机读取外部设备所输出的PWM信号,并进行相应的处理。本文将介绍如何在单片机中实现PWM输入技术。

PWM输入原理

PWM输入技术的原理很简单。外部设备通过改变信号的占空比来表达不同的信息,单片机通过计数脉冲的个数,再与一个固定的时间周期进行比较,来计算相应的占空比,从而实现对PWM输入信号的读取。

硬件连接

为了实现PWM输入功能,我们需要将外部设备的PWM信号引入到单片机的一个可编程计数器输入端口(如TIM1、TIM2等),同时还需要连接单片机的引脚作为输入中断信号。

PWM输入程序设计

下面我们以以STM32F系列单片机为例,介绍如何在单片机中实现PWM输入。

#include "stm32f10x.h"

void TIM_Configuration(void)
{
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    TIM_DeInit(TIM1);
  
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;
  
    TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);

    TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
  
    TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
  
    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
  
    TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);
 
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
  
    TIM_Cmd(TIM1, ENABLE);
 
}

void TIM1_CC_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
    {
        uint16_t captureValue = TIM_GetCapture1(TIM1);
        uint32_t timerValue = TIM_GetCounter(TIM1);
    
        //根据占空比计算所需的操作
        //...
    
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
    }
}

int main(void)
{
    TIM_Configuration();
    
    while (1)
    {
        //主循环
        //...
    }
}

在上述代码中,我们首先初始化了定时器TIM1的输入捕获功能,并设定了所需的触发极性、输入分辨率等参数。然后通过中断方式,每当发生输入捕获事件,则会触发中断服务函数TIM1_CC_IRQHandler()。在该中断服务函数中,我们可以读取输入的占空比,并进行相应的操作。

总结

单片机的PWM输入技术为我们提供了一种便捷的方式来读取外部设备输出的PWM信号。通过合理设计硬件连接,并编写相应的程序,我们可以灵活地应用PWM输入技术来满足各种应用需求。希望本文能对您理解和应用PWM输入技术有所帮助。

参考文献:


全部评论: 0

    我有话说: