打印
[STM32F1]

正交编码器没反应。程序哪错了,跪求帮助,谢谢啦

[复制链接]
2721|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦翔青春|  楼主 | 2015-7-31 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"zjbmq.h"


void ENC_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;


        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能TIM3

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_StructInit(&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        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_DeInit(TIM3);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

        TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置预分频:
        TIM_TimeBaseStructure.TIM_Period = (4*1000)-1;;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

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

        // Clear all pending interrupts
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
        //Reset counter
        TIM3->CNT = 0;


        TIM_Cmd(TIM3, ENABLE);
}

s16 ENC_Get_Electrical_Angle(void)
{
        static u16   lastCount =0;
        u16 curCount = TIM3->CNT;
        s32 dAngle =curCount - lastCount;
        if(dAngle >= 500)
        {
                  dAngle -=1000;
        }
        else if(dAngle < -500)
        {
                   dAngle += 1000;
        }
        lastCount = curCount;
        return (s16)dAngle;
}
沙发
梦翔青春|  楼主 | 2015-7-31 19:25 | 只看该作者
求帮助,急需帮助

使用特权

评论回复
板凳
梦翔青春|  楼主 | 2015-7-31 19:55 | 只看该作者
:'(

使用特权

评论回复
地板
戈卫东| | 2015-7-31 20:25 | 只看该作者
寄存器版本的。。。。。。。。库函数我不会。。。。。。

    /* ------------------------------- TIM3 编码器接口 A/B signal ----------------------------- */
    TIM3->CR1 = 0;      /* use default value 或许是UP/DOWN模式? */
    TIM3->ARR = BLDC_TIM3_PERIOD;
    TIM3->SMCR = 3;     /* Encoder mode 3 */
    TIM3->CCER = 0;     /* CC1P/CC2P = 0, normal(non-invert) input */
    TIM3->DIER = 1;     /* Update */
    TIM3->CR1 |= 1;     /* run */

    NVIC_EnableIRQ(TIM3_IRQn);
    /* ------------------------------- EXTI-Line2 编码器接口 I signal ------------------------- */
    EXTI->IMR  |= 1 << 2;
    EXTI->RTSR |= 1 << 2;
    AFIO->EXTICR[0] = (AFIO->EXTICR[0] & ~(0xful << 8)) | (3 << 8);   /* PD2 */
    NVIC_EnableIRQ(EXTI2_IRQn);

使用特权

评论回复
5
梦翔青春|  楼主 | 2015-8-1 08:15 | 只看该作者
戈卫东 发表于 2015-7-31 20:25
寄存器版本的。。。。。。。。库函数我不会。。。。。。

    /* ------------------------------- TIM3 编 ...

谢谢呀,只可惜这个我看不懂:'(

使用特权

评论回复
6
为生活而努力| | 2015-8-1 10:29 | 只看该作者
最近做的东西中也有正交编码器,之前用高级TIM1一直不行,换了TIM4就可以了,看了你的程序,配置大概没有问题,你换个TIM4试试

使用特权

评论回复
7
梦翔青春|  楼主 | 2015-8-1 10:50 | 只看该作者
为生活而努力 发表于 2015-8-1 10:29
最近做的东西中也有正交编码器,之前用高级TIM1一直不行,换了TIM4就可以了,看了你的程序,配置大概没有问 ...

谢谢啦,能把你的程序发一份参考一下不:hug:

使用特权

评论回复
8
梦翔青春|  楼主 | 2015-8-1 11:11 | 只看该作者
就目前来看主要是TIM3没有值,令CurrentCount = TIM_GetCapture1(TIM3);发现CurrentCount始终为零,请问大神该如何调试,急需帮助。谢谢:hug:

使用特权

评论回复
9
为生活而努力| | 2015-8-1 15:05 | 只看该作者
#include "encode.h"

#define ENCODER_TIM_PERIOD 38500      //编码器转一圈产生的脉冲数


//配置编码器端口
void Encode_GPIO_Config(void)
{
                        GPIO_InitTypeDef GPIO_InitStructure;
       
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟
       
                        GPIO_StructInit(&GPIO_InitStructure);
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

// TIM1中断优先级配置
void TIM4_NVIC_Configuration(void)
{
                        NVIC_InitTypeDef NVIC_InitStructure;
                       
                        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
                  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  
                        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
                        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                        NVIC_Init(&NVIC_InitStructure);
}


void TIM4_Configuration(void)
{
                        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
                        TIM_ICInitTypeDef TIM_ICInitStructure;
                        //时钟源
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
               
                        TIM_DeInit(TIM1);
                        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
       
                        TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  
                        //TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1;  //设置自动重装载值
                        TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD-1;
                        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
                        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
                        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
               
       
            //编码器接口配置
                        TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,
         TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
                                 
                        TIM_ICStructInit(&TIM_ICInitStructure);   //设置缺省默认值
                        TIM_ICInitStructure.TIM_ICFilter =6;      
                        //选择输入比较滤波器初始化
                        TIM_ICInit(TIM4, &TIM_ICInitStructure);   
                       
                        // Clear all pending interrupts
                        TIM_ClearFlag(TIM4, TIM_FLAG_Update);
                        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);

//                        TIM1->CNT =0;
                        //CurrentCount = TIM1->CNT;
                        TIM_Cmd(TIM4, ENABLE);
}
void Encode_Init(void)
{
                    Encode_GPIO_Config();
              TIM4_NVIC_Configuration();
              TIM4_Configuration();             
}


/*********************************************END OF FILE**********************/


主函数部分
       
                while(1)
                {
                        if ( time == 20 ) /* 1000 * 1 ms = 1s ʱ¼äµ½ */
                        {
                                 time = 0;
                                 temp=TIM_GetCounter(TIM4);
                                 __NOP();                       
                        }        
                }
}

中断部分
/*********************************************END OF FILE**********************/

void TIM4_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)   
    {  
                TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

                if(1==((TIM4->CR1)&0x0010)>>4)  
                {                 
                        Direction--;
                                                                              __NOP();
                }

                if(0==((TIM4->CR1)&0x0010)>>4)  
                {                 
                        Direction++;
                                                                              __NOP();
                }
    }  
}


使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
梦翔青春 + 1 赞一个!
10
梦翔青春|  楼主 | 2015-8-1 16:03 | 只看该作者
  非常感谢,不过设置TIM4为什么要令TIM1->CNT =0;我看了好多这样的例子,例如设TIM3令TIM2->CNT =0等等,这是什么意思,能帮忙解答一下吗,谢谢:hug::hug::hug:

使用特权

评论回复
11
李冬发| | 2015-8-1 16:57 | 只看该作者
用外部中断吧,其中一个做时钟,这个接外部中断,另一个做为数据。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
梦翔青春 + 1 很给力!
12
梦翔青春|  楼主 | 2015-8-1 20:34 | 只看该作者
李冬发 发表于 2015-8-1 16:57
用外部中断吧,其中一个做时钟,这个接外部中断,另一个做为数据。

谢谢帮助:hug:

使用特权

评论回复
13
戈卫东| | 2015-8-1 20:56 | 只看该作者
是不是编码器没有信号?

使用特权

评论回复
14
机械嘎嘎| | 2015-8-2 09:21 | 只看该作者
用示波器看看编码器的输出是否正常。曾遇到过相同的问题,STM32检测不到编码器的输入,后来发发现是编码器没有输出,编码器工作电压不够,后来更换编码器电源后就正常。

使用特权

评论回复
15
梦翔青春|  楼主 | 2015-8-2 13:02 | 只看该作者
戈卫东 发表于 2015-8-1 20:56
是不是编码器没有信号?

是的,本来没一点反应。可是后来我把TIM3->CNT = 0;去掉了,然后动一下编码器显示就什么也没了

使用特权

评论回复
16
梦翔青春|  楼主 | 2015-8-2 13:03 | 只看该作者
机械嘎嘎 发表于 2015-8-2 09:21
用示波器看看编码器的输出是否正常。曾遇到过相同的问题,STM32检测不到编码器的输入,后来发发现是编码器 ...

好的,谢谢啊:hug::hug::hug:

使用特权

评论回复
17
专注于嵌入式| | 2015-8-2 13:27 | 只看该作者
梦翔青春 发表于 2015-8-1 08:15
谢谢呀,只可惜这个我看不懂

:lol离了库函数就看不懂了???

使用特权

评论回复
18
梦翔青春|  楼主 | 2015-8-2 13:33 | 只看该作者
专注于嵌入式 发表于 2015-8-2 13:27
离了库函数就看不懂了???

哈哈,没办法呀,自己比较菜鸟:$

使用特权

评论回复
19
lefeng| | 2015-8-2 21:10 | 只看该作者
先用示波器看看编码器的输出是否正常

使用特权

评论回复
20
lwsn| | 2015-8-2 21:42 | 只看该作者
把TIM3->CNT = 0;去掉了,然后动一下编码器显示就什么也没了,这是什么情况

使用特权

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

本版积分规则

4

主题

25

帖子

0

粉丝