打印
[STM32F1]

只变化了一次

[复制链接]
343|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pangb|  楼主 | 2020-7-26 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我把TIM2 作为计数器用,外部脉冲输入端接脉冲编码器(带编码器的马达)的输出,两个脚。初始化如下:
     /**************************************************************************
函数功能:把TIM2初始化为编码器接口模式
入口参数:无
返回  值:无
**************************************************************************/
void Horizontal_Motor_Encoder_Init_TIM2(void)
{
        RCC->APB1ENR|=1<<0;     //TIM2时钟使能
        RCC->APB2ENR|=1<<2;    //使能PORTA时钟
        GPIOA->CRL&=0XFFFFFF00;//PA0 PA1
        GPIOA->CRL|=0X00000044;//浮空输入
        /* 把定时器初始化为编码器模式 */
        TIM2->DIER|=1<<0;   //允许更新中断                                
        TIM2->DIER|=1<<6;   //允许触发中断
        NVIC_Init(2,3,TIM2_IRQn,1);

        /* Timer configuration in Encoder mode */
        TIM2->PSC = 0x0;//预分频器
        TIM2->ARR = ENCODER_TIM_PERIOD;//设定计数器自动重装值
        TIM2->CR1 &=~(3<<8);// 选择时钟分频:不分频
        TIM2->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式
               
        TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
        TIM2->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
        TIM2->CCER &= ~(1<<1);         //CC1P='0'         IC1FP1不反相,IC1FP1=TI1
        TIM2->CCER &= ~(1<<5);         //CC2P='0'         IC2FP2不反相,IC2FP2=TI2
        TIM2->CCMR1 |= 3<<4; //        IC1F='1000' 输入捕获1滤波器
        TIM2->SMCR |= 3<<0;         //SMS='011' 所有的输入均在上升沿和下降沿有效

        TIM2->CNT = 0;
        
        TIM2->CR1 |= 0x01;    //CEN=1,使能定时器
}
中断函数如下:
void TIM2_IRQHandler(void)
{                                                                  
        if(TIM2->SR&0x0001)//溢出中断
                           
        TIM2->SR&=~(1<<0);//清除中断标志位         
        g_Horizontal_Circle_Counter ++ ;
}
当输出计算时,计数器的值一直在变化,但是g_Horizontal_Circle_Counter  就是只变化了一次

使用特权

评论回复
沙发
kangzj| | 2020-7-26 13:58 | 只看该作者
似乎中断只进去了一次一样

使用特权

评论回复
板凳
langgq| | 2020-7-26 14:01 | 只看该作者
用库函数操作啊

使用特权

评论回复
地板
gongche| | 2020-7-26 14:04 | 只看该作者
void TIM2_IRQHandler(void)   //TIM2中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
LED0=!LED0;
}

使用特权

评论回复
5
wenfen| | 2020-7-26 14:07 | 只看该作者
编码器的动作频率是多少呀

使用特权

评论回复
6
zwll| | 2020-7-26 14:19 | 只看该作者
又没有可能反应没有那么快 或者中断函数处理函数太多

使用特权

评论回复
7
pangb|  楼主 | 2020-7-26 14:22 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

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

本版积分规则

701

主题

7643

帖子

6

粉丝