OpenEdv-开源电子网

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

用输入捕获读取编码器脉冲,但是编码器转的快一点就会漏掉好多脉冲。

[复制链接]

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
发表于 2016-3-10 11:36:10 | 显示全部楼层 |阅读模式
1金钱
慢慢转动编码器蛮准的,加快速度之后,单片机读取的脉冲数量就不准了。

最佳答案

查看完整内容[请看2#楼]

STM32有编码模式,你这种场景不应该用输入捕获
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 11:36:11 | 显示全部楼层
STM32有编码模式,你这种场景不应该用输入捕获
回复

使用道具 举报

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
 楼主| 发表于 2016-3-11 07:57:51 | 显示全部楼层
xkwy 发表于 2016-3-10 13:45
STM32有编码模式,你这种场景不应该用输入捕获

因为我照着手册弄了一遍编码器模式,可是一点反应都没有,又查不出哪里出了问题,所以用了输入捕获。能不能加个QQ谈谈?
回复

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
发表于 2016-7-18 16:27:09 | 显示全部楼层
楼主可以放上完整代码参考一下吗,谢谢
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-7-18 17:14:20 | 显示全部楼层
void TIM4_Mode_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;          

        //PB6 ch1  A,PB7 ch2
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能TIM4时钟       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOA时钟
       
        GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 PA7浮空输入       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                           

        NVIC_Config(2);

        TIM_DeInit(TIM4);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //设定计数器重装值   TIMx_ARR = 359*4
        TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM3时钟预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//设置时钟分割 T_dts = T_ck_int       
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);              
                 
        TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数
        TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入
        TIM_ICInitStructure.TIM_ICFilter = 6;  //选择输入比较滤波器
        TIM_ICInit(TIM4, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM3
       
//        TIM_ARRPreloadConfig(TIM4, ENABLE);//使能预装载
        TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM3的更新标志位
        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//运行更新中断
        //Reset counter
        TIM4->CNT = 0;//

        TIM_Cmd(TIM4, ENABLE);   //启动TIM4定时器

}
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-7-18 17:40:27 | 显示全部楼层
void TIM4_Mode_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;          

        //PB6 ch1  A,PB7 ch2
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能TIM4时钟       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
       
        GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PB6 PB7浮空输入       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                           

        NVIC_Config(2);

        TIM_DeInit(TIM4);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //设定计数器重装值   TIMx_ARR = 359*4
        TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM3时钟预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//设置时钟分割 T_dts = T_ck_int       
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);              
                 
        TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数
        TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入
        TIM_ICInitStructure.TIM_ICFilter = 6;  //选择输入比较滤波器
        TIM_ICInit(TIM4, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM3
       
//        TIM_ARRPreloadConfig(TIM4, ENABLE);//使能预装载
        TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM3的更新标志位
        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//运行更新中断
        //Reset counter
        TIM4->CNT = 0;//

        TIM_Cmd(TIM4, ENABLE);   //启动TIM4定时器

}
void TIM4_IRQHandler(void)
{        
        if(TIM4->SR&0x0001)//溢出中断
        {
        TIM4->SR&=~(1<<0);//清除中断标志位        
               
        }       
        flag1=flag1+flag11;
               
}
u16 jishu1=0;
u16 jishu2=0;
int jishuflag=0;
volatile u32 flag1;
extern volatile int flag11;
volatile u32 flag2;
extern volatile int flag22;
int sendbuff[14];
int main(void)
{               
        u16 count1=0;//编码器1计数
        u16 count2=0;//编码器2计数
        u16 i=0;
        uart_init(115200);         //串口初始化为115200
        TIM4_Init();//定时器编码器接口初始化
        TIM3_Init();
         printf("%c,%c\r\n",TIM3->CR1,TIM4->CR1);
        while(1)
        {
               
                printf("count1 = %d\n,flag= %d\n,count2=%d\n,flag2=%d\r\n",count1+16384*flag1,flag1,count2+16384*flag2,flag2);               
                count1= TIM4->CNT/4;//获取计数值
                count2= TIM3->CNT/4;//获取计数值
                if(count1>8000)
                {
                        flag11=1;
                }
                else if(count1<8000)
                {
                        flag11=-1;
                }
                if(count2>8000)
                {
                        flag22=1;
                }
          else        if(count2<8000)
                {
                        flag22=-1;
                }
       

        }         
}
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-7-18 17:40:49 | 显示全部楼层
上面是我自己写的不过很可惜只有一路可以用
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-7-18 17:41:04 | 显示全部楼层
编码器连PB6,7
回复

使用道具 举报

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
 楼主| 发表于 2016-7-19 09:58:43 | 显示全部楼层
我不是萌妹子 发表于 2016-7-18 17:40
上面是我自己写的不过很可惜只有一路可以用

什么叫只有1路可以用?
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-7-21 08:49:43 | 显示全部楼层
Elric_QZH 发表于 2016-7-19 09:58
什么叫只有1路可以用?

本来我写的是可以测俩个编码器,后来实测只能测一个编码器
回复

使用道具 举报

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
 楼主| 发表于 2016-7-21 12:06:23 | 显示全部楼层
我不是萌妹子 发表于 2016-7-21 08:49
本来我写的是可以测俩个编码器,后来实测只能测一个编码器

配置没弄好吧,一个可以,另一个肯定也可以。
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-7-22 15:06:25 | 显示全部楼层
Elric_QZH 发表于 2016-7-21 12:06
配置没弄好吧,一个可以,另一个肯定也可以。

当时没弄出来,后来也没管,你试试看能不能搞出来
回复

使用道具 举报

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
 楼主| 发表于 2016-7-23 19:36:10 | 显示全部楼层
我不是萌妹子 发表于 2016-7-22 15:06
当时没弄出来,后来也没管,你试试看能不能搞出来

我后来自己弄好了,就是自己没配置好。
回复

使用道具 举报

11

主题

56

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-7
在线时间
48 小时
发表于 2016-10-31 13:43:43 | 显示全部楼层
Elric_QZH 发表于 2016-7-23 19:36
我后来自己弄好了,就是自己没配置好。

那我看看你的代码行不
回复

使用道具 举报

18

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2015-8-13
在线时间
84 小时
 楼主| 发表于 2016-10-31 16:05:08 | 显示全部楼层
我不是萌妹子 发表于 2016-10-31 13:43
那我看看你的代码行不

我用寄存器写的,你要看?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 16:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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