生活随笔
收集整理的這篇文章主要介紹了
编码器测距离使用外部中断计脉冲
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
此設計大多應用在工業制造需要對移動距離精度要求高的場合,原理很簡單,結合編碼器脈沖數和自己設備安裝場合,另外還要結合編碼器安裝的編碼器輪的直徑,最終換算出編碼器單位脈沖的距離。需要注意的是若將編碼器安裝在轉動軸處的同心圓計算問題如下圖:
R1為編碼器輪,R2為軸,R3與R2為同心圓,最終R3的行進距離為X,則?:X=(nR3單位脈沖的距離)/R2.
其中計數脈沖為n
市面上常見的增量式編碼器有ABZ正反6相輸出,在本篇應用中,我們只使用A一項即可。
單片機我們使用STM32F103單片機的外部中斷計數計脈沖,廢話不多直接上代碼:
u16 Pulse_count
=0;
float Travel_distance
=0;void EXTI_GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure
;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
, ENABLE);GPIO_InitStructure
.GPIO_Pin
= GPIO_Pin_0
;GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_IN_FLOATING
; GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_50MHz
; GPIO_Init(GPIOA, &GPIO_InitStructure
);
}void EXTIX_Init(void)
{EXTI_InitTypeDef EXTI_InitStruct
;NVIC_InitTypeDef NVIC_InitStruct
;EXTI_GPIO_Configuration();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO
,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA
,GPIO_PinSource0
);EXTI_InitStruct
.EXTI_Line
=EXTI_Line0
;EXTI_InitStruct
.EXTI_LineCmd
=ENABLE;EXTI_InitStruct
.EXTI_Mode
=EXTI_Mode_Interrupt
;EXTI_InitStruct
.EXTI_Trigger
=EXTI_Trigger_Falling
;EXTI_Init(&EXTI_InitStruct
);NVIC_InitStruct
.NVIC_IRQChannel
=EXTI0_IRQn
;NVIC_InitStruct
.NVIC_IRQChannelCmd
=ENABLE;NVIC_InitStruct
.NVIC_IRQChannelPreemptionPriority
=2;NVIC_InitStruct
.NVIC_IRQChannelSubPriority
=2;NVIC_Init(&NVIC_InitStruct
);}void EXTI0_IRQHandler(void)
{
if(PORT==0){Pulse_count
=Pulse_count
+1;Travel_distance
=Pulse_count
*0.01885;}if(Pulse_count
>= 15915) {Pulse_count
=0;}EXTI_ClearITPendingBit(EXTI_Line0
);
}
代碼中使用的是6cm的編碼器輪,1000脈沖數的編碼器(編碼器脈沖數結合實際情況,脈沖數越大,單位脈沖的距離越小,計數誤差也會越小),單位脈沖的距離:0.01885cm。
整體方案沒什么難點,若有疑問下方留言或者加博主QQ請博主喝茶。
總結
以上是生活随笔為你收集整理的编码器测距离使用外部中断计脉冲的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。