1回答

0收藏

stm32 编码器模式

STMCU STMCU 6272 人阅读 | 1 人回复 | 2013-12-27

有没有谁用过stm32f103系列的单片机的高级定时的编码器模式。我现在已经可以读到编码器的数据,虽然开了中断(记满数进入中断),但是不能进入中断,数据溢出导致不能测距。哪位高手发一个例程???
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

大米周822

发表于 2013-12-27 14:05:39 | 只看该作者

这是我写的代码,高手帮忙看看那里有问题。
void TIM1_Encoder_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;                                        //定义一个GPIO结构体变量
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                //定义一个定时器结构体变量
  TIM_ICInitTypeDef TIM_ICInitStructure;                                //定义一个定时器编码器结构体变量

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);        //使能定时器1
  
  GPIO_InitStructure.GPIO_Pin = MR_AIN|MR_BIN;                        //配置PA8->TIM1_CH1,PA9->TIM1_CH2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //设置50MHz时钟
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                        //设置为下拉输入模式
  GPIO_Init(MRIN_PORT, &GPIO_InitStructure);
  TIM_DeInit(TIM1);                                                                                // Timer configuration in Encoder mode
  TIM_TimeBaseStructure.TIM_Period = 0xffff;                        //计数器最大值       
  TIM_TimeBaseStructure.TIM_Prescaler = 0;                                //时钟不分频
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;                        // 使用的采样频率之间的分频比例
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上计数
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                //初始化定时器1

  TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12,TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;
  TIM_ICInit(TIM1, &TIM_ICInitStructure);

  TIM_ClearFlag(TIM1, TIM_FLAG_Update);

  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                        //打开定时器1中断
  TIM_SetCounter(TIM1, 0);
  TIM_Cmd(TIM1, ENABLE);                                                                  //计数器使能,开始计数
}
/***********************************************************************************************************
* 函数名称: TIM1_UP_IRQHandler()
* 输入参数: 无
* 输出参数: 无
* 功    能: 定时器1中断程序
************************************************************************************************************/
void TIM1_UP_IRQHandler(void)                       
{
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
        {
    TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
                if(GetMotorRDirection())
                        MotorRCounter--;
                else
                        MotorRCounter++;               
        }
}
/***********************************************************************************************************
* 函数名称: Timer1_NVIC_Configuration()
* 输入参数: 无
* 输出参数: 无
* 功    能: 定时器1中断配置程序
************************************************************************************************************/
void Timer1_NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条