打印

stm32边沿捕获的问题?

[复制链接]
8916|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leebai_001|  楼主 | 2008-7-28 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的定时器输入捕获能设置成边沿有效(上升和下降沿都有效)的方式吗?
沙发
香水城| | 2008-7-28 17:29 | 只看该作者

也能,也不能

PWM输入模式就是用于捕获上升沿和下降沿。

单纯的输入捕获只能指定上升沿或下降沿,不能同时指定两种边沿。

使用特权

评论回复
板凳
leebai_001|  楼主 | 2008-7-28 17:47 | 只看该作者

可以实现边沿捕获功能的代码

这个程序使用了TIM3通道1的边沿脉宽捕获计数,有点麻烦,不知道有没有更简单一点的程序。
1.TIM3初始化
void TIM3_Ini(void)
{
    /* TIM3 configuration:  ------------------------
     The external signal is connected to TIM3 CH1 pin (Pa.06), 
    ------------------------------------------------------------ */
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    
    TIM_DeInit( TIM3);//
    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 65535;
    TIM_TimeBaseStructure.TIM_Prescaler = 72;  //0
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    //ic1 -- rising
    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_ICInit(TIM3,&TIM_ICInitStructure);
    //ic1-- falling
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;
    TIM_ICInit(TIM3,&TIM_ICInitStructure);
    
    /* TIM enable counter */
    TIM_Cmd(TIM3, ENABLE);

    /* Enable the CC1,CC2 Interrupt Request */
    TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);

2. 中断处理程序
void TIM3_IRQHandler(void)
{
    uchar i=0;
    if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
    {
        if(TIM_GetFlagStatus(TIM3,TIM_FLAG_CC1OF)== RESET)
        {
            /* Get the Input Capture value */
            Curr_TIM3_IC1Val = TIM_GetCapture1(TIM3);//rising value..
            /* Clear TIM2 Capture compare interrupt pending bit */
            TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
            i=1;
        } else {
            TIM_ClearFlag(TIM3,TIM_FLAG_CC1OF);
        }
    } 
    else if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
    {
        if(TIM_GetFlagStatus(TIM3,TIM_FLAG_CC2OF)== RESET)
        {
            /* Get the Input Capture value */
            Curr_TIM3_IC1Val = TIM_GetCapture2(TIM3); //fall value..
            /* Clear TIM2 Capture compare interrupt pending bit */
            TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
            i=1;
        } else {
            TIM_ClearFlag(TIM3,TIM_FLAG_CC2OF);
        }
    }
    //
    if (i==1)
    {
        Tim3_IC1Value=Curr_TIM3_IC1Val-Prev_TIM3_IC1Val;
        //
        Uputchar(Tim3_IC1Value,0);
        Uputchar(Tim3_IC1Value>>8,0);
        Prev_TIM3_IC1Val=Curr_TIM3_IC1Val;
    }
}

Tim3_IC1Value即为边沿脉冲宽度值。

使用特权

评论回复
地板
香水城| | 2008-7-28 18:07 | 只看该作者

可以使用PWM输入模式直接测量脉宽

请参考STM32技术参考手册的Timer章节。

使用特权

评论回复
5
leebai_001|  楼主 | 2008-7-28 18:28 | 只看该作者

对PWM输入模式有点疑问

数据手册上提到,该模式可以测出PWM信号的长度(TIM1_CCR1 寄存器) 和占空比
(TIM1_CCR2寄存器)。
可不可以这么理解,就是该模式的实现需要3个边沿?
如果是的话,与要测试2个边沿的脉冲宽度的想法就不一致。

使用特权

评论回复
6
香水城| | 2008-7-28 19:00 | 只看该作者

实际上PWM输入模式是通过一个定时器内部的两个通道共同完

这两个通道被设置为不同的边沿触发,其中一个通道配置为检测到第一个边沿时捕获定时器的数值并将定时器的计数器清零,另一个通道配置为检测到第二个边沿时捕获计数器的数值。

这样可以看到从第三个边沿开始,第一个通道的捕获寄存器中的数值代表了PWM的周期长度,第二个通道的捕获寄存器中的数值代表了PWM的占空比。如果只有两个边沿,则第一个通道的捕获寄存器中的数值没有意义,你可以直接使用第二个通道捕获寄存器的内容作为脉宽的数值。

当然,根据这个原理,你完全可以自己设置两个捕获通道,一个捕获第一个边沿,另一个捕获第二个边沿,两个捕获寄存器内容之差就是你要测量的脉宽。

使用特权

评论回复
7
hjiongh| | 2008-11-13 17:17 | 只看该作者

PWM模式是一个定时器内部的两个通道完成的,那会有问题吗

那我有个疑问了。我如果TIM4的4个CH都连接了输入PWM信号, 那这样的话,会有问题吗?
一个PWM输入信号就要用两个通道共同完成了,那4个通道岂不是只能完成两个PWM输入信号了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

93

帖子

0

粉丝