收藏0 举报
编码器的线数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,说明这个编码器转一圈对应的信号线会输出500个脉冲, A B两相转一圈发出的脉冲数一样的,不过存在90°相位差
线数越高代表编码器能够反应的位置精度越高
增量式编码器有两个脉冲输出,A相和B相,并且两个相位永远存在90°相位差。 如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、并且可以根据AB相脉冲信号数量测得速度,位移等,
正转的时候信号线A先输出信号,信号线B后输出 A相超前B相90度 证明是正转
反转的时候信号线B先输出信号,信号线A后输出 B相超前A相90度 证明是反转
STM32的编码器模式共有三种:
TIM_EncoderInterfaceConfig,它就是编码器接口的配置函数。简单的只需要配置该函数,使能TIM,即可实现采集编码器上面的信息
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)TIMx参数就是使用哪个定时器作为编码器接口的捕捉定时器。 TIM_EncoderMode参数是模式,是单相计数(仅在TL1计数或仅在TL2计数)还是两相计数(在TL1和TL2都计数)。 TIM_IC1Polarity和TIM_IC2Polarity参数就是通道1、2的捕捉极性。
TIMx参数就是使用哪个定时器作为编码器接口的捕捉定时器。
TIM_EncoderMode参数是模式,是单相计数(仅在TL1计数或仅在TL2计数)还是两相计数(在TL1和TL2都计数)。
TIM_IC1Polarity和TIM_IC2Polarity参数就是通道1、2的捕捉极性。
那么我们直接看代码:
定时器初始化设置
void TIM3_Int_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //定时器设置------------------------------------------------------------- TIM_TimeBaseInitStructure.TIM_Period = 359*4; //重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler=0x0; //预分频 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3 //编码器模式设置-------------------------------------------------------------- TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//计数模式3 TIM_ICStructInit(&TIM_ICInitStructure); //将结构体中的内容缺省输入 TIM_ICInitStructure.TIM_ICFilter = 0;//滤波器值 TIM_ICInit(TIM3, &TIM_ICInitStructure); //将TIM_ICInitStructure中的指定参数初始化TIM3 //溢出中断设置-------------------------------------------------------------- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许TIM3溢出中断 NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_SetCounter(TIM3,0); //TIM3->CNT=0 TIM_Cmd(TIM3, ENABLE); }重装载值: (编码器线数-1 ) *4 因为我们是两相计数,一个脉冲信号4次计数,所以乘4,保证转完1整圈才触发中断中断设置:复制int circle_count=0;//圈数 void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) { if((TIM3->CR1>>4 & 0x01)==0) //DIR==0 circle_count++; else if((TIM3->CR1>>4 & 0x01)==1)//DIR==1 circle_count--; } TIM_ClearITPendingBit(TIM3,TIM_IT_Update); }
重装载值: (编码器线数-1 ) *4 因为我们是两相计数,一个脉冲信号4次计数,所以乘4,保证转完1整圈才触发中断
中断设置:
int circle_count=0;//圈数 void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) { if((TIM3->CR1>>4 & 0x01)==0) //DIR==0 circle_count++; else if((TIM3->CR1>>4 & 0x01)==1)//DIR==1 circle_count--; } TIM_ClearITPendingBit(TIM3,TIM_IT_Update); }
int angle=0; //转过总角度 int Realyangle = 0; //当前实际角度 0~360 int Distiance=0; //运行距离 extern int circle_count; //转过圈数 Realyangle = TIM_GetCounter(TIM3)/4/360 ; //先除4 最后除编码器线数 angle=Realyangle +circle_count*360;//当前角度 Distiance = angle/360*编码器齿轮周长 + circle_count*编码器齿轮周长
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
72
514
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号