我是靠谱客的博主 纯真茉莉,这篇文章主要介绍STM32F103与AB相编码器采用外部中断测脉冲换算距离问题,现在分享给大家,希望可以做个参考。

这是AB相编码器输出的波形
在这里插入图片描述
笔者原来想单通过编码器的单独A或者单独B的脉冲来计算脉冲,实验过程发现一个问题:就是无论你得编码器正反转,你得脉冲值都会增加,于是我通过研究以上波形,解决这一问题。
思路就是,A相接外部中断,B相随便接一个IO口,当A相进入中断时,通过检测A,B两个IO口的电平是否相同,来判断是否是单向旋转,这样就可以避免相反转时引发的误差了
中断配置代码如下:A相接PC5,B相接PC4,打印输出a的值即可。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" u16 a = 0; //一圈400个 u8 b = 0; //外部中断初始化函数 void EXTIX_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟 //初始化编码器输入对应io模式 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;//PC45 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; ; //设置成浮空输入 GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5 //GPIOC.5 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); EXTI_InitStructure.EXTI_Line=EXTI_Line5; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//up边沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 //GPIOC.4 中断线以及中断初始化配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4); EXTI_InitStructure.EXTI_Line=EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//up边沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); // NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按键所在的外部中断通道 // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1 // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 // NVIC_Init(&NVIC_InitStructure); } //void EXTI4_IRQHandler(void) //{ // b = 1; // EXTI_ClearITPendingBit(EXTI_Line4); //清除EXTI0线路挂起位 //} void EXTI9_5_IRQHandler(void) { if(PCin(4) == PCin(5)) a ++; EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位 }

最后

以上就是纯真茉莉最近收集整理的关于STM32F103与AB相编码器采用外部中断测脉冲换算距离问题的全部内容,更多相关STM32F103与AB相编码器采用外部中断测脉冲换算距离问题内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部