谁有正交编码器的的例程,单独捕获A信号,和B信号,在网上找了好久都是断断续续的,看不懂

2019-07-20 03:11发布


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
逸雨
2019-07-20 11:26
123将321 发表于 2019-1-10 18:14
这个是STM32F407的使用,不过你要搞懂原理,因为要考虑到编码器的参数进行设置定时器的相关参数的,注意编 ...

///**************************************************************************
//函数功能:单位时间读取编码器计数
//入口参数:定时器
//返回  值:速度值
//**************************************************************************/
int Read_Encoder(u8 TIMX)
{
    int Encoder_TIM;   
   switch(TIMX)
     {
       case 2:  Encoder_TIM= (int)TIM4 -> CNT;  TIM4 -> CNT=0;break;
         default:  Encoder_TIM=0;
     }
        return (int)Encoder_TIM;
}
//***********读计数TIM4个数**************
int TIM4_Encoder_Read(void)
{
    s16 data;
    data=(s16)(TIM_GetCounter(TIM4));//获取timx计数器值
                                                                                                                                           //其中x可以从1到17来选择Tim外围设备。
                                                                                                                                                 //计数器寄存器值。
    return (int)data;
}

//***************TIM4计数寄存器赋值***********
void TIM4_Encoder_Write(int data)
  {
    TIM4->CNT = data;
  }

//*****************TIM4用于编码模式*************
void TIM4_Configuration(void)
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能由APB1控制的TIM4端口时钟
    TIM_DeInit(TIM4);   //TIM4初始化
     
    //GPIO配置PB6,PB7
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   //使能PB端口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //PB6,PB7 浮空输入
    GPIO_Init(GPIOB,&GPIO_InitStructure);
     
    //TIM4编码模式
    TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
        /*
        配置timx编码器接口。*@param timx:其中x可以是1、2、3、4、5或8,以选择Tim外围设备。
        *@param Tim_encodermode:指定timx编码器模式。*此参数可以是以下值之一:
        *@Arg   Tim_encodermode_ti1:根据ti2fp2级别对ti1fp1边进行计数器计数。
        *@Arg   Tim_encoderMode_TI2:根据ti1fp1级别在ti2fp2边缘上计数器。
        *@Arg   Tim_encodermode_ti 12:计数器计数ti1fp1和ti2fp2边缘,这取决于其他输入的级别。
        *@param Tim_ic1极性:指定iC1极性*此参数可以是以下值之一:
        *@Arg   Tim_ic极性_Fall:IC下降边缘。*@Arg Tim_ic极性上升:IC
        */
     
    /* Time Base configuration */
    TIM_TimeBaseStructure.TIM_Prescaler = 0;                //不分频
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;              //设置计数器溢出后的重载初值
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);         //用以上参数初始化定时器时间基础模块     

    TIM_Cmd(TIM4, ENABLE);  //使能定时器4
}
int main(void)
{       
         int Speed,Number;//定义一个变量接收速度值
        delay_init();                     //延时函数初始化         
        LED_Init();                          //初始化与LED连接的硬件接口
        //TIM3_PWM_Init(8999,0);//不分频。PWM频率=72000/(899+1)=80Khz
         TIM4_Configuration();
         
         //arr=8999;
         /*
         频率:
//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
         */
        // dutyCircle(50,2);//占空比,频率
         while(1)
         {
                 Number=TIM4_Encoder_Read();//得到个数
                 Speed=Read_Encoder(4);//得到速度

         }

}
这个是我在网上找的我也不知道对不对

一周热门 更多>