STM32F4 AB相编码模式计数读取失败

2019-07-20 14:14发布

各位大神好:
以下是我STM32F4  TIM9 CH1 CH2  以编码模式读取AB相脉冲计数程序,但 读出来的 TIM9->CNT一直为0  ,请大家帮看看
感谢!

哪位大神帮我看一下 ,我AB相计数 TIM9->CNT 读到的数据一直为0啊。


// ////////////////////////////////////////////////////////////
void T9_Encoder_Configration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;
/* TIM9 clock source enable */
  RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);
//PE5-A相, PE6-B相     
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);//使能GPIOA时钟

  GPIO_StructInit(&GPIO_InitStructure);                     
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;    // 使用PE5,PE6
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;     // 输入模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE,&GPIO_InitStructure);

  /* Timer configuration in Encoder mode */
  TIM_DeInit(TIM9);                   //TIM9复位
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // 设定计数器分频系数为0,不分频
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure);

// 设TIM9为编码模式3
  TIM_EncoderInterfaceConfig(TIM9, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  TIM_ICStructInit(&TIM_ICInitStructure);    // 初始化为默认值
  TIM_ICInitStructure.TIM_ICFilter = 6;
  TIM_ICInit(TIM9, &TIM_ICInitStructure);
  TIM_ClearFlag(TIM9, TIM_FLAG_Update);//清除TIM1的更新标志位
TIM_ITConfig(TIM9, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM9->CNT = 0;
  TIM_Cmd(TIM9, ENABLE);
}
//  TIM9->CNT的内容就是编码器的计数脉冲。



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
houdw2006
2019-07-20 22:14
你的TIM9是作为定时器功能使用的, 所以PE5, PE6不应该初始化为普通输入模式。
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         //推挽输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                 //上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);
       
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9);        // PE5
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9);        // PE6

另外, 你用到了TIM9的Update中断, 需要初始化NVIC和编写中断响应函数.

一周热门 更多>