OpenEdv-开源电子网

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

stm32编码器 是如何数据读取函数的 求助

[复制链接]

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
发表于 2016-11-2 11:24:39 | 显示全部楼层 |阅读模式
void TIM1_EncoderConfig(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
        /*ê1Äü¶¨ê±Æ÷ê±Öó*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);

        /*GPIO configuration*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

        TIM_TimeBaseInitStruct.TIM_Period = 65535;
        TIM_TimeBaseInitStruct.TIM_Prescaler = 0;        //2»·ÖÆμ
        TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
        /*ê1Äü×Ô¶ˉÖØÔØÔ¤×°ÔØ*/
        TIM_ARRPreloadConfig(TIM1, ENABLE);

        TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);

        TIM_GenerateEvent(TIM1, TIM_EventSource_Update);
        /*Çå3y¸üD±êÖ¾*/
        TIM_ClearFlag(TIM1, TIM_FLAG_Update);

        /*¶¨ê±Æ÷¿a1Ø*/
        TIM_Cmd(TIM1,ENABLE);       
}

void TIM1_EncoderConfig(void).rar

8.47 KB, 下载次数: 139

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-3 08:56:47 | 显示全部楼层
要学会问问题,这很重要
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 10:21:58 | 显示全部楼层
谢谢,问题找到了。编码器使用的是TIM1.但是没有使用TIM1的 中断。
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 10:22:53 | 显示全部楼层
源程序在tim3定时1ms中断中读取编码器的值。
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 10:24:23 | 显示全部楼层
所以一开始在找tim1的中断处理程序。一直没找到,最后在tim3的1MS中断程序里面有读取。
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 10:49:51 | 显示全部楼层
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
        {       
                TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);
                PID_Control();
        }
}
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 10:50:22 | 显示全部楼层
PID_Control();这里面有处理
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 10:50:46 | 显示全部楼层
pusle_cnt *= 0.99;
        if(TIM1->CNT > 32767)                                                                                //¶¨ê±Æ÷ÏÂòç
                pusle_cnt += (TIM1->CNT - 65536)*0.01;        //Âö3åêy¼õD¡
        else                                                                                                                                        //¶¨ê±Æ÷ÎTòç3ö
                pusle_cnt += TIM1->CNT*0.01;                                         //Âö3åêyÔö¼ó
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 11:02:51 | 显示全部楼层
问题找到了。编码器使用的是TIM1.但是没有使用TIM1的 中断。
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 11:03:11 | 显示全部楼层

void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
        {        
                TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);
                PID_Control();
        }
}
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 11:03:32 | 显示全部楼层

PID_Control();这里面有处理
回复 支持 反对

使用道具 举报

13

主题

88

帖子

0

精华

高级会员

Rank: 4

积分
609
金钱
609
注册时间
2016-8-31
在线时间
82 小时
 楼主| 发表于 2016-11-3 11:03:50 | 显示全部楼层

pusle_cnt *= 0.99;
        if(TIM1->CNT > 32767)                                                                                //¶¨ê±Æ÷ÏÂòç
                pusle_cnt += (TIM1->CNT - 65536)*0.01;        //Âö3åêy¼õD¡
        else                                                                                                                                        //¶¨ê±Æ÷ÎTòç3ö
                pusle_cnt += TIM1->CNT*0.01;                                         //Âö3åêyÔö¼ó
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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