STM32F407ZGT6驱动光栅尺
光栅尺的型号
我在找这个光栅尺的型号和资料上花了挺多时间的,网上根本搜不到这个型号,光栅尺上写的生产公司长春光兴禹恒公司,已经不生产光栅了,它的官网上也没有关于这个光栅尺的资料。最后我把测头拆开,看到有四根线,红黑蓝绿,结合他的型号的最后的两个字母TL,所以我猜测应该是TTL输出,我用万用表测了下,得这几跟线对应的输出口的位置如下图:
以及光栅尺上的标签:
这根光栅尺的驱动和驱动增量式编码器的原理是一样的,光栅尺的输出信号也是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向上位机发送测量数据。使用时最好是将我的光栅尺驱动部分的程序移植到你原来的工程中,因为我的单片机的晶振可能不太一样,在时钟配置上会有些区别,如果直接使用可能串口的回传的数据会乱码。