OpenEdv-开源电子网

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

STM32编码器模式,编码器测脉冲

[复制链接]

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-5-26 10:06:36 | 显示全部楼层 |阅读模式
5金钱
小弟最近在学习编码器,看了论坛关于编码器的帖子,写出了程序
但是屏幕一直显示0。。调试的时候,一直无法进入中断。。。现在把程序发上来,求助各位高手。。

编码器程序
[mw_shl_code=c,true]/* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "stm32f10x_encoder.h" #include "lcd.h" #include <stdio.h> extern u16 v_counter; extern float v; /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define ENCODER_TIMER TIM3 // Encoder unit connected to TIM3 #define ENCODER_PPR (u16)(400) // number of pulses per revolution #define SPEED_BUFFER_SIZE 8 #define COUNTER_RESET (u16)0 #define ICx_FILTER (u8) 6 // 6<-> 670nsec //设定滤波值 /******************************************************************************* 正交编码器接口的初始化,Timer3驱动编码器 * Function Name : ENC_Init * Description : General Purpose Timer x set-up for encoder speed/position * sensors * Input : None * Output : None * Return : None *******************************************************************************/ void Encoder_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /* Encoder unit connected to TIM3, 4X mode */ GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* TIM3 clock source enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);;//使能TIM3时钟 /* Enable GPIOA, clock */ //串口时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟 GPIO_StructInit(&GPIO_InitStructure); /* Configure PA.06,07 as encoder input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA6 PA7浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 PA6 PA7 /* Enable the TIM3 Update Interrupt */ /*设置编码器溢出中断*/ /*中断频道*/ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 /*中断一级优先级设置*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级1级 /*中断二级优先级设置*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级 /*中断使能*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 /*设置赋值*/ NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 /* Timer configuration in Encoder mode */ TIM_DeInit(ENCODER_TIMER); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); /*不需要任何预分频*/ //Tout=(arr+1)*(psc+1)/Tclk; TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1; //设定计数器重装值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割 T_dts = T_ck_int TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数 TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure); /*设置为编码器模式*/ TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3 TIM_ICStructInit(&TIM_ICInitStructure); /*filter设置*/ TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER; //选择输入比较滤波器 /*TIM_ICFilter选择输入比较滤波器。该参数取值在0x0和0xF之间*/ TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure); /*清楚中断标志位*/ TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update); /*开启编码器溢出中断*/ TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE); //Reset counter /*复位编码器*/ ENCODER_TIMER->CNT = COUNTER_RESET; /*使能编码器*/ //允许TIM3工作,也就是使能TIM3 TIM_Cmd(ENCODER_TIMER, ENABLE); //使能TIMx } /******************************************************************************* Timer3的Update中断处理程序 * Function Name : TIM3_IRQHandler * Description : This function handles TIMx Update interrupt request. Encoder unit connected to TIM2 * Input : None * Output : None * Return : None *******************************************************************************/ /*中断溢出处理(测速)*/ void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 v_counter=TIM_GetCounter(TIM3); TIM_SetCounter(TIM3, 0); v=(float)v_counter*120/400; //定时为0.5s v_counter=v; } }[/mw_shl_code]
主程序
[mw_shl_code=c,true]u16 v=0; u16 v_counter=0; int main(void) { delay_init(72); //延时函数初始化 uart_init(9600); //串口初始化为9600 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 SystemInit(); Encoder_Init(); LCD_Init(); //初始化LCD屏 delay_ms(100); while(1) { LCD_ShowxNum(20,40, v,2,16,0); } }[/mw_shl_code]

编码器测速.zip

5.9 MB, 下载次数: 2523

最佳答案

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

http://www.openedv.com/posts/list/8274.htm 看过了没,该贴楼主连编码器学习方法都贴出来了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5779
金钱
5779
注册时间
2013-11-22
在线时间
1211 小时
发表于 2015-5-26 10:06:37 | 显示全部楼层
http://www.openedv.com/posts/list/8274.htm
看过了没,该贴楼主连编码器学习方法都贴出来了
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
 楼主| 发表于 2015-5-26 10:15:20 | 显示全部楼层
求解答。。。。
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
 楼主| 发表于 2015-5-28 20:43:12 | 显示全部楼层
回复【3楼】lycreturn:
---------------------------------
我们的思路不一样。。。所以,程序设计方法也不一样。。。
回复

使用道具 举报

29

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2015-4-26
在线时间
5 小时
发表于 2015-7-21 12:01:39 | 显示全部楼层
回复【3楼】lycreturn:
---------------------------------
刚好,我最近也在学这个~~
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-9-29
在线时间
6 小时
发表于 2017-10-25 09:16:42 | 显示全部楼层
楼主问题解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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