OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3038|回复: 1

求大佬看一下这个编码器的程序哪里出了问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-4-5
在线时间
4 小时
发表于 2020-4-23 15:59:57 | 显示全部楼层 |阅读模式
4金钱
#include "encode.h"
#include "bsp_usart.h"
#include "delay.h"

s32 TIM3_Count,TIM3_Circle_Count,TIM3_Encoder_Line_Multiple;

void Tim_Encode_Test(void)
{
          s32  TIM3_Old_Count;
                TIM3_Init_Encode();        
               
                while(1)
                {
                        TIM3_Count=TIM3_Get_Encode();
                        if(TIM3_Old_Count != TIM3_Count)
                        {
                                  TIM3_Old_Count = TIM3_Count;                                                                                                               
                                        printf("脉冲=%d  圈数=%d  位置=%d  圈脉冲=%d\r\n"
                                          ,TIM3_Count,TIM3_Circle_Count,TIM3->CNT,TIM3_Encoder_Line_Number*TIM3_Encoder_Line_Multiple);                        
                        }               
                }        
}


void TIM3_Init_Encode(void)
{
        GPIO_InitTypeDef         GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef        TIM_ICInitStructure;           
        NVIC_InitTypeDef         NVIC_InitStructure;
        
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);  
        TIM_ICStructInit(&TIM_ICInitStructure);      
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);                           


        TIM_DeInit(TIM3);
        if (TIM3_ENCODER_MODE<TIM_EncoderMode_TI12) TIM3_Encoder_Line_Multiple=2;
        else                                        TIM3_Encoder_Line_Multiple=4;
        TIM_TimeBaseStructure.TIM_Period = TIM3_Encoder_Line_Number*TIM3_Encoder_Line_Multiple-1;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);              

        TIM_EncoderInterfaceConfig(TIM3, TIM3_ENCODER_MODE, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);        
        TIM_ICStructInit(&TIM_ICInitStructure);                                                                                                                                                                                                                                                                                 
        TIM_ICInitStructure.TIM_ICFilter = 6;
        TIM_ICInit(TIM3, &TIM_ICInitStructure);

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                                 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                              
        NVIC_Init(&NVIC_InitStructure);
        
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);
        

        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
        
        TIM3->CNT = 0;
        TIM_Cmd(TIM3, ENABLE);   //&#198;&#244;&#182;ˉ&#182;¨ê±&#198;÷
}

s32 TIM3_Get_Encode(void)
{                                                                                                        
        return TIM3_Circle_Count*TIM3_Encoder_Line_Number*TIM3_Encoder_Line_Multiple+(TIM3->CNT);
}

void TIM3_IRQHandler(void)   
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
                if((((TIM3->CR1)>>4) & 0x01)==0)TIM3_Circle_Count++;//DIR==0
                else                            TIM3_Circle_Count--;//DIR==1
        }
}


/*------------End line - Lx ------------*/


捕获.PNG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-24 01:27:01 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表