STM32正交编码器例程
stm32f411 开发例程
stm32f411 开发例程
摘要:
一、引言
二、stm32f411 简介
1.stm32f411 性能特点
2.stm32f411 应用领域
三、stm32f411 开发工具
1.Keil uVision
2.STM32CubeIDE
四、stm32f411 开发例程
1.点亮LED
2.按键控制LED
3.定时器中断
ART 通信
五、stm32f411 开发注意事项
1.硬件连接
2.软件编程规范
3.常见问题解决
六、总结
正文:
一、引言
随着嵌入式系统的广泛应用,越来越多的开发者开始关注stm32 系列单片机。其中,stm32f411 以其高性能、低功耗等优势,受到众多开发者的青睐。本文旨在介绍stm32f411 开发例程,帮助开发者快速上手。
二、stm32f411 简介
stm32f411 是意法半导体(ST)公司推出的一款基于ARM Cortex-M4 内核的32 位单片机。其性能特点主要包括高速运行、低功耗、丰富的外设接口等。在众多领域均有广泛应用,如工业自动化、智能家居、医疗设备等。
三、stm32f411 开发工具
为了方便开发者使用stm32f411 进行开发,ST 公司提供了丰富的开发工具。其中,Keil uVision 和STM32CubeIDE 是两款常用的开发环境。
四、stm32f411 开发例程
为了帮助开发者快速熟悉stm32f411 的开发流程,本文列举了四个典型的例程,包括点亮LED、按键控制LED、定时器中断以及USART 通信。这些例程涵盖了基本的硬件连接、软件编程以及调试过程,对于初学者来说非常实用。
STM32正交编码器例程
STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)发布时间:
2009-10-04 14:29:11
今天决定在END开博,之前没有工作记录的习惯,从今天起在这里记录下自己工作时的点滴经验,以供日后参考以及与网络朋友交流。第一篇文章先简要描述下STM32 定时器对正交编码器进行计数控制的方法。
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:
void Encoder_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//PC6 A相PC7 B相
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
ec11stm32例程
ec11stm32例程
EC11STM32是一种旋转编码器,常用于嵌入式系统中,可以用来获取旋转方向和计算旋转角度。在STM32开发板上使用EC11STM32,需要进行相应的配置和编程。本文将介绍EC11STM32的原理、使用方法以
及编程实例。
EC11STM32工作原理:
EC11STM32包含一个旋转编码器和一个按钮开关。旋转编码器由两个光电传感器、一个LED和一个编码盘组成。编码盘上有很多小刻度,每当旋转编码器旋转一格,编码盘上的刻度就会遮挡或透过光电传感器,从而产生一个脉冲信号。根据脉冲信号的变化,我们可以判断旋
转的方向和计算旋转的角度。
EC11STM32的使用方法:
在STM32开发板上使用EC11STM32,首先需要将EC11STM32连接到正确的GPIO引脚上。然后,我们可以通过读取GPIO引脚的状态来获
取旋转和按下按钮的信息。对于旋转编码器,我们可以使用两个引脚
来获取旋转方向和计数。对于按钮开关,我们可以使用一个引脚来获取按下和释放的状态。
编程实例:
下面是一个使用EC11STM32的简单编程实例,用于获取旋转方向和计算旋转角度:
```c
#include "stm32f10x.h"
#define CLK_GPIO GPIOA
#define DT_GPIO GPIOB
#define BTN_GPIO GPIOC
#define CLK_PIN GPIO_Pin_0
#define DT_PIN GPIO_Pin_1
#define BTN_PIN GPIO_Pin_13
int main(void)
基于STM32的正交编码器接口应用含源程序
基于STM32的正交编码器接口应用
本设计应用了ST公司的最新单片机STM32完成。STM32应用的是ARM 32位的
Cortex™-M3 CPU,最高72MHz工作频率,单周期乘法和硬件除法,高速的运行速度,可以保证编码器高转速条件下的高速脉冲依旧能够被准确的计数。多达7个定时器,3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入。因此只要对MCU进行配置之后,MCU只需要少量的中断程序,就可以方便的完成对编码器的方向和角速度的运算。
STM32单片机工作在3.3V下。拥有内部8M晶振,可以通过锁相环倍频到48M(内部晶振由于稳定度不够,只能倍频到48M)
。
采用标准的JATGE接口进行程序的烧录和调试。
采用一块lm1117-3.3V作为芯片的稳压电源。LM1117为一块LDO(低压差线性稳压器),输入最低为3.3+0.7=4v
用一块LCD5110手机屏作为显示设备,可以显示输出电压以及当前状态。液晶屏参数为72*48,点阵式,使用一个驱动库作为支持,方便开发,工作在3.3V电压下,与单片机相适应。耗电极低,小于1MA,背光耗电为20MA。
采用USB接口与编码器连接,线序定义为V+,A相,B相,GND,正好将USB的所有连线用完,可以同时完成给编码器提供电力以及返回信号的功能。同时MINIUSB接口良好的物理连接特性也保证了应用的稳定性。
由于编码器为NPN集电极输出,所以需要在信号线上提供一定的上拉电阻。
所使用的编码器为远征牌,200线(转一圈输入200个脉冲),AB 两相,最大转速200rad/s,输入电压可以为5到18V(编码器内部带有稳压芯片)。
stm32f411标准例程
stm32f411标准例程
一、概述
STM32F411是一款高性能的ARM Cortex-M4微控制器,广泛应用于各种嵌入式系统。标准例程是STM32F411开发中常用的示例代码,它包含了该微控制器的基本功能和操作方法,帮助开发者快速熟悉该芯片的使用。
二、功能介绍
本例程主要涵盖了以下功能:
1. 启动配置:包括时钟树、GPIO配置等基本设置。
2. 串口通信:使用USART1进行串口通信,包括数据发送和接收。
3. 定时器使用:使用TIM2实现定时功能,例如周期性中断和PWM输出。
4. SPI通信:通过SPI接口与外设进行数据交换。
5. I2C通信:实现I2C通信接口,进行设备间的数据传输。
6. ADC使用:配置ADC模块,实现对模拟信号的采集和处理。
7. 硬件按键和LED控制:通过按键和LED灯实现人机交互。
三、代码解析
以下是一个简单的代码示例,展示了如何使用STM32F411实现串口通信:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_usart.h"
void USART1_Init(void) {
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_ART_BaudRate = 9600;
USART_ART_WordLength = USART_WordLength_8b;
STM32单片机对正交编码器的驱动
STM32单片机对正交编码器的驱动
STM32正交编码器驱动,引入(突变)带进位的位置环和速度环
#include “stm32f10x.h”
#include “stm32f10x_encoder.h”
#include “sys.h”
#include “usart.h”
#include “led.h”
#define COUNTER_RESET(u16)0
#define ICx_FILTER(u8)0 // 6《-》670nsec
#define TIMx_PRE_EMPTION_PRIORITY 1
#define TIMx_SUB_PRIORITY 0
//#define MAX_COUNT ENCODER_TIM_PERIOD/2
volaTIle s16 Right_hEncoder_Timer_Overflow; //编码器计数值溢出标志
volatile s16 Right_hEncoder_Timer_Overflow_High;//编码器计数值溢出标志高位
volatile s16 Right_hRot_Speed;//当前的速度
volatile s16 Right_hRot_Acceleration;//当前的加速度
s32 Right_CurrentCount = 0;//编码器当前的总计数值
s32 Right_CurrentCount_high = 0;//编码器当前的总计数值高位计算公式,注意结果可能超过32位的表示范围Left_CurrentCount_high*S32_MAX+Left_CurrentCount
stm32f1 标准例程
stm32f1 标准例程
一、概述
STM32F1是一款广泛应用于嵌入式系统开发的32位ARMCortex-M 内核微控制器。标准例程是用于帮助初学者快速了解和掌握STM32F1的基本操作和功能的应用程序。本例程旨在通过一系列简单的示例程序,帮助读者熟悉STM32F1的基本开发流程和常用功能。
二、开发环境设置
1.安装KeiluVision开发环境,并配置相应的编译器和调试器。
2.下载STM32F1的固件库,并将其添加到KeiluVision项目中。
三、标准例程内容
以下是一个简单的STM32F1标准例程程序,包含了LED灯的控制、按键输入、串口通信等功能:
```c
#include"stm32f10x.h"
#include"stm32f1_system.h"
#include"stm32f1_gpio.h"
#include"stm32f1_rcc.h"
#include"stm32f1_usart.h"
#include"stm32f1_dma.h"
//初始化GPIO和USART外设
voidinit_peripherals(){
GPIO_InitTypeDefGPIO_InitStruct;
USART_InitTypeDefUSART_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Perip h_USART2,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//设置LED 灯和按键引脚为输出
STM32编码器
STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:
void Encoder_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//PC6 A相PC7 B相
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler =0x0; // No prescaling
stm32f411 开发例程
一、引言
STM32F411是STMicroelectronics推出的一款32位ARM Cortex-M4微控制器,它集成了丰富的外设和功能模块,适用于各种嵌入式应用场景。开发STM32F411的例程可以帮助开发者快速上手并充分发挥其性能,在本文中,将介绍一些常用的STM32F411开发例程,帮助读者更好地理解和应用该微控制器。
二、基本信息
1. STM32F411微控制器介绍
STM32F411微控制器基于ARM Cortex-M4内核,主频最高可达100MHz,内置512KB Flash存储器和128KB SRAM。它还集成了丰富的外设,包括多个通用定时器、通用同步/异步接口控制器(USART)、通用串行总线(USB)、SPI接口、I2C接口、模拟到数字转换器(ADC)等,满足不同应用的需求。
2. 开发环境
开发STM32F411例程需要准备一台个人计算机,安装
STM32CubeMX工具以及相应的开发环境(如Keil MDK、IAR Embedded Workbench等),并准备好JTAG或SWD接口的调试工具。
三、常用例程
1. GPIO例程
我们可以编写一个简单的GPIO(通用输入输出)例程,控制STM32F411的引脚状态。通过配置引脚的工作模式(输入/输出)、上拉/下拉电阻、速度等参数,可以实现对外设的控制。
2. 定时器例程
定时器是嵌入式系统中常用的外设,它可以用于产生精确的定时中断、PWM波形输出等。在STM32F411中,有多个通用定时器,我们可以编写一个定时器例程,实现定时中断的处理或PWM波形的生成。
STM32正交编码器例程
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:
void Encoder_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//PC6 A相PC7 B相
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/* Enable the TIM3 Update Interrupt */
/*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
stm32 编码器 程序 z相的处理方法
文章标题:深入探讨STM32编码器程序中Z相的处理方法
在嵌入式系统开发中,STM32系列微控制器广泛应用于各种领域,其强大的性能和丰富的外设资源使得开发人员可以更加灵活和高效地进
行开发。而编码器作为一种常见的位置传感器,被广泛应用于电机控制、机械臂、机床等领域。在STM32编码器程序中,Z相的处理显得尤为重要,本文将针对这一主题进行深入探讨。
1. 简介
从编码器的基本结构出发,我们可以看到编码器通常由A相、B相和
Z相组成。其中A相和B相用于检测转动角度和方向,而Z相则用于
检测转动的零点位置。在实际应用中,Z相的处理对于确保系统的稳
定性和精准性至关重要。
2. Z相的读取
在STM32编码器程序中,Z相的读取可以通过外部中断的方式来实现。当Z相的信号发生上升沿或下降沿时,通过外部中断引脚将引发中断,从而执行相应的处理函数。在处理函数中,可以进行位置计数的清零、角度标定等操作,以确保系统在启动时能够准确获取零点位置。
3. 程序设计
针对Z相信号的处理,我们需要设计相应的程序逻辑来确保系统的稳
定性和精准性。在程序设计中,我们可以采用状态机的方式来处理Z
相信号,通过状态机的切换来实现位置标定、零点校准等功能。还应
该考虑到Z相信号可能存在的抖动和干扰,采取相应的滤波和消抖措
施来确保信号的稳定性和可靠性。
4. 总结
STM32编码器程序中Z相的处理方法对于系统的性能和稳定性具有重要影响。通过合理的硬件设计和程序实现,我们可以确保系统能够准
确地获取零点位置,并实现精准的位置控制。在实际开发中,开发人
员需要综合考虑硬件和软件两方面的因素,以便更好地实现Z相的处
stm32编码器模式
我最近有一个项目要利用stm32的编码器模式计数,我很苦恼,我想用原子的寄存器设置模式,库函数的我没有很好的接触,我自己也配置了,可是lcd上始终显示不到数字,这是库函数的程序:
void ENC_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APBPeriph_ENCODER_TIMER, ENABLE); // ENCODER_T IMER时钟初始化
RCC_APB2PeriphClockCmd(RCC_APBPeriph_ENCODER_GPIO, ENABLE); // ENCODER_GPIO 时钟初始化
GPIO_StructInit(&GPIO_InitStructure); //TI1 TI2初始化
GPIO_InitStructure.GPIO_Pin = ENCODER_TI1 | ENCODER_TI2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(ENCODER_GPIO, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIMER_IRQChannel; //设置ENCODER_TIMER 的优先级
stm32标准库例程
stm32标准库例程
一、引言
STM32是意法半导体公司推出的一款基于ARM Cortex-M内核的微控制器。STM32标准库例程是针对STM32系列芯片,提供了一些常用的函数库,方便开发者进行开发。本文将详细介绍STM32标准库例程。
二、STM32标准库例程概述
1. STM32标准库例程包含哪些功能?
- GPIO(通用输入输出)
- USART(串行通信)
- ADC(模拟数字转换)
- TIM(定时器)
- EXTI(外部中断)
- NVIC(嵌套向量中断控制器)
2. STM32标准库例程有哪些优点?
- 方便使用:提供了常用的函数,不需要自己编写底层驱动程序。
- 易于移植:支持不同型号的芯片。
- 稳定可靠:经过严格测试和验证,保证代码质量。
三、GPIO例程
1. GPIO简介
GPIO即通用输入输出,是STM32芯片上最常用的外设之一。它可以通过设置寄存器来控制芯片上的输入输出引脚。
2. GPIO例程代码示例
```
#include "stm32f10x.h"
int main(void)
{
// 使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置PC13为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
stm32编码器接口初始化及定时器详解
stm32编码器接⼝初始化及定时器详解
February 2014DocID022500 Rev 31/36
AN4013
Application note
STM32F0, STM32F1, STM32F2, STM32F4, STM32L1 series,STM32F30xC/Bx, STM32F358xC, STM32F37x, timer overview
Introduction
This document:?
presents an overview of the timer peripherals in the STM32F0, STM32F1, STM32F2, STM32F4 and STM32L1 microcontroller series, STM32F30xC/Bx, STM32F358xC, STM32F37x microcontrollers lines .
describes the various modes and specific features of the timers, such as clock sources,explains how to use the available modes and features,?explains how to compute the time base in each configuration,
describes the timer synchronization sequences and the advanced features for motor control applications, in addition to the general-purpose timer modes.
电机编码器-stm32编码器模式
电机编码器的使&STM32的定时器编码器模式
一、基础知识:
编码器是小车测速反馈必不可少的模块,在做自平衡和速度的
精确控制需要有编码器读取电机的转速和方向
上图为编码器的示意图,中间是一个带光栅的码盘,光通过光栅,接收管接收到高电平,没通过,接收到低电平。电机旋转一圈,码盘上有多少光栅,接受管就会接收多少个高电平。
我们做的自平衡是用的是SK3530高性能直流减速电机
采用光栅测速单圈输出448*30个AB相脉冲也就是13440相位差90度
接线说明:从白线到蓝线一次为:
白线:A相;绿线:B相;红线:3.3V-5V;黑线;GND
黄线和蓝线为电机两根接线柱的线,通常接电机驱动。正转A相超前B相90度,也就是说,A相进入下降沿的时候,B相是高电平,反转的时候A相落后B 相90度,也就是说A相进入下降沿的时候,B相是低电平,通常用法:A相接入单片机的中断IO口,B相接入单片机的普通IO口。
二、stm32编码器模式接口:
在通用定时器和高级定时器中有这个功能
从图上中可以看出,TI1波形先于TI2波形90°时,每遇到一个边沿变化是,计数器加1(可以通过寄存器设置加减),可以看出一个光栅,被计数了4次。TI1波形后于TI2波形90°时,每遇到一次边沿变化,计数器减1。
也就是说13440个脉冲计数了13440*4=53760次
简单的计数显示程序:
由于DJ_jishu_L是int16_t即(signed)int类型数据范围-32768~32767 TIM_GetCounter返回值是unsigned int类型转换为int类转动一圈
STM32 编码器程序
STM32 编码器连接
STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:
void Encoder_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//PC6 A相PC7 B相
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/* Enable the TIM3 Update Interrupt */
/*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)发布时间:
2009-10-04 14:29:11
今天决定在END开博,之前没有工作记录的习惯,从今天起在这里记录下自己工作时的点滴经验,以供日后参考以及与网络朋友交流。第一篇文章先简要描述下STM32 定时器对正交编码器进行计数控制的方法。
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:
void Encoder_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//PC6 A相PC7 B相
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/* Enable the TIM3 Update Interrupt */
/*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRI ORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);*/
/* Timer configuration in Encoder mode */
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling
TIM_TimeBaseStructure.TIM_Period = 10000;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;
TIM_ICInit(TIM8, &TIM_ICInitStructure);
// Clear all pending interrupts
TIM_ClearFlag(TIM8, TIM_FLAG_Update);
TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);
//Reset counter
TIM2->CNT = 0;
TIM_Cmd(TIM8, ENABLE);
}
n_Counter = TIM_GetCounter(TIM8);
Diled_Disp_Num((float)n_Counter);
另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
比如编码器是400线的,将ARR寄存器设置为400,每溢出中断一次就代表电机转了一圈,以此类推。
另外,关于输入脉冲的检测,其实是类似的,只不过在STM32内部是专门用了一个外部触发模块来实现的,如图一中紫色框的标注,编码器模块应该是在这个模块上的升级,下面是配置代码:
void TIM3_ETR_GetDropCounts_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//test PA0 TIM8_ETR
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;