找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3025|回复: 1
打印 上一主题 下一主题
收起左侧

stm32F103编码器模式 输入捕获预分频无效,求解?

[复制链接]
跳转到指定楼层
楼主
使用的电机是12V的371电机,带光栅编码器,一圈是360线,电机带减速机,减速比是 1:34

加上减速,一圈的脉冲是 360 * 34 = 12240

现在遇到2个问题,

1,一圈的脉冲太高了,因为加上减速机,一圈是12240,算上4倍频,会变成48960,有点吃不销了,也用不上这么精确。


2,很奇怪,按道理算下来,一圈是12440,应该跑完360度,才会激发一次中断,但现在是在180度的时候,就已经产生一次中断,

主要是想解决第1个问题,本来我是想通过输入捕获预分频来控制,如果12240 / 8 = 1530,
可惜怎么试都不行,不知道为什么?

  1. TIM_ICInitTypeDef  IC;
  2. IC.TIM_ICPrescaler = TIM_ICPSC_DIV8;
复制代码

以下是定时器设置模块代码


  1. static void TIM4_Mode_Config(void)
  2. {
  3.     GPIO_InitTypeDef                    GPIO;
  4.     TIM_TimeBaseInitTypeDef     TimeBase;
  5.     TIM_ICInitTypeDef               IC;     

  6.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  8.      
  9.     /*- Õy½»±àÂëÆ÷êäèëòy½Å PB->6   PB->7 -*/
  10.     GPIO.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         
  11.     GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_Mode_IPU ; //GPIO_Mode_IPD;
  12.     GPIO.GPIO_Speed = GPIO_Speed_10MHz;
  13.     GPIO_Init(GPIOB, &GPIO);                           

  14.     /*- TIM4±àÂëÆ÷Ä£ê½ÅäÖà -*/
  15.     TIM_DeInit(TIM4);
  16.     TimeBase.TIM_Period = 12240;
  17.     TimeBase.TIM_Prescaler = 0;
  18.     TimeBase.TIM_ClockDivision =TIM_CKD_DIV1 ;
  19.     TimeBase.TIM_CounterMode = TIM_CounterMode_Up;
  20.     //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  21.     TIM_TimeBaseInit(TIM4, &TimeBase);              
  22.                   
  23.     //TIM_ICStructInit(&IC);                             
  24.     IC.TIM_Channel = TIM_Channel_1 | TIM_Channel_2;
  25.     IC.TIM_ICPolarity = TIM_ICPolarity_Rising;   
  26.     IC.TIM_ICSelection = TIM_ICSelection_DirectTI;
  27.     /////////////////////////////////////////////
  28.     IC.TIM_ICPrescaler = TIM_ICPSC_DIV8;
  29.     /////////////////////////////////////////////
  30.     IC.TIM_ICFilter = 0;         //ÅäÖÃÂË2¨Æ÷
  31.                         
  32.     TIM_ICInit(TIM4, &IC);         
  33.      

  34.     //ÅäÖñàÂëÆ÷Ä£ê½′¥·¢Ô′oí¼«DÔ   
  35.     TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);                     

  36.     TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC1 ,ENABLE);
  37.          
  38.     TIM4->CNT = 0;

  39.     TIM_Cmd(TIM4, ENABLE);
  40. }

  41. void TIM4_IRQHandler(void)
  42. {                                   
  43.         if(TIM4->SR&0X0001)
  44.         {
  45.             
  46.                 u8 dir = TIM4->CR1 & ( 1 << 4 );

  47.                 if(dir == 0x0000) circle += 1;
  48.                 else  circle -= 1;
  49.             
  50.         }                  
  51.         TIM4->SR&=~(1<<0);
  52. }
复制代码

IMG_20180817_201424.jpg (73.44 KB, 下载次数: 43)

IMG_20180817_201424.jpg

IMG_20180817_201328.jpg (59.81 KB, 下载次数: 50)

IMG_20180817_201328.jpg

IMG_20180817_201313.jpg (58.8 KB, 下载次数: 38)

IMG_20180817_201313.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2018-8-18 10:21 | 只看该作者
可以另外设置一个64位变量,每来一次中断把计数值累加进这个变量,然后计数器清零,重新开始计数,这样计数器就不会溢出。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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