OpenEdv-开源电子网

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

寄存器版 读正交编码器的值,测试成功

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-4-27
在线时间
4 小时
发表于 2016-5-7 15:01:16 | 显示全部楼层 |阅读模式
encoder.c

#include "encoder.h"
//encoder.INPUT_B---PA6(TIM3_CH1)
//encoder.INPUT_A---PA7(TIM3_CH2)
u16 OldCNT=0;
int CNTFlowFlag=0;
void TIM_EncoderInterfaceConfig( uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
//定时器3中断服务程序         
void TIM3_IRQHandler(void)
{                                                                   
        if(TIM3->SR&0X0001)//溢出中断
        {
                CNTFlowFlag=1;
        }                                  
        TIM3->SR&=~(1<<0);//清除中断标志位             
}
void Encoder_Configuration(void)
{
        RCC->APB1ENR|=1<<1;           //TIM3 时钟使能
        RCC->AHB1ENR|=1<<0;           //使能PORTA时钟       
        GPIO_Set(GPIOA,PIN6,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//复用功能,下拉
        GPIO_Set(GPIOA,PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//复用功能,下拉
        GPIO_AF_Set(GPIOA,6,2);        //PA0,AF2
        GPIO_AF_Set(GPIOA,7,2);        //PA0,AF2
        TIM_EncoderInterfaceConfig(TIM_EncoderMode_TI12,TIM_ICPolarity_Falling,TIM_ICPolarity_Falling);
          
        TIM3->DIER|=1<<0;   //允许更新中断          
          MY_NVIC_Init(1,3,TIM3_IRQn,2);        //抢占1,子优先级3,组2       
    TIM3->CR1|=0x01;            //使能定时器3
          
}
void TIM_EncoderInterfaceConfig( uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
{
  uint16_t tmpsmcr = 0;
  uint16_t tmpccmr1 = 0;
  uint16_t tmpccer = 0;   
  /* Get the TIMx SMCR register value */
  tmpsmcr = TIM3->SMCR;
  /* Get the TIMx CCMR1 register value */
  tmpccmr1 = TIM3->CCMR1;
  /* Get the TIMx CCER register value */
  tmpccer = TIM3->CCER;
  /* Set the encoder Mode
    SMS:从模式选择 (Slave mode selection),011:编码器模式 3––计数器在 TI1FP1 和 TI2FP2 的边沿计数,计数的方向取决于另外一
  个信号的电平。
  */
  tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));
  tmpsmcr |= TIM_EncoderMode;
  /* Select the Capture Compare 1 and the Capture Compare 2 as input
    CC2S[1:0]:01:CC2 通道配置为输入,IC2 映射到 TI2 上
    CC1S[1:0]:01:CC1 通道配置为输入,IC1 映射到 TI1 上。
        */
  tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S)));
  tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;
  /* Set the TI1 and the TI2 Polarities
  CC1 通道配置为输入:CC1NP/CC1P 位可针对触发或捕获操作选择 TI1FP1 和 TI2FP1 的极性。
  00:非反相/上升沿触发
  TIxFP1 未反相 (在门控模式或编码器模式下执行触发操作)。
  01:反相/下降沿触发
  TIxFP1 反相 (在门控模式或编码器模式下执行触发操作)。
  */
  tmpccer &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P)));
  tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));
  /* Write to TIMx SMCR */
  TIM3->SMCR = tmpsmcr;
  /* Write to TIMx CCMR1 */
  TIM3->CCMR1 = tmpccmr1;
  /* Write to TIMx CCER */
  TIM3->CCER = tmpccer;
}

int Encoder_Get_CNT(void)
{
        u16 NewCNT=0;
        int CNT;
        NewCNT=TIM3->CNT;
        CNT=NewCNT-OldCNT;
        if(CNTFlowFlag==1)
        {   
                if(NewCNT>30000)         CNT=(int)(NewCNT-(65536+OldCNT));
                if(NewCNT<30000)        CNT=(int)(NewCNT+65536-OldCNT);
                CNTFlowFlag=0;
        }               
        OldCNT=NewCNT;       
        return CNT;  
}


encoder.h
#ifndef __ENCODER_H
#define __ENCODER_H         
#include "sys.h"
#define TIM_EncoderMode_TI1                ((uint16_t)0x0001)
#define TIM_EncoderMode_TI2                ((uint16_t)0x0002)
#define TIM_EncoderMode_TI12               ((uint16_t)0x0003)
#define TIM_ICPolarity_Rising             ((uint16_t)0x0000)
#define TIM_ICPolarity_Falling            ((uint16_t)0x0002)
#define TIM_ICPolarity_BothEdge           ((uint16_t)0x000A)
void Encoder_Configuration(void);       
int Encoder_Get_CNT(void);
#endif



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

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-4-27
在线时间
4 小时
 楼主| 发表于 2016-5-7 15:06:00 | 显示全部楼层
除了个别蛛丝错误,代码整体可以拿去用
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-4-27
在线时间
10 小时
发表于 2016-5-22 17:24:36 | 显示全部楼层
楼主,能不能把完整的工程分享下啊,这样更直观
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-4-27
在线时间
4 小时
 楼主| 发表于 2016-5-22 22:43:28 | 显示全部楼层
裴宇758 发表于 2016-5-22 17:24
楼主,能不能把完整的工程分享下啊,这样更直观

完整的是电机速度环
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-4-27
在线时间
4 小时
 楼主| 发表于 2016-5-22 22:44:25 | 显示全部楼层
liuquanli1 发表于 2016-5-22 22:43
完整的是电机速度环

需要的话,单独发你
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-4-27
在线时间
10 小时
发表于 2016-5-23 22:17:35 | 显示全部楼层
929222083@qq.com,先谢谢楼主了
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-1-10
在线时间
5 小时
发表于 2017-2-14 14:07:34 | 显示全部楼层
小白求救!!感谢楼主!286197840@qq.com
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-3-24
在线时间
10 小时
发表于 2017-4-21 15:44:57 | 显示全部楼层
楼主,我也在做这个,但是有些问题,可以请教一下你吗?

u16 TIM2_BianMa=0;



void TIM2_IRQHandler(void)
{
        u16 tsr;
        tsr=TIM2->SR;
        if(tsr&0x01)//ò&#231;3&#246;
        {
                TIM2_BianMa++;
               
        }
         TIM2->SR&=~(1<<0);
}

void TIM2_Encoder_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<0;       //TIM2ê±&#214;óê1&#196;ü
          RCC->APB2ENR|=1<<2;       //ê1&#196;üPORTAê±&#214;ó
       
    GPIOA->CRL&=0XFFFFFF00;   //PA0&#161;¢PA1 &#199;&#229;3y&#214;&#174;&#199;°éè&#214;&#195;
    GPIOA->CRL|=0X00000044;   //PA0&#161;¢PA1 &#184;&#161;&#191;&#213;ê&#228;è&#235;
           
    TIM2->ARR=arr;            //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
    TIM2->PSC=psc;            //&#212;¤·&#214;&#198;μ&#198;÷

        TIM2->CCMR1 |= 1<<0;          //ê&#228;è&#235;&#196;£ê&#189;£&#172;IC1FP1ó3é&#228;μ&#189;TI1é&#207;
        TIM2->CCMR1 |= 1<<8;          //ê&#228;è&#235;&#196;£ê&#189;£&#172;IC2FP2ó3é&#228;μ&#189;TI2é&#207;
        TIM2->CCER |= 0<<1;                  //IC12&#187;·′&#207;ò
        TIM2->CCER |= 0<<5;           //IC22&#187;·′&#207;ò
  TIM2->SMCR |= 3<<0;                  //&#203;ùó&#195;ê&#228;è&#235;&#190;ù&#212;úé&#207;éy&#209;&#216;&#187;ò&#207;&#194;&#189;μ&#209;&#216;óDD§
       
       
        TIM2->DIER|=1<<3;           //&#212;êDí2&#182;&#187;&#241;&#214;D&#182;&#207;                               
        TIM2->DIER|=1<<0;           //&#212;êDí&#184;üD&#194;&#214;D&#182;&#207;       
  TIM2->CR1 |=1<<0;                  //ê1&#196;ü&#188;&#198;êy&#198;÷
       
        MY_NVIC_Init(1,0,TIM2_IRQn,3);//&#199;à&#213;&#188;2£&#172;×óó&#197;&#207;è&#188;&#182;0£&#172;×é2          
}
//&#188;&#198;êy&#188;&#196;′&#230;&#198;÷&#184;3&#214;μ
void TIM2_Encoder_Write(int data)
{
    TIM2->CNT = data;
}
//&#182;á&#188;&#198;êy&#184;&#246;êy
u32 TIM2_Encoder_Read(void)
{
          u32 temp0=0;
    TIM2_Encoder_Write(0);        //&#188;&#198;êy&#198;÷&#199;&#229;0
          delay_ms(500);          //&#188;ì2aê±&#188;&#228;£&#172;&#191;éμ÷&#189;ú
       
                  temp0=TIM2_BianMa;
          printf("111:%d\n",temp0);
            temp0*=65535;
            temp0+=TIM2->CNT;
       
    return (temp0/4);           //êy&#190;YààDí×a&#187;&#187;
                             //&#188;&#199;&#194;&#188;±&#223;&#209;&#216;±&#228;&#187;ˉ′&#206;êy£¨&#195;&#191;&#184;&#246;&#213;¤&#184;&#241;±&#187;&#188;&#199;&#194;&#188;4′&#206;£&#169;&#203;ùò&#212;òa&#207;è3y4
        TIM2_BianMa=0;
}

回复 支持 反对

使用道具 举报

8

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-1-26
在线时间
9 小时
发表于 2018-8-12 00:01:27 | 显示全部楼层
楼主能不能也发我一分呀
回复 支持 反对

使用道具 举报

8

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-1-26
在线时间
9 小时
发表于 2018-8-12 00:03:55 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-8-28
在线时间
1 小时
发表于 2018-8-29 14:35:09 | 显示全部楼层
1798180045@qq.com谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2018-7-26
在线时间
24 小时
发表于 2018-11-12 14:43:57 | 显示全部楼层
求发一份
2993188506@qq.com
谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-12-13
在线时间
8 小时
发表于 2018-12-12 14:46:09 | 显示全部楼层
需要完整工程 led-power@qq.com
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2019-1-18
在线时间
14 小时
发表于 2019-2-19 14:06:10 | 显示全部楼层
楼主能发给我一份吗409984507@qq.com,谢谢!
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-4-12
在线时间
6 小时
发表于 2019-4-22 15:07:37 | 显示全部楼层
565454492@qq.com 谢谢楼主
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-4-25
在线时间
1 小时
发表于 2019-4-25 17:18:57 | 显示全部楼层
求发一份谢谢楼主,诚谢 18810969284@163.com
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-5-5
在线时间
18 小时
发表于 2019-7-3 15:46:20 | 显示全部楼层
1813298696@qq.com能不能发一下 谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-8-17
在线时间
0 小时
发表于 2019-8-17 11:45:52 | 显示全部楼层
感谢楼主  性感小白,在线源码  2913120880@qq.com  
回复 支持 反对

使用道具 举报

6

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2013-9-9
在线时间
92 小时
发表于 2019-8-17 14:15:55 | 显示全部楼层
53637455@qq.com,谢谢楼主,我也要一份
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-4-17
在线时间
2 小时
发表于 2020-1-12 17:55:35 | 显示全部楼层
1253491646@qq.com楼主求完整程序
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2020-6-1
在线时间
15 小时
发表于 2020-6-15 15:15:23 | 显示全部楼层
516974620@qq.com  谢谢楼主啦
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-8-17
在线时间
5 小时
发表于 2020-8-26 15:12:34 | 显示全部楼层
楼主可以要一份源码参考吗 marshellhu@qq.com
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-9-28
在线时间
9 小时
发表于 2020-12-16 17:19:51 | 显示全部楼层
完整工程,,谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-9-28
在线时间
9 小时
发表于 2020-12-16 17:20:20 | 显示全部楼层
ljc1999 发表于 2020-12-16 17:19
完整工程,,谢谢楼主

952813664@qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 08:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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