OpenEdv-开源电子网

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

请教一下大家,关于STM32F103的编码器问题

[复制链接]

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
发表于 2022-10-26 15:24:47 | 显示全部楼层 |阅读模式
10金钱
我用示波器测量了,A+、A-均有规则方波输出,硬件没问题,但是串口没有反应,大家帮我看一下程序
  1. void Encoder_Init_TIM2(void)
  2. {
  3.         /*GPIO??,???TIM2-CH1?TIM2-CH2??,????PA0?PA1*/
  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  5.         TIM_ICInitTypeDef TIM_ICInitStructure;  
  6.         GPIO_InitTypeDef GPIO_InitStructure;

  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //??TIM2
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//??PA

  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //PA0  PA1
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //FLOATING
  11.         GPIO_Init(GPIOA, &GPIO_InitStructure);                         //???

  12.         /*TIM2 ?????*/
  13.         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  14.         TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // ?????
  15.         TIM_TimeBaseStructure.TIM_Period = 0xff;  //????
  16.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //??????:???
  17.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM????  
  18.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  19.          /*?????*/
  20.         TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  21.         TIM_ICStructInit(&TIM_ICInitStructure);
  22.         TIM_ICInitStructure.TIM_ICFilter = 10;
  23.         TIM_ICInit(TIM2, &TIM_ICInitStructure);
  24.         TIM_ClearFlag(TIM2, TIM_FLAG_Update); //??TIM??????
  25.         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  26.         //Reset counter
  27.         TIM_SetCounter(TIM2,0);
  28.         TIM_Cmd(TIM2, ENABLE);
  29. }

  30. //????
  31. int Read_Encoder(u8 TIMX)
  32. {
  33.         int Encoder_TIM;   
  34.         switch(TIMX)
  35.         {
  36.                 case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
  37.                 case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;       
  38.                 case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;       
  39.                 default:  Encoder_TIM=0;
  40.         }
  41.         return Encoder_TIM;
  42. }

  43. //??
  44. void TIM2_IRQHandler(void)
  45. {                                   
  46. if(TIM2->SR&0X0001)//????
  47. {           

  48. }                  
  49. TIM2->SR&=~(1<<0);//?????
  50. }
复制代码
  1. while(1)
  2.         {
  3.                
  4.                
  5.                 if(Read_Encoder(2)>=1000)   //????10???????
  6.                 {
  7.                         printf("ffdfd\r\n");;
  8.                 }
  9.         }
复制代码
串口没有输出

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

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-10-26 15:32:24 | 显示全部楼层
你看,Read_Encoder里有对CNT清0的操作,那是不是永远达不到if条件.
专治疑难杂症
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
 楼主| 发表于 2022-10-26 15:45:44 | 显示全部楼层
LcwSwust 发表于 2022-10-26 15:32
你看,Read_Encoder里有对CNT清0的操作,那是不是永远达不到if条件.

应该怎么改呢,这方面不太懂
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
 楼主| 发表于 2022-10-26 15:51:49 | 显示全部楼层
LcwSwust 发表于 2022-10-26 15:32
你看,Read_Encoder里有对CNT清0的操作,那是不是永远达不到if条件.

我改成这样也没用
  1. int Read_Encoder(u8 TIMX)
  2. {
  3.         int Encoder_TIM;   
  4.         switch(TIMX)
  5.         {
  6.                 case 2:  Encoder_TIM= (short)TIM2 -> CNT;  
  7.         //        TIM2 -> CNT=0;
  8.                 break;
  9.                 case 3:  Encoder_TIM= (short)TIM3 -> CNT;  
  10.         //        TIM3 -> CNT=0;
  11.                 break;       
  12.                 case 4:  Encoder_TIM= (short)TIM4 -> CNT;  
  13.         //        TIM4 -> CNT=0;
  14.                 break;       
  15.                 default:  
  16.         //                Encoder_TIM=0;
  17.         }
  18.         return Encoder_TIM;
  19. }
复制代码
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-10-26 16:44:42 | 显示全部楼层

直接把TIM2 -> CNT用printf发出来看看
专治疑难杂症
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2018-3-26
在线时间
286 小时
 楼主| 发表于 2022-10-27 08:40:13 | 显示全部楼层
LcwSwust 发表于 2022-10-26 16:44
直接把TIM2 -> CNT用printf发出来看看

能发出来,但是都是断断续续的数据
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2022-8-2
在线时间
23 小时
发表于 2023-4-3 19:32:21 | 显示全部楼层
你好,请问你的问题解决了吗?我也遇到一样的问题,想问一下你是怎么解决的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 11:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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