F4编码器模式问题

2019-07-20 09:26发布

[mw_shl_code=applescript,true]void TIM8_ch1_ch2_encoder_init(void){
   
    //PC6,PC7,TIM8,TIM8_CH1,TIM8_CH2,中断初始化结构体定义
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;   
    TIM_ICInitTypeDef TIM_ICInitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    //GPIO,TIM8时钟初始化
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC , ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE);

    //PC7,8复用为TIM8模式
    GPIO_PinAFConfig(GPIOC , GPIO_PinSource6 | GPIO_PinSource7 , GPIO_AF_TIM8);

    //PC6,7模式初始化
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; //开漏输入
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //加上拉电阻
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    //TIM8模式初始化
    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
    TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF; //定时计数器和ARR比较寄存器都是16位的寄存器
    TIM_TimeBaseInitStruct.TIM_Prescaler = 0;
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    //TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM8 , &TIM_TimeBaseInitStruct);

    //TIM8更新中断初始化
    NVIC_InitStruct.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStruct);
   
    //TIM8编码器模式设置
    TIM_EncoderInterfaceConfig(TIM8 , TIM_EncoderMode_TI12 , TIM_ICPolarity_BothEdge
                                , TIM_ICPolarity_BothEdge);

    //TIM8输入通道初始化
    TIM_ICStructInit(&TIM_ICInitStruct);
    //  TIM_ICInitStruct.TIM_Channel
    //  TIM_ICInitStruct.TIM_ICFilter   
    //  TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
    //  TIM_ICInitStruct.TIM_ICPrescaler =
    //  TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStruct.TIM_ICFilter = 10;
    TIM_ICInit(TIM8 , &TIM_ICInitStruct);

    //TIM8更新中断标志清零
    TIM_ClearFlag(TIM8 , TIM_FLAG_Update);
   
    //TIM8更新中断使能
    TIM_ITConfig(TIM8 , TIM_IT_Update , ENABLE);

    //TIM8计数器复位
    TIM8->CNT = 0;

    //开启TIM8
    TIM_Cmd(TIM8 , ENABLE);
   
}


//编码器中断函数
void TIM8_UP_TIM13_IRQHandler(void){


    if(TIM_GetITStatus(TIM8 , TIM_IT_Update)==SET)
      //  TIM8->CNT = 0;
      
   
    TIM_ClearITPendingBit(TIM8 , TIM_IT_Update);

}

[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lx晓
1楼-- · 2019-07-20 13:51
本帖最后由 lx晓 于 2018-2-18 15:58 编辑

[mw_shl_code=applescript,true]        if(Flage){
            speed =TIM8->CNT;
            printf(" %d ",speed);
            TIM8->CNT = 0;
            Flage = 0;
        }
[/mw_shl_code]
主函数读取程序
Flage是定时器中断5ms中断一次设置为1
lx晓
2楼-- · 2019-07-20 14:28
 精彩回答 2  元偷偷看……
lx晓
3楼-- · 2019-07-20 16:00
[mw_shl_code=applescript,true]TIM_EncoderInterfaceConfig(TIM8 , TIM_EncoderMode_TI12 , TIM_ICPolarity_Rising
                                , TIM_ICPolarity_Rising);
[/mw_shl_code]

当把编码器接口配置成这样的时候
编码器读取出来的值始终是下图
lx晓
4楼-- · 2019-07-20 16:30
求大神指点
炫色康康
5楼-- · 2019-07-20 20:48
 精彩回答 2  元偷偷看……
lx晓
6楼-- · 2019-07-21 02:47
炫 {MOD}康康 发表于 2018-2-18 16:55
之前用cube配置过,发现总是丢步严重

编码器有噪声

一周热门 更多>