OpenEdv-开源电子网

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

F407 编码器可以这样写吗, 求助求助,

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-17
在线时间
4 小时
发表于 2019-12-22 17:03:49 | 显示全部楼层 |阅读模式
1金钱
我不是很懂 TIM的那个编码器模式,所以我自己按照自己的原理写了一个,但不知道是自己的原因还是编码器问题,采集不到数。
我的思路如下:
            我用的编码器是双相的 即AB相的。我先写了两个外部中断,这两个外部中断的 触发条件是,上升沿触发,在中断服务函数中计数,触发一次记一次数。之后再写一个定时器函数,在定时器的中断服务函数中 用脉冲数乘以周长再除以时间,得到速度。
现象:
            我转动编码器时 ,在显示屏上的speed 没有改变。
背景:
        如果我将上述的两个外部中断改成按键的,我每按一次按钮,显示屏speed都会改变。

问题:
             我不知道是 我对编码器的原理有误解还是程序写的有问题,又或者是这个编码器就是坏的。

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

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-17
在线时间
4 小时
 楼主| 发表于 2019-12-22 17:07:01 | 显示全部楼层
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "oled.h"
#include "bmp.h"
#include "timer.h"

#define KEY0         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10)


void TIM3_Init1(u16 arr,u16 psc);
void TIM2_Init1(u16 arr,u16 psc);
void GPIO_KEY();
void EXTIX_Init() ;


u32          flag_times=0;                                          //Âö³å´ÎÊý
int          flag_times_1=0;                                        //Âö³å´ÎÊý
int          P=20;
int                 I=10;
int                 D=10;
extern u32 speed;
u16  curCount ;


        /****
       
       
        主函数
       
        ****/
int main()
{
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
         delay_init(168);
         TIM3_Init1(4399,8999);                        //5000-1 == 500ms
         TIM2_Init1(360,0);
         LED_Init();
         OLED_Init();
         GPIO_SetBits(GPIOF,GPIO_Pin_9);
         EXTIX_Init();
         
         
        while(1)
         {                 
                        curCount = TIM3->CNT;         
                        OLED_ShowString(0,1,"P=",16);//P
                  OLED_ShowNum         (25,1,P,4,16);
                  OLED_Refresh();
                  OLED_ShowString(0,15,"I=",16);
                  OLED_ShowNum   (25,15,I,4,16);                                        //I
                  OLED_ShowString(0,30,"D=",16);
                  OLED_ShowNum         (25,30,D,4,16);                                        //D
                  OLED_ShowString(0,45,"V=",16);
                  OLED_ShowNum         (25,45,speed,4,16);                                        //speed

                 
         }
       
}




/***

外部


****/
void TIM3_EncoderInit()
{
    GPIO_InitTypeDef  GPIO_InitStructure;                                                                         //GPIO
       
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);         
                //GPIO
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10|GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;                                                                                //ÊäÈë
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;       
    GPIO_Init(GPIOE,&GPIO_InitStructure);
//    GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_TIM4);                      //¸´ÓÃ
//                GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_TIM4);                      //¸´ÓÃ
               
}

//A10ÍⲿÖжÏ
void EXTIX_Init()                                                                                                                                                                                                  
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);                                                //ʹÄÜSYSCFGʱÖÓ
        TIM3_EncoderInit();
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource10);                //ÉèÖÃIO¿ÚÓëÖжÏÏßµÄÓ³Éä¹ØÏµ
       
        EXTI_InitTypeDef EXTIX_Init;
        NVIC_InitTypeDef NVIC_Init1;
       
        /*ÖжÏÅäÖÃ*/
        EXTIX_Init.EXTI_Line                =EXTI_Line10;                                                //4ͨµÀ
        EXTIX_Init.EXTI_LineCmd =ENABLE;                                                               
        EXTIX_Init.EXTI_Mode                =EXTI_Mode_Interrupt ;        //ÖжÏorʼþ
        EXTIX_Init.EXTI_Trigger =EXTI_Trigger_Rising;          // Rising Falling
        EXTI_Init(& EXTIX_Init);
       
        NVIC_Init1.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_Init1.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init1.NVIC_IRQChannelPreemptionPriority=1;                //ÇÀÕ¼ÓÅÏȼ¶
        NVIC_Init1.NVIC_IRQChannelSubPriority=1;                                        //ÏìÓ¦ÓÅÏȼ¶
        NVIC_Init(& NVIC_Init1);
       
}
void EXTI15_10_IRQHandler()
{
        flag_times=flag_times+1;
        delay_ms(10);
        //Èç¹ûÊǰ´¼üµÄ»°
        if (KEY0==1 )
                D++;
       
        EXTI_ClearITPendingBit(EXTI_Line10);
}



回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-17
在线时间
4 小时
 楼主| 发表于 2019-12-22 17:07:53 | 显示全部楼层
#include  "timer.h"
#include "sys.h"

extern u32 flag_times,P,I,D;       
u32 speed=0;
extern  u32 curCount;



void TIM3_Init1(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef timer;
        NVIC_InitTypeDef NVIC_Init1;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE );                                //ʹÄÜʱÖÓ

        timer.TIM_Period                                =arr;                                       
        timer.TIM_Prescaler                        =psc;                                                       
        timer.TIM_CounterMode                =TIM_CounterMode_Up  ;                                                        //ÏòÏ»òÕßÏòÉϼÆÊý
        timer.TIM_ClockDivision =TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM3, &timer );
       
        TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);                                                                                //¿ªÆôÖÕ¶Ë
       
        NVIC_Init1.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_Init1.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init1.NVIC_IRQChannelPreemptionPriority=1;                //ÇÀÕ¼ÓÅÏȼ¶
        NVIC_Init1.NVIC_IRQChannelSubPriority=3;                                        //ÏìÓ¦ÓÅÏȼ¶
        NVIC_Init(& NVIC_Init1);
       
       
       
//        /*¼ÓÈë²»¶®*/
//       
//         
//    TIM_EncoderInterfaceConfig(TIM5,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//ENCODERģʽÉ趨
//    TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
//    TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//ENCODERģʽΪֱ½Ó
//    TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;                                //ENCODER±ØÐë²»·ÖƵ
//    TIM_ICInitStructure.TIM_ICFilter = 6;  //ÊäÈë±È½ÏÂ˲¨Æ÷
//    TIM_ICInit(TIM3, &TIM_ICInitStructure);//
//               
//               
//        TIM_ClearFlag(TIM3, TIM_FLAG_Update);
//        TIM_ITConfig (TIM3, TIM_IT_Update, ENABLE);
//  TIM5->CNT = 0;
        TIM_Cmd(TIM3,ENABLE);
       
}

//ÖжϷþÎñº¯Êý
void TIM3_IRQHandler ()                                                                                               
{
        D++;
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//GPIO_WriteBit(GPIOF, GPIO_Pin_9 ,~GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_9));
        {
                if (flag_times!=0)
                         speed=flag_times/0.5;       
                else if(flag_times==0)
                         speed=0;
               
                        flag_times=0;
                        TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
        }
}






void TIM2_Init1(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef timer;
        NVIC_InitTypeDef NVIC_Init1;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );                                //ʹÄÜʱÖÓ

        timer.TIM_Period                                =arr;                                       
        timer.TIM_Prescaler                        =psc;                                                       
        timer.TIM_CounterMode                =TIM_CounterMode_Up  ;                                                        //ÏòÏ»òÕßÏòÉϼÆÊý
        timer.TIM_ClockDivision =TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM2, &timer );
       
        TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);                                                                                //¿ªÆôÖÕ¶Ë
       
        NVIC_Init1.NVIC_IRQChannel=TIM2_IRQn;
        NVIC_Init1.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init1.NVIC_IRQChannelPreemptionPriority=1;                //ÇÀÕ¼ÓÅÏȼ¶
        NVIC_Init1.NVIC_IRQChannelSubPriority=3;                                        //ÏìÓ¦ÓÅÏȼ¶
        NVIC_Init(& NVIC_Init1);
       
        TIM_Cmd(TIM2,ENABLE);
       
}


void TIM2_IRQHandler ()                                                                                               
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
         flag_times++;       
        }
}
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-17
在线时间
4 小时
 楼主| 发表于 2019-12-22 17:09:21 | 显示全部楼层
以上是  我主函数的文件和 定时器的文件,我感觉大佬们可不可以主要  指点一下我思路上的漏洞,小生在此谢谢各位大佬们了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-12 09:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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