野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11533|回复: 5

F4定时器做编码器出现问题

[复制链接]
发表于 2016-10-14 17:49:07 | 显示全部楼层 |阅读模式
本帖最后由 qq4222 于 2016-10-14 17:52 编辑

使用平衡小车之家AB相编码器代码,移植到F429板子上,原程序使用定时器2和定时器四做编码器,因为开发板上没有找到TIM4引脚,后改用TIM3但移植过来后发现定时器3编码器并没有数值输出,定时器2却是有的,很是疑惑,程序上并没有发现有哪些不同,求个老师解惑。定时器2,3也没发现有多大区别啊。

代码贴上
  1. void Encoder_Init_TIM3(void)
  2. {
  3.         
  4.                         /*定义一个GPIO_InitTypeDef类型的结构体*/
  5.                         GPIO_InitTypeDef GPIO_InitStructure;
  6.                         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  7.                         TIM_ICInitTypeDef  TIM_ICInitStructure;

  8.                         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能定时器4的时钟
  9.                         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器4的时钟
  10.                         /* GPIO初始化 */
  11.                         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  12.                         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  13.                         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  14.                         /* 配置Tx引脚为复用功能  */
  15.                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  16.                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;  
  17.                         GPIO_Init(GPIOA , &GPIO_InitStructure);
  18.                         /* 连接 PA7 到 GPIO_AF_TIM2*/
  19.                         GPIO_PinAFConfig(GPIOA , GPIO_PinSource7 , GPIO_AF_TIM3);
  20.                         /* 连接 PA6 到 GPIO_AF_TIM2*/
  21.                         GPIO_PinAFConfig(GPIOA , GPIO_PinSource6 , GPIO_AF_TIM3);
  22.                  
  23.                         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  24.                         TIM_TimeBaseStructure.TIM_Prescaler = 0x0;                // 预分频器
  25.                         TIM_TimeBaseStructure.TIM_Period = 65535;                       //设定计数器自动重装值
  26.                         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;           //选择时钟分频:不分频
  27.                         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;      //TIM向上计数  
  28.                         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  29.                         TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //使用编码器模式3,上升沿捕捉
  30.                         TIM_ICStructInit(&TIM_ICInitStructure);
  31.                         TIM_ICInitStructure.TIM_ICFilter = 10;
  32.                         TIM_ICInit(TIM3, &TIM_ICInitStructure);
  33.                         TIM_SetCounter(TIM3,0);
  34.                         TIM_Cmd(TIM3, ENABLE);
  35.         
  36. }
  37. void Encoder_Init_TIM2(void)
  38. {
  39.         
  40.                         /*定义一个GPIO_InitTypeDef类型的结构体*/
  41.                         GPIO_InitTypeDef GPIO_InitStructure;
  42.                         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  43.                         TIM_ICInitTypeDef  TIM_ICInitStructure;

  44.                         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能定时器2的时钟
  45.                         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器2的时钟
  46.                         /* GPIO初始化 */
  47.                         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  48.                         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  49.                         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  50.                         /* 配置Tx引脚为复用功能  */
  51.                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  52.                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_5;  
  53.                         GPIO_Init(GPIOA , &GPIO_InitStructure);
  54.                         /* 连接 PA1 到 GPIO_AF_TIM2*/
  55.                         GPIO_PinAFConfig(GPIOA , GPIO_PinSource1 , GPIO_AF_TIM2);
  56.                         /*  连接 PA5 到 GPIO_AF_TIM2*/
  57.                         GPIO_PinAFConfig(GPIOA , GPIO_PinSource5 , GPIO_AF_TIM2);
  58.                  
  59.                         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  60.                         TIM_TimeBaseStructure.TIM_Prescaler = 0x0;              // 预分频器
  61.                         TIM_TimeBaseStructure.TIM_Period = 65535;             //设定计数器自动重装值
  62.                         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    //选择时钟分频:不分频
  63.                         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数  
  64.                         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  65.                         TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3,上升沿捕捉
  66.                         TIM_ICStructInit(&TIM_ICInitStructure);
  67.                         TIM_ICInitStructure.TIM_ICFilter = 10;        //配置输入滤波器
  68.                         TIM_ICInit(TIM2, &TIM_ICInitStructure);
  69.                         TIM_SetCounter(TIM2,0);
  70.                         TIM_Cmd(TIM2, ENABLE);
  71.         
  72. }
复制代码
  1. int main(void)
  2. {        
  3.         u16 Count1,Count2;
  4.         /*``````````延时配置``````````````````````````*/
  5.         SysTick_Init();
  6.                 /*``````````串口配置``````````````````````````*/
  7.         Debug_USART_Config();
  8.         /*``````````系统时钟``````````````````````````*/
  9.         TIMx6_Configuration();
  10.         /*``````````编码计数器配置``````````````````````````*/        
  11. //        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                  //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  12.         Encoder_Init_TIM2();
  13.         Encoder_Init_TIM3();

  14.         /*``````````串口打印测试``````````````````````````*/
  15.         printf("  这是一个串口中断接收  \n\n");
  16.         
  17.   while(1)
  18.         {        
  19.                
  20.                 if(tick_5ms==40)
  21.                 {

  22.                         Count1 = TIM3->CNT;
  23.                         Count2 = TIM2->CNT;
  24.                         printf("\r\n 左编码器值:%d  右编码器值: %d \r\n",Count1,Count2);
  25.                         TIM3->CNT=0;
  26.                         TIM2->CNT=0;        
  27.                         tick_5ms=0;
  28.                         tick_200ms++;
  29.                         if(tick_200ms==20)
  30.                         {
  31.                                 tick_200ms=0;
  32.                         }
  33.                 }
  34.         }        
  35. }
复制代码


QQ截图20161014174059.jpg
QQ截图20161014174127.jpg
QQ截图20161014174750.jpg
回复

使用道具 举报

发表于 2016-10-15 09:21:17 | 显示全部楼层
看不出问题,帮顶
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-15 10:52:03 | 显示全部楼层
flyleaf 发表于 2016-10-15 09:21
看不出问题,帮顶

将定时器3改为定时器5程序数据就正常了,429里定时器2,5计数器分辨率是一样的32位,定时器3,4分辨率是16位的,这之间关系有什么差别吗》?配置的话在哪配置?F1通用定时器分辨率在手册里没见说明啊·····
回复 支持 反对

使用道具 举报

发表于 2018-1-30 19:23:06 | 显示全部楼层
楼主,能分享一波你的代码嘛
回复 支持 反对

使用道具 举报

发表于 2022-8-6 13:14:03 | 显示全部楼层
qq4222 发表于 2016-10-15 10:52
将定时器3改为定时器5程序数据就正常了,429里定时器2,5计数器分辨率是一样的32位,定时器3,4分辨率是16 ...

我也遇到这个问题了 TIM3没问题  TIM2不行  是不是PA0  PA1的问题?
回复 支持 反对

使用道具 举报

发表于 2022-10-7 17:16:52 | 显示全部楼层
今天刚好看到编码器,搜索到这里,32位定时器最大计数为2^32-1,而16位时最大计数为65535,估计这里会产生问题吧?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-24 14:16 , Processed in 0.035837 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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