OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 30048|回复: 93

STM32编码器接口!

[复制链接]

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
发表于 2014-7-22 10:35:19 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] //Email:ykee@outlook.com #include "timer.h" #include "led.h" u32 count=0; //脉冲计数 u32 count_val=0; //计数值 //定时器3中断服务程序 void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 { SYS_LED=!SYS_LED; } TIM3->SR&=~(1<<0);//清除中断标志位 } void TIM4_Init(u16 arr, u16 psc ,u32 count) { RCC->APB1ENR |= 1<<2; //TIM4时钟使能 RCC->APB2ENR |= 1<<3; //使能PORTB时钟 GPIOB->CRL &= 0XF0FFFFFF;//PB6输出 GPIOB->CRL |= 0X0B000000;//复用功能输出 GPIOB->ODR |= 1<<6;//PB6上拉 TIM4->ARR = arr;//设定计数器自动重装值 TIM4->SC = psc;//预分频器不分频 TIM4->CCR1 = arr/2; //占空比为50% count_val=count-1; //脉冲输出个数 TIM4->CCMR1 |= 7<<4; //CH1 PWM2模式 TIM4->CCMR1 |= 1<<3; //CH1预装载使能 TIM4->CCER |= 1<<0; //TIM4 OC1 PB6 输出使能 TIM4->DIER|=1<<0; //允许更新中断 TIM4->DIER|=1<<6; //允许触发中断 TIM4->EGR |=1<<1; //允许产生比较捕获事件 MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2 TIM4->CR1 |= 0x0080; //ARPE使能 TIM4->CR1 |= 0x0001; //使能定时器4 TIM4->CCMR1 |= 7<<4; //CH1 PWM2模式 TIM4->CCMR1 |= 1<<3; //CH1预装载使能 TIM4->CR1 |= 0x0080; //ARPE使能 TIM4->CR1 |= 0x0001; //使能定时器3 } void TIM4_IRQHandler(void) { if(TIM4->SR&0X0001)//产生更新中断 { count++; if(count==count_val) { TIM4->CR1&=~(0x01); //CEN=0,禁止定时器3 count=0; } } TIM4->SR&=~(1<<0);//清除中断标志位 } void Encoder_Init(void) { /* TIM3 clock source enable */ RCC->APB1ENR|=1<<1; //TIM3时钟使能 /* Enable GPIOA, clock */ RCC->APB2ENR|=1<<2; //使能PORTA时钟 /* Configure PA.06,07 as encoder input */ GPIOA->CRL&=0XF0FFFFFF;//PA6 GPIOA->CRL|=0X04000000;//浮空输入 GPIOA->CRL&=0X0FFFFFFF;//PA7 GPIOA->CRL|=0X40000000;//浮空输入 /* Enable the TIM3 Update Interrupt */ //这两个东东要同时设置才可以使用中断 TIM3->DIER|=1<<0; //允许更新中断 TIM3->DIER|=1<<6; //允许触发中断 MY_NVIC_Init(1,3,TIM3_IRQChannel,2); /* Timer configuration in Encoder mode */ TIM3->SC = 0x0;//预分频器 TIM3->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值 TIM3->CR1 &=~(3<<8);// 选择时钟分频:不分频 TIM3->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式 TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1 TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2 TIM3->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1 TIM3->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2 TIM3->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器 TIM3->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效 TIM3->CNT = COUNTER_RESET; TIM3->CR1 |= 0x01; //CEN=1,使能定时器 } [/mw_shl_code]
这个程序中TIM3为何要中断啊,中断只是为了让灯亮灭吗?按理不是TIM3的计数值就是正交编码器的脉冲计数吗?为何要需要TIM4? TIM4这里又是干什么的 啊?求解啊!看得我一头雾水!

STM32正交编码器程序.zip

950.75 KB, 下载次数: 2857

最佳答案

查看完整内容[请看2#楼]

嗯!今天很高兴,因为到今天为止,代码完成了80%,而且对旋转编码器计数也成功了。一开始没有检测到编码器的输入脉冲是因为我的编码器Vcc和A  B  Z相输出之间没有负载,同时编码器的GND没有和开发板的GND连接起来。因为我的编码器供电不是在stm32板上,所以导致了上述错误。只要接上负载同时把GND接在一起就OK了。编码器的特性是如果你的输入Vcc = X 伏,那么你的输出脉冲信号也是X伏的,由于开发板的IO一般只能承受5V输 ...
电子人生!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-22 10:35:20 | 显示全部楼层
嗯!今天很高兴,因为到今天为止,代码完成了80%,而且对旋转编码器计数也成功了。一开始没有检测到编码器的输入脉冲是因为我的编码器Vcc和A  B  Z相输出之间没有负载,同时编码器的GND没有和开发板的GND连接起来。因为我的编码器供电不是在stm32板上,所以导致了上述错误。只要接上负载同时把GND接在一起就OK了。编码器的特性是如果你的输入Vcc = X 伏,那么你的输出脉冲信号也是X伏的,由于开发板的IO一般只能承受5V输入,所以24V的额定最高电压编码器,我用的是4.7V的电压,也能检测到脉冲,计数还挺准的,我用的是双边沿触发,4倍计数。
附上编码器接口代码:
[mw_shl_code=c,true]void TIM3_Mode_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //PA6 ch1 A,PA7 ch2 B RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟 GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 PA7浮空输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); NVIC_Configuration(2); TIM_DeInit(TIM3); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //设定计数器重装值 TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM3时钟预分频值 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//设置时钟分割 T_dts = T_ck_int TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数 TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入 TIM_ICInitStructure.TIM_ICFilter = 6; //选择输入比较滤波器 TIM_ICInit(TIM3, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM3 TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM3的更新标志位 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//开启TIM3更新标志使能 //Reset counter TIM3->CNT = 0;// TIM_Cmd(TIM3, ENABLE); //启动TIM3定时器 }[/mw_shl_code]

电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-22 10:35:20 | 显示全部楼层
还需要一个外部中断,对Z信号敏感,以清0计数TIM->CNT = 0;附上中断配置代码和中断函数代码
[mw_shl_code=c,true]/*void PA_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // Configure one bit for preemption priority NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置P[A|B|C|D|E]1为中断源 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } */ /* * 函数名:NVIC_Configuration * 描述 :配置嵌套向量中断控制器NVIC * 输入 :无 * 输出 :无 * 调用 :内部调用 */ void EXTI_PA1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* config the extiline(PA1) clock and AFIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO,ENABLE); /* config the NVIC(PA1) */ NVIC_Configuration(1); /* EXTI line gpio config(PA1) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); /* EXTI line(PA1) mode config */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }[/mw_shl_code]

NVIC(1)是因为我有多个中断,所以使用条件参数配置
[mw_shl_code=c,true]void USART1_NVIC_Config(NVIC_InitTypeDef NVIC_InitStructure4) { NVIC_InitStructure4.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure4.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure4.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure4.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure4); } void NVIC_Configuration(int Interrupt_flag) { NVIC_InitTypeDef NVIC_InitStructure; /* 配置中断使用组合2 抢占式2位,响应式2位*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); if(Interrupt_flag == 1) { /*外部中断1,Z相归零----优先级最高 0 0*/ PA_NVIC_Configuration(NVIC_InitStructure); } if(Interrupt_flag == 2) { /*TIM3中断,编码器解码----优先级 1 1*/ TIM3_NVIC_Config(NVIC_InitStructure); } if(Interrupt_flag == 3) { /*TIM2中断,数据帧接收完毕判断----优先级 2 2*/ TIM2_NVIC_Config(NVIC_InitStructure); } if(Interrupt_flag == 4) { /* USART1中断,数据接收----优先级 3 3*/ USART1_NVIC_Config(NVIC_InitStructure); } }[/mw_shl_code]

[mw_shl_code=c,true]void PA_NVIC_Configuration(NVIC_InitTypeDef NVIC_InitStructure1) { NVIC_InitStructure1.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure1); }[/mw_shl_code]

最后是中断处理函数,比较简单
[mw_shl_code=c,true]void EXTI1_IRQHandler(void) { GPIO_WriteBit(GPIOF, GPIO_Pin_8, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_8)))); TIM3->CNT = 0; EXTI_ClearITPendingBit(EXTI_Line1); }[/mw_shl_code]

至此,我的编码器模块就完成了。还是那句话花点时间总归是有点收获的!

电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-22 10:35:51 | 显示全部楼层
大神速来,求助啊!
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-22 10:44:40 | 显示全部楼层
[mw_shl_code=c,true]#include "encode.h" #include "stm32f10x.h" void TIM3_Mode_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /*----------------------------------------------------------------*/ /*PA6 ch1 A,PA7 ch2 B*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟 GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 PA7浮空输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*----------------------------------------------------------------*/ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*---------------------------------------------------------------------*/ TIM_DeInit(TIM3); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 360*4-1; //设定计数器重装值 TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM3时钟预分频值 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//设置时钟分割 T_dts = T_ck_int TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*-----------------------------------------------------------------*/ TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3,上升沿捕获 TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入 TIM_ICInitStructure.TIM_ICFilter = 6; //选择输入比较滤波器 TIM_ICInit(TIM3, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM3 TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM3的更新标志位 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//开启TIM3更新标志使能 //Reset counter TIM3->CNT = 0;// TIM_Cmd(TIM3, ENABLE); //启动TIM3定时器 } void TIM3_Init(void) { TIM3_Mode_Config(); } [/mw_shl_code]
这是参考网上库开发写的例子, [mw_shl_code=c,true]TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数[/mw_shl_code] [mw_shl_code=c,true]这一句肯定不行啊,不是应该向上向下计数吗!还有我跑起来之后,还没动编码器,计数器的值自己已经在改变了,根本没有管我的编码器输入的脉冲[/mw_shl_code]

编码器解码.zip

6.8 MB, 下载次数: 5181

电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-22 13:36:22 | 显示全部楼层
有没有人懂行的啊,来指导一下啊!
电子人生!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-23 00:05:32 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-23 09:32:54 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥教我写下多中断啊,我不会写!单个放出来可以,放到一起就不行了!
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-7-23 15:44:09 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥,我的通信成功了,但是编码器解码还有问题,求指导啊!
电子人生!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-23 23:02:05 | 显示全部楼层
回复【7楼】翱翔云端的鸟:
---------------------------------
编码器模式我也没搞过啊,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2014-8-2 19:12:08 | 显示全部楼层
顶。。。楼主你的程序是可以的吗??我下载了试试
避免犯错本是错误所在,我错故我在……
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-8-7 15:13:18 | 显示全部楼层
回复【11楼】zhang164534:
---------------------------------
可以的,计数很准的!
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-8-7 15:50:09 | 显示全部楼层
回复【11楼】zhang164534:
---------------------------------
不要下载我上面上传的那个程序,那是没有进行修改的!
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-8-7 15:52:01 | 显示全部楼层
说明一下,上面上传的那个程序是没有进行修改的,正确的程序在 8  9楼!
电子人生!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-8-11
在线时间
6 小时
发表于 2014-12-22 22:05:16 | 显示全部楼层
回复【14楼】翱翔云端的鸟:
---------------------------------
楼主,请问为什么是4倍计数呢,感谢
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-24 16:43:36 | 显示全部楼层
自己看下手册的编码器部分

电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-24 16:43:51 | 显示全部楼层
回复【15楼】dtjdiao:
---------------------------------
如上
电子人生!
回复

使用道具 举报

8

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2014-9-29
在线时间
13 小时
发表于 2014-12-26 13:22:13 | 显示全部楼层
回复【17楼】翱翔云端的鸟:
---------------------------------
我用的是EC11编码器,只需判断旋转方向,需不需要用定时器输入,和使用计数,还有就是你用的这个是做什么用的,这里的计数是干吗的,谢谢了
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-26 13:43:30 | 显示全部楼层
回复【18楼】lblly:
---------------------------------
判断旋转方向是可以的啊,这个计数就是对编码器的线数进行计数,可加可减,变大就是正转,变小就是反转,你还可以通过一定时间内变化的大小判断转速
电子人生!
回复

使用道具 举报

8

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2014-9-29
在线时间
13 小时
发表于 2014-12-26 13:53:51 | 显示全部楼层
回复【19楼】翱翔云端的鸟:
---------------------------------
哦,还有就是编码器的线数怎么计算,计数初值如何确定呢,我接的是PA0和PA1两个口,应该用的是TIM5的通道一和通道二,你的PA1是外部中断口,这个怎么确定呢,
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-26 14:37:26 | 显示全部楼层
回复【20楼】lblly:
---------------------------------
编码器线数是你的编码器参数啊,通常是360线的,计数器初值在你遇到第一次Z信号开始归零(增量式编码器),Z信号就是每转一圈来一个,Z信号是归零信号,这个时候计数值是0,0--360开始计数,PA1是外部中断1,你也可以选择自己的接法啊,随便你怎么接都可以,PB2也可以配置成外部中断口啊,这个外部中断只是将计数归零的信号而已
电子人生!
回复

使用道具 举报

8

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2014-9-29
在线时间
13 小时
发表于 2014-12-27 09:53:44 | 显示全部楼层
回复【21楼】翱翔云端的鸟:
---------------------------------
谢谢了 我已经弄好了
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-27 12:56:13 | 显示全部楼层
回复【22楼】lblly:
---------------------------------
我也是新人,也走了不少弯路的,共勉!
电子人生!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-3-10
在线时间
0 小时
发表于 2015-3-11 14:35:47 | 显示全部楼层
回复【18楼】lblly:
---------------------------------
我最近也在弄EC11编码器,折腾几天了都没搞出来。我要测转了几格 那个方向。可以把你的程序给我参考一下么?5218457mm@163.com 谢谢
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-3-12 08:37:05 | 显示全部楼层
回复【24楼】mm218457mm:
---------------------------------
参考 8 9 两楼  写的很清楚了
电子人生!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-29 13:59:24 | 显示全部楼层
楼主,能发一份完整的工程吗?就是调整对的那个?谢谢了。
热心,笨
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-4-29 19:24:40 | 显示全部楼层
回复【26楼】小白羊:
---------------------------------
参见8 9 两楼,完整的工程已经是有很多代码的,不能随便给的!
电子人生!
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-3-19
在线时间
11 小时
发表于 2015-5-12 13:37:50 | 显示全部楼层
增量式的编码器,你的程序使用吗?也是ABZ三相的
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-3-19
在线时间
11 小时
发表于 2015-5-12 13:43:13 | 显示全部楼层
回复【10楼】翱翔云端的鸟:
---------------------------------
能发一个文档的形式的吗
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-3-5
在线时间
2 小时
发表于 2015-5-14 17:20:12 | 显示全部楼层
回复【29楼】大宝1107:
---------------------------------
楼主,,能不能发一个stm32官方的正反编码器的例程啊,,官网上找不到
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-14 19:41:19 | 显示全部楼层
回复【30楼】李双:
---------------------------------
#include "encode.h"
#include "stm32f10x.h"
#include "misc.h"
#include "NVIC.h"

extern int num;
void TIM4_Mode_Config(void)
{

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;   

//PA6 ch1  A,PA7 ch2 B
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟

GPIO_StructInit(&GPIO_InitStructure);//将GPIO_InitStruct中的参数按缺省值输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 A7浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);                           

NVIC_Configuration(3);

TIM_DeInit(TIM4);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 360*4;  //设定计数器重装值   
TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM3时钟预分频值
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//设置时钟分割 T_dts = T_ck_int
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数 
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);              


                    
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数
TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入
TIM_ICInitStructure.TIM_ICFilter = 6;  //选择输入比较滤波器 
TIM_ICInit(TIM4, &TIM_ICInitStructure);//将TIM_ICInitStructure中的指定参数初始化TIM3
  
TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM3的更新标志位
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//开启TIM3更新标志使能
//Reset counter
TIM4->CNT = 0;//

TIM_Cmd(TIM4, ENABLE);   //启动TIM3定时器

}
/*
void TIM3_Mode_Config(void)
{
///TIM3 clock source enable 
RCC->APB1ENR|=1<<1;       //TIM3时钟使能
// Enable 1GPIOA, clock 
RCC->APB2ENR|=1<<2;    //使能PORTA时钟

// Configure A.06,07 as encoder input 
GPIOA->CRL&=0XF0FFFFFF;//PA6
GPIOA->CRL|=0X04000000;//浮空输入
GPIOA->CRL&=0X0FFFFFFF;//PA7
GPIOA->CRL|=0X40000000;//浮空输入

// Enable the TIM3 Update Interrupt 
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0;   //允许更新中断
TIM3->DIER|=1<<6;   //允许触发中断

TIM3_NVIC_Config();


//Timer configuration in Encoder mode 
TIM3->SC = 0x0;//预分频器
TIM3->ARR = 15-1;//设定计数器自动重装值 
TIM3->CR1 &=~(3<<8);// 选择时钟分频:不分频
TIM3->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式

TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM3->CCER &= ~(1<<1);  //CC1P='0'  IC1FP1不反相,IC1FP1=TI1
TIM3->CCER &= ~(1<<5);  //CC2P='0'  IC2FP2不反相,IC2FP2=TI2
TIM3->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器
TIM3->SMCR |= 3<<0;  //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM3->CNT = 0;
TIM3->CR1 |= 0x01;    //CEN=1,使能定时器

}*/

void TIM4_Init(void)
{
  TIM4_Mode_Config();
}
电子人生!
回复

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2015-7-14 22:31:36 | 显示全部楼层
楼主: 针对这个计数就是对编码器的线数进行计数,可加可减,变大就是正转,变小就是反转,   那么 当反转的时候脉冲数减小,在程序中你是怎么实现的呀
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-15 08:37:57 | 显示全部楼层
回复【32楼】jorry:
---------------------------------
你理解错了 ,反转不是脉冲数减少,是B脉冲比A脉冲提前90度,正转则是A脉冲比B脉冲提前90°,STM32编码器接口回自动判断AB相脉冲谁先来,然后对TIM->CNT进行操作   正转TIM->CNT增加,反转TIM->CNT减小
电子人生!
回复

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2015-7-15 09:01:13 | 显示全部楼层
回复【33楼】翱翔云端的鸟:
---------------------------------恩 脉冲数是不会减少的,楼主我想问定时器设置的不是向上计数吗,定时器中断服务里面是对TIM->CNT增加计数,那请问反转TIM->CNT减小,是怎么操作的呢
回复

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2015-7-15 09:40:19 | 显示全部楼层
回复【33楼】翱翔云端的鸟:
---------------------------------
换句话说 楼主  ,我想问你是怎么保证编码器反转时,TIM->CNT减小的,我在这个地方不理解,请您指导一下,谢谢
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-15 11:45:53 | 显示全部楼层
回复【35楼】jorry:
---------------------------------
不是我保证,是STM32的编码器接口保证   这是一种机制  看AB相谁先到  ,A领先B   就是TIM->CNT增大,B领先A就是TIM->CNT减小
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-15 11:48:46 | 显示全部楼层


T1领先T2   向上计数
T2领先T1   向下计数 
电子人生!
回复

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2015-7-15 14:28:08 | 显示全部楼层
回复【36楼】翱翔云端的鸟:
---------------------------------恩 ,谢谢楼主,明白了,万分感谢
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-11-17
在线时间
0 小时
发表于 2015-7-17 19:27:11 | 显示全部楼层
楼主你这个 TIM_ICInitStructure.TIM_ICFilter = 6为啥滤波要填6呢是不是表示6个脉冲计数器计一个数,还有你这如果正转20圈,你总共脉冲有程序实现吗。
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-18 09:02:09 | 显示全部楼层
回复【39楼】tianmin:
---------------------------------
这个我也不懂,一般看别人的历程都是0x0,我看了库艰苦手册 查不到  网上的都没有解释  好像是认为多少个脉冲周期电平稳定吧
电子人生!
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2015-7-19 02:41:48 | 显示全部楼层
嗯,LZ第一个程序,中断不工作的原因是两个定时器定义到同一个中断上去了。任意两个中断不能相同。
回复

使用道具 举报

20

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2015-6-4
在线时间
5 小时
发表于 2015-7-21 15:30:50 | 显示全部楼层
回复【31楼】翱翔云端的鸟:
------------------------------
请问楼主,你是用的TIM4作为编码器的接口是吗?那么TIM3是用来干什么的啊?
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-22 08:36:21 | 显示全部楼层
回复【42楼】张晓斌:
---------------------------------
TIM3也可以当编码器接口,TIM3我注释掉了是直接操作寄存器的,
电子人生!
回复

使用道具 举报

20

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2015-6-4
在线时间
5 小时
发表于 2015-7-22 09:17:31 | 显示全部楼层
回复【43楼】翱翔云端的鸟:
---------------------------------
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, 
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
这个应该是TIM_ICPolarity_Rising还是TIM_ICPolarity_BothEdge啊?这个应该根据什么来设置呢?您能解释一下吗?
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-22 11:02:38 | 显示全部楼层

电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-7-22 11:03:31 | 显示全部楼层
这些手册上都有
电子人生!
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-11-15
在线时间
4 小时
发表于 2015-7-24 17:14:38 | 显示全部楼层
楼主可否分享下你的程序,谢谢
回复

使用道具 举报

3

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2013-10-18
在线时间
30 小时
发表于 2015-8-3 23:25:19 | 显示全部楼层
一开始没有检测到编码器的输入脉冲是因为我的编码器Vcc和A  B  Z相输出之间没有负载

楼主 你写的这句话是什么意思
回复

使用道具 举报

19

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-1-14
在线时间
7 小时
发表于 2015-8-5 21:22:51 | 显示全部楼层
回复【21楼】翱翔云端的鸟:
---------------------------------
楼主,您好,能否发个程序给我呀,初学者,给我研究一下
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-8-10 20:11:50 | 显示全部楼层
回复【48楼】Gold_Br:
---------------------------------
百度OC门输出!
电子人生!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 10:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表