OpenEdv-开源电子网

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

STC32使用内部晶振与编码器冲突,编码器采集不到数值。

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-8-12
在线时间
0 小时
发表于 2016-8-12 20:54:54 | 显示全部楼层 |阅读模式
我是一名大二学生,请各位前辈帮帮忙。
这是使用内部晶振HSI的代码,定时准确。
void SystemInit (void)
{
         /* Set HSION bit */
                RCC->CR |= (uint32_t)0x00000001;

                // select HSI as PLL source
                RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2;        


                RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL9;

                 /* HCLK = SYSCLK/1      */
            RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

                /* Enable PLL */
            RCC->CR |= RCC_CR_PLLON;

            /* Wait till PLL is ready */
            while((RCC->CR & RCC_CR_PLLRDY) == 0)
            {
            }
            /* Select PLL as system clock source */
            RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
            RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

                /* Wait till PLL is used as system clock source */
            while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
            {
            }
}












这是编码器的配置,为什么电机能转,定时也准确,就是采集不到编码器的值。
void TIM3_Configuration(void)               
{        
  GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef  TIM_ICInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
                                                                                               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
        GPIO_WriteBit(GPIOA, GPIO_Pin_6,Bit_SET);
        GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET);

  TIM_TimeBaseStructure.TIM_Period = ECDPeriod;           
        TIM_TimeBaseStructure.TIM_Prescaler = 0;               
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;         
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

   
        TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
        TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;     
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);   
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  TIM3->CNT = 0;
        TIM_Cmd(TIM3, ENABLE);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
  TIM_TimeBaseStructure.TIM_Prescaler =48-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;      
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

  TIM_UpdateRequestConfig(TIM4,TIM_UpdateSource_Regular);
  TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
  TIM_Cmd(TIM4,ENABLE);
        
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;         
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 15;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
        
}

EncoderType GetEncoder;

double Get_Encoder_TWO(void)
{
  s32 CNT3_temp,CNT3_last;////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  GetEncoder.cnt3 = TIM3 -> CNT;
  CNT3_last = GetEncoder.CNT3;
  CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
  GetEncoder.V3 = CNT3_temp - CNT3_last;               

  while ((s32)(GetEncoder.V3)>Vbreak)                                 
  {                                                              
   GetEncoder.rcnt3--;                                             
   CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
   GetEncoder.V3 = CNT3_temp - CNT3_last;                 
  }                                                            
  while ((s32)(GetEncoder.V3)<-Vbreak)                           
  {                                                              
   GetEncoder.rcnt3++;                                             
   CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
   GetEncoder.V3 = CNT3_temp - CNT3_last;                 
  }
        
  GetEncoder.CNT3 = CNT3_temp;               
        
  return CNT3_temp;
}                                                                                                               
/*
这是在stm32f10x_it.c文件中的代码。
void TIM3_IRQHandler(void)                  
{
  if (TIM3 -> CR1 & 0X0010)                          
   {
    GetEncoder.rcnt3 -= 1;
   }
   else GetEncoder.rcnt3 += 1;

   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}

void TIM4_IRQHandler(void)
{
         Encoder=Get_Encoder_TWO();
                 User_Cycles();
//Moto1=Incremental_PI (650, 500);
  time=time+1;
        time2=time2+1;
TIM_ClearITPendingBit(TIM4,TIM_FLAG_Update);
}
请各位前辈指点我。

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

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-8-13 09:59:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 00:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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