STM32F407ZGT6驱动光栅尺

STM32F407ZGT6驱动光栅尺

光栅尺的型号

我在找这个光栅尺的型号和资料上花了挺多时间的,网上根本搜不到这个型号,光栅尺上写的生产公司长春光兴禹恒公司,已经不生产光栅了,它的官网上也没有关于这个光栅尺的资料。最后我把测头拆开,看到有四根线,红黑蓝绿,结合他的型号的最后的两个字母TL,所以我猜测应该是TTL输出,我用万用表测了下,得这几跟线对应的输出口的位置如下图:

STM32F407ZGT6驱动光栅尺_第1张图片
以及光栅尺上的标签:
STM32F407ZGT6驱动光栅尺_第2张图片
这根光栅尺的驱动和驱动增量式编码器的原理是一样的,光栅尺的输出信号也是A,B信号,关于STM32F4驱动编码器的原理,有其他文章的写的很详细,不赘述。

我用了高级定时器TIM1驱动光栅尺,遇到的问题是光栅尺一定要和单片机或者是其他仪器设备共地,否则脉冲计数会出错。

定时器TIM1的初始化

void grating_time_Init() 
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_ICInitTypeDef       TIM_ICInitStructure;
    NVIC_InitTypeDef        NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(grating_ruler_RCC,ENABLE); 
    TIM_DeInit(grating_ruler_TIM);	//重置定时器
    TIM_TimeBaseInitStructure.TIM_Period = 65535;  //重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=0x0;  //预分频
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数设置
    TIM_TimeBaseInit(grating_ruler_TIM,&TIM_TimeBaseInitStructure);//初始化TIM1	           

    TIM_EncoderInterfaceConfig(grating_ruler_TIM,TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);//计数模式3

    TIM_ICStructInit(&TIM_ICInitStructure); 
    TIM_ICInitStructure.TIM_ICFilter = 0;//滤波器值
    TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;		
	TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC2映射到TI2上
    TIM_ICInit(grating_ruler_TIM, &TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;		
	TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC2映射到TI2上
    TIM_ICInit(grating_ruler_TIM, &TIM_ICInitStructure);
		

        NVIC_InitStructure.NVIC_IRQChannel=grating_ruler_IRQn;//选择TIM5中断
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//开启TIM1中断允许
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//相应优先级为2
        NVIC_Init(&NVIC_InitStructure);//初始化TIM1中断
        
     TIM_ClearFlag(grating_ruler_TIM, TIM_FLAG_Update);
     TIM_ITConfig(grating_ruler_TIM,TIM_IT_Update,ENABLE);//允许TIM1更新中断 
     
     TIM_SetCounter(grating_ruler_TIM,0); 
     TIM_Cmd(grating_ruler_TIM, ENABLE); 
}

以及GPIO的初始化

void grating_gpio_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(GA_GPIO_RCC|GB_GPIO_RCC, ENABLE);
 
    GPIO_InitStructure.GPIO_Pin = GA_GPIO_pin|GB_GPIO_pin; 
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL ;
    GPIO_Init(GA_GPIO,&GPIO_InitStructure); 
    GPIO_PinAFConfig(GA_GPIO,GA_GPIO_PinSource,GA_AF);
    GPIO_PinAFConfig(GB_GPIO,GB_GPIO_PinSource,GB_AF);	 
}

工程下载链接:使用USART1向上位机发送测量数据。使用时最好是将我的光栅尺驱动部分的程序移植到你原来的工程中,因为我的单片机的晶振可能不太一样,在时钟配置上会有些区别,如果直接使用可能串口的回传的数据会乱码。

你可能感兴趣的:(控制算法,STM32,光栅尺)