STM32F103_正交编码器接口应用笔记
- 格式:pdf
- 大小:369.45 KB
- 文档页数:7
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 prescalingTIM_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 interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
stm32编码器工作原理
STM32编码器的工作原理以下几个方面来进行讲解:
1. 编码器介绍:编码器是一种测量旋转运动的装置,能够将旋转角度转换为电信号输出。
2. 工作原理:STM32编码器工作原理基于两个光电传感器和
一个光栅带的相互作用。
光栅带上有一定数量的黑白条纹,两个光电传感器分别测量这些条纹的变化。
3. 接口模式:STM32编码器可以通过两种接口模式进行工作,分别是增量式和绝对式。
增量式编码器输出的是脉冲信号,而绝对式编码器输出的是相对位置数据。
4. 编码方式:STM32编码器可以通过两种编码方式进行工作,分别是光电和磁电编码。
光电编码器利用光电传感器对光栅带上的黑白条纹进行测量,而磁电编码器则利用磁场对磁栅带进行测量。
5. 编码器的应用:STM32编码器广泛应用于机器人、航空航天、汽车零部件和工控设备等领域,用于测量旋转运动的角度和速度。
总结:STM32编码器通过光电或磁电传感器对光栅带或磁栅
带上的黑白条纹进行测量,将旋转运动转换为电信号输出,并通过增量或绝对方式输出相对位置数据或脉冲信号。
它具有精
度高、响应速度快、可靠性强等优点,在许多领域中都有广泛的应用。
STM32定时器正交编码器模式寄存器配置程序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;//PA6GPIOA->CRL|=0X04000000;//浮空输入GPIOA->CRL&=0X0FFFFFFF;//PA7GPIOA->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->PSC = 0x0;//预分频器TIM3->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值TIM3->CR1 &=~(3<<8);// 选择时钟分频:不分频TIM3->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2TIM3->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1TIM3->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2TIM3->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器TIM3->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效TIM3->CNT = COUNTER_RESET;TIM3->CR1 |= 0x01; //CEN=1,使能定时器}。
stm32f103中文手册概述72 MHz的最大主频,1.25 DMIPS/MHz的性能64 KB到512 KB的闪存,20 KB到64 KB的SRAM7个通道的DMA控制器2个12位模数转换器(ADC),每一个ADC最多16个通道2个数字摹拟转换器(DAC)3个高级控制定时器,4个通用定时器,2个基本定时器,1个系统定时器1个USB全速设备接口2个CAN总线接口3个I2C总线接口5个USART接口,其中3个支持同步通信2个SPI总线接口1个SDIO接口51到112个GPIO引脚,支持中断和唤醒功能7到12位的LCD驱动器(仅STM32F103x8和STM32F103xB)多种低功耗模式,包括停机、待机、睡眠和住手模式多种时钟源和时钟安全系统多种复位源和复位管理系统多种保护机制,包括闪存写保护、调试访问保护、电源电压检测等引脚分配stm32f103有多种封装形式,包括LQFP64、LQFP100、LQFP144、BG A100、BGA144等。
不同封装形式的引脚分配如下图所示:![引脚分配图]存储器映射stm32f103的存储器空间为4GB,分为两部份:代码区和系统区。
代码区占用前2GB,用于存放程序代码和数据。
系统区占用后2GB,用于存放外设寄存器和系统服务。
存储器映射如下表所示:---地址范围 ---描述 ---------------0x0000 0000 0x1FFF FFFF ---代码区 -------0x2000 0000 0x2000 FFFF ---SRAM -------0x4000 0000 0x4002 3FFF ---外设寄存器 -------0x4200 0000 0x43FF FFFF ---外设位带区 -------0xE000 0000 0xE00F FFFF ---Cortex-M3系统服务 ----外设介绍ADCstm32f103有两个12位ADC,每一个ADC最多可以配置16个输入通道。
STM32F103ZE学习笔记(通过FSMC总线控制LCD)实验内容:通过FSMC总线来操作LCD屏的显示实验目的:掌握FSMC总线的操作使用方法,为下一步操作触摸屏提前做好准备。
关于FSMC总线的介绍前面已经略有介绍,在此不作赘述。
只是简单说一下其配置过程既需要注意的几点问题:一、 FSMC内部结构和映射地址空间FSMC包含AHB接口、NOR Flash和PSRAM控制器、NANDflash和PC卡控制器、外部设备接口4个主要模块。
在ST吗内部,FSMC的一端通过内部高速总线AHB连接内核,另一端则是面向扩展存储器的外部总线。
内核对外部存储器的访问信号发送到AHB 总线后,经过FSMC转换为符合外部存储器规约的信号,送到外部存储器响应的管脚,视线内河鱼数据交换。
FSMC起到了桥梁的作用,既能够进行信号类型的转换,有能够进行信号宽度和时序的调整,屏蔽掉不同存储器之间的差异。
FSMC内部包含NOR Flash和NAND /PC Card两个控制器,可以分别支持两种截然不同的存储器访问方式,本实验选用的是前者。
FSMC管理1GB的映射地址空间。
该空间氛围4个大小256k d 的bank ,每个bank又分为4个大小为64K的子bank 。
这个问题牵扯到缩扩展的外部存储器的地址问题,务必要注意仔细选择。
各bank 相互独立,均拥有独立的片选线和控制器。
二、FSMC总线配置步骤(1)确定映射地址空间:本例程选用的是bank1 的第四个子bank ,前面也提到过,选择的BANK不同则外设对应的地址不同:我们选择的是BANK1,NE4对应的两个地址为:LCD_REG寄存器地址:0x6C00 0000 ;LCD_Data数据地址:0x6C00 0000 | (1《《(n+1))。
将AFIO的A0接至LCD的C/D(Command/data)脚就自动切换了命令和数据。
如果RS接到地址线的A0上,当RS为0时对应寄存器地址0x6C00 0000;当RS为1时,对应数据地址0x6C00 0002;若选择的的是bank1的NE1,则寄存器地址0x6000 0000;数据地址:0x6000 0002.(2)确定扩展使用的映射地址空间后进而:1、确定硬件电路中用于选中该存储器的片选线FSMC_NEx,2、FSMC配置中用于配置该外部存储器的特殊功能寄存器号,(3) 配置存储器基本特征根据选用的存储器芯片确定需要配置的存储器特征:1确定存储器类型(SRAM)2确定存储器芯片的数据和地址引脚是否复用,3确定存储器芯片的数据线宽度,4对于NOR Flash,确定是否采用同步突发访问方式,5对于NOR Flash,NWIT信号的特性说明,6对于该存储器芯片的读写操作,确定是否采用相同的时许参数来确定时序关系。
STM32编码器在光栅尺测速场合的实际应用STM32103F系列微控制器的定时器有一种特有工作模式——编码器接口模式,此模式可以用来反馈马达的实时转子位置,测量马达的转速,也可以反馈光栅尺的实时位置,测量光栅头的移动速度,在工业控制场合,尤其是需要精确定位的压机、机床等使用场合,有着非常实用的价值。
现以STM32103F微控制器与海德汉(HEIDENHAIN)光栅尺LS1378C为例,详细介绍定时器的编码器工作原理,以及双定时器配合测速度的编程算法。
标签:STM32编码器;光栅尺;测速STM32103F系列是ST公司采用高性能的32位ARM Cortex-M3内核,主要面向工业控制领域推出的微控制器芯片。
通用定时器有以下几种工作模式:计数器模式、输入捕获模式、输出比较模式、PWM模式、单脉冲模式、编码器接口模式。
其中,编码器接口模式是一种有别于其他通用ARM控制器以及DSP控制器的特有模式,此模式可以用来反馈马达的实时转子位置,测量马达的转速,也可以反馈光栅尺的实时位置,测量光栅头的移动速度,在工业控制场合,尤其是需要精确定位的压机、机床等使用场合,有着非常实用的价值。
光栅尺位移传感器(简称光栅尺),是利用光栅的光学原理工作的测量反馈装置。
光栅尺位移传感器经常应用于机床与现在加工中心以及测量仪器等方面,可用作直线位移或者角位移的检测。
其测量输出的信号为数字脉冲,具有检测范围大,检测精度高,响应速度快的特点。
例如,在数控机床中常用于对刀具和工件的坐标进行检测,来观察和跟踪走刀误差,以起到一个补偿刀具的运动误差的作用。
在这里需要说明的是,光栅尺只是一个反馈装置,它可以将位移量和位移方向通过脉冲信号输出的方式反馈出来,但它不能直接显示出来,它还需要一个显示装置,比如通过CPLD来识别,或者本文中的微控制器STM32103F来识别。
光栅尺的输出信号为相位角相差90°的两路方波信号,如果A路超前B路90°,表示光栅尺在正向移动,反之,A路落后B路90°,表示反向移动。
STM32学习记录一、串口的问题:问题:自己做STM32核心板的PCB,其中一块是以串口1连接max232。
另一块是以串口2连接max232。
但是在用mcuisp下载时读取器件信息,只有串口1的那块读得到,以串口2的读取不到。
硬件检查了,没有问题。
回复:因为STM32默认的ISP.只有串口1能下载.一般说来串口1留做和电脑通信用.可以把一些模块如GSM接串口2,或者串口3啊.另外:STM32的串口1~3在MDK里面定义为USART1~3.而4和5定义为UART4,5.除了这点改变,其他的没啥变的,直接修改即可。
另外注意,串口2~5使用的是pclk1,为36M,而不是串口1的72M。
二、GPIO口设置问题:1.在看到GPIO的配置时。
浮空输入看的不明白,希望大家留下对其的理解。
答:顾名思义,浮空就是浮在空中.也就是没有什么把他拉下来,也没有什么把它拉上去.浮空最大的特点就是电压的不确定性,它可能是0V,也可能是VCC,还可能是介于两者之间的某个值(最有可能).浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响.2.浮空输入时能读引脚上的电平么?电平怎么确定?答:可以读,但是结果不正确的。
没意义。
3.那要是读管脚上的信息时,应该设置为上拉输入还是下拉输入呢?答:一般选择上拉.4.stm32普通的I/O接口是否需要接上拉或下拉电阻?接了会更稳定一些吗?答:不需要的.尤其是做输出的时候.做输入的时候,如果你喜欢,可以增加以下.5.STM32 IO口设置成输入模式的时候,好像可以设置上下拉,但是仔细看了数据手册,没有找到相关说明而原子例程,通过设置ODR寄存器来设置上下拉,ODR 不是输出数据寄存器吗怎么编程了上下拉设置了,而且数据手册上也没说啊把原子按键初始化代码最后两句注释掉程序也按键检测一样的,说明后两句没用void KEY_Init(void){RCC->APB2ENR|=1<<2; //使能PORTA时钟GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入08 KEY_UPGPIOA->CRL|=0X00000008;GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入GPIOA->CRH|=0X80800000;GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉GPIOA->ODR|=1<<15; //PA15上拉} 答:对于输入来说,ODR就是设置上下拉的6.你确定么我在数据手册上没有看到相关说明而且我把1改成零(按理说就设置成下拉了吧),这样按键就不能正常工作了吧但是事实是它照常工作问题还木有解决啊GPIOA->ODR|=0<<13; //PA13上拉,PA0默认下拉GPIOA->ODR|=0<<15; //PA15上拉答:你要看看你的外部电路,有没有上拉电阻下拉电阻什么的?或者接了其他外设.内部上下拉相当于100K左右的电阻.7.硬件我用的就是你的MIN STM32开发板,看了你的原理图,外部是没有上下拉电阻的,软件是在你的按键测试程序的基础上改答:PA13,15就是KEY0,KEY1,key0接了10K的上拉.KEY1接了10K的下拉.另外你的设置有问题,设置为1是或,为0,则需要与了.GPIOA->ODR|=0<<13; //PA13上拉,PA0默认下拉GPIOA->ODR|=0<<15; //PA15上拉所以这两句话,其实是不对的.8.以前有人问过关于这个上拉下拉的问题,GPIOC->ODR=1<<11;//PC11上拉,这个好理解;那下面的LED初始化的 GPIOA->ODR|=1<<8; //PA8 输出高,是不是说PA8输出是高电平,而不应该去理解为上下拉?不知道这样理解的对不对?地址为/posts/list/1004.htm-----------------------------------------------------------------------------------------------------------------------------------------------------------------原子你的STM32不完全手册中的第94页“给个实例,比如我们要设置PORTC的11位为上拉输入,12位为推挽输出。
AN2931应用笔记在高容量STM32F103xx微控制器中实现ADPCM算法前言本应用笔记描述了ADPCM音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S时,利用外部的DAC来播放ADPCM文件。
本应用笔记基于“AN2739:如何利用具有外部I2S音频编解码器的高容量STM32F103xx微控制器播放音频文件”。
由于关于SPI、I2S和外部DAC的部分在AN2739中已有说明,此处不再赘述。
因此,为了能充分理解本应用笔记,建议您参考AN2739。
2009年4月Doc ID 15349 Rev 21/15目录AN2931目录1ADPCM算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.1概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2ADPCM算法实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3ADPCM算法函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.1ADPCM_Encode函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.2ADPCM_Decode函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62实现示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.1说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2ADPCM文件生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3ADPCM文件加载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4ADPCM文件播放 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 3结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4修订历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142/15 Doc ID 15349 Rev 2AN2931表格索引表格索引表 1.ADPCM算法函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6表 2.ADPCM_Encode函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6表 3.ADPCM_Decode函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7表 4.文档修订历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Doc ID 15349 Rev 23/15图片索引AN2931图片索引图1.ADPCM文件生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8图2.DFU文件管理器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10图3.DFU文件管理器源浏览器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10图4.DfuSe软件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4/15 Doc ID 15349 Rev 2AN2931ADPCM算法1 ADPCM算法1.1 概述自适应差分脉冲编码调制, 或简称为ADPCM, 是波形编码的音频算法, 它通过以前的信号值预测当前的信号值, 并且仅发送真实值和预测值的差值。
学习笔记之STM32F103目录1. RCC_APB2Periph_AFIO的使用 (2)2. GPIO设置为输出时必须设置GPIO_SPEED (2)3. TIM_GetITStatus与TIM_GetITStatus的区别? (2)4. 上拉输入、下拉输入、浮空输入、模拟输入的区别 (3)1.RCC_APB2Periph_AFIO的使用需要用到外设的重映射功能和中断功能时才需要开启AFIO时钟,使用默认的复用功能时不需要开始AFIO时钟。
举例:重映射USART2USART2的TX/RX在PA.2/3 PA.2已经被Timer2的channel3使用需要把USART2的TX/RX重映射到PD.5/6库函数的调用。
(1)使能被重新映射到的I/O端口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);(2)使能被重新映射的外设时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);(3)使能AFIO功能的时钟(勿忘!)RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);(4)进行重映射GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);2.GPIO设置为输出时必须设置GPIO_SPEED.输入模式可以不用配置速度,但是输出模式必须确定最大输出频率。
当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声也高,当你不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
注意:GPIO的引脚速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与你的程序有关。
Abstract --- The quadrature encoder which is very popular in the motor servo control application, known as a 2-channel incremental encoder, converts linear displacementinto a pulse signal. By monitoring the number of pulses and the relative phase of thetwo signals you can track the position, the direction of rotation and speed. In ddition,a third channel, or index signal, can be used to reset the position counter.STM3210x which is the MCU based on ARM latest core - Cortex-M3, integrates thequadrature encoder interface. Accordingly STM3210x can handles the encodersignal without any CPU overhead which it is possible for CPU to focus on the vectorcontrol.在马达控制类应用中, 正交编码器可以反馈马达的转子位置及转速信号。
TM32F10x 系列MCU集成了正交编码器接口,增量编码器可与MCU直接连接而无需外部接口电路。
该应用笔记详细介绍了STM32F10x与正交编码器的接口,并附有相应的例程,使用户可以很快地掌握其使用方法。
1正交编码器原理正交编码器实际上就是光电编码器,分为增量式和绝对式,较其它检测元件有直接输出数字量信号,惯量低,低噪声,高精度,高分辨率,制作简便,成本低等优点。
增量式编码器结构简单,制作容易,一般在码盘上刻A、B、Z三道均匀分布的刻线。
由于其给出的位置信息是增量式的,当应用于伺服领域时需要初始定位。
格雷码绝对式编码器一般都做成循环二进制代码,码道道数与二进制位数相同。
格雷码绝对式编码器可直接输出转子的绝对位置,不需要测定初始位置。
但其工艺复杂、成本高,实现高分辨率、高精度较为困难。
本文主要针对增量式正交编码器,它产生两个方波信号A和B,它们相差+/- 90°,其符号由转动方向决定。
如下图所示:图1:增量式正交编码器输出信号波形2STM32F10x正交编码器接口详述STM32F10x的所有通用定时器及高级定时器都集成了正交编码器接口。
定时器的两个输入TI1和TI2直接与增量式正交编码器接口。
当定时器设为正交编码器模式时,这两个信号的边沿作为计数器的时钟。
而正交编码器的第三个输出(机械零位),可连接外部中断口来触发定时器的计数器复位。
2.1定时器正交编码器接口框图图2:定时器正交编码器接口2.2功能描述选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIM1_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011。
通过设置TIM1_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以对输入滤波器编程。
两个输入TI1和TI2被用来作为增量编码器的接口。
参看表1,假定计数器已经启动(TIM1_CR1寄存器中的CEN=1),则TI1FP1或TI2FP2上的有效跳变作为计数器的时钟信号。
TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。
根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。
依据两个输入信号的跳变顺序,计数器向上或向下计数,因此TIM1_CR1寄存器的DIR位由硬件进行相应的设置。
不管计数器是对TI1计数、对TI2计数或者同时对TI1和TI2计数。
在任一输入(TI1或者TI2)跳变时都会重新计算DIR位。
编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。
这意味着计数器只在0到TIM1_ARR寄存器中自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。
所以在开始计数之前必须配置TIM1_ARR;同样,捕获器、比较器、预分频器、周期计数器、触发输出特性等仍工作如常。
编码模式和外部时钟模式2不兼容,因此不能同时操作。
在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此,它的内容始终指示着编码器的位置。
计数方向与相连的传感器旋转的方向对应。
表1列出了所有可能的可能的组合,假设TI1和TI2不同时变换。
表1:计数方向与编码器信号的关系一个外部的增量编码器直接和MCU连接不需要外部接口逻辑。
但是,一般使用比较器将编码器的差动输出转换到数字信号,这大大增加了抗噪声干扰能力。
编码器输出的第三个信号表示机械零点,可以连接到一个外部中断输入,触发一个计数器复位。
图2给出一个计数器操作的实例,显示了计数信号的产生和方向控制。
它还显示了当选择了双边沿时,输入抖动是如何被抑制的;这种情况可能会在传感器的位置靠近一个方向转换点时发生。
在这个例子中,我们假定配置如下: z CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)z CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2)z CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)z CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2)z SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).z CEN=’1’ (TIMx_CR1寄存器,计数器使能)图3 编码器模式下的计数器操作实例图3为当IC1FP1极性反相时计数器的操作实例(CC1P=’1’,其他配置与上例相同)图4 IC1FP1反相的编码器接口模式实例当定时器配置成编码器接口模式时,提供传感器当前位置的信息。
如果使用另一个配置在捕获模式的定时器,测量两个编码器事件的间隔,可以获得动态的信息(速度,加速度,减速度)。
指示机械零点的编码器输出可被用作此目的。
根据两个事件间的间隔,可以按照固定的时间读出计数器值。
如果可能的话,你可以把计数器的值锁存到第三个输入捕获寄存器(捕获信号必须是周期的并且可以由另一个定时器产生)。
它也可以通过一个由实时时钟产生的DMA请求来读取它的值。
3例程为了使用户更快捷地掌握和使用STM32F10x的正交编码器接口,该应用笔记 提供了一个应用例程。
该例程基于学习板EK_STM32F,开发环境为IAR EWARM 4.42A。
3.1文件目录例程的文件目录如下图所示。
在安装完IAR EWARM 4.42A后,直接双击以下目 录 \example\project\EWARM\下的project Workspace文件,打开该例程。
在上图中:z FWLib目录包含了STM32F10x的标准库文件;z Project 目录中,source目录包含了例程的源文件,而头文件在include目录中。
3.2功能描述正交编码器的输出信号A和B分别连接MCU的PA6和PA7管脚,这两个管脚复用为TIM3_CH1及TIM3_CH2。
LCD可用于显示三类信息,分别为:TIM3的计数器值、马达转子的电角度值(即马达转子的位置,取值范围为-180度 ~ +180度,其单位为1度)及马达转动的电频率(其单位为0.1Hz)。
由于学习板EK_STM32F 的LCD一次只能显示四个数值,因此该例程使用了KEY2键来切换LCD的显示内容。
3.3例程函数描述该例程共有五个源文件,分别为:z main.c:主程序z lcd.c:LCD驱动程序z stm32f10x_encoder.c:正交编码器的接口驱动程序z stm32f10x_it.c:包含了定时器2的中断程序z stm32f10x_Timebase.c:SysTick的时基程序每个源文件包含的函数如下表所示。
表2 main.c包含的函数函数名函数功能描述RCC_Configuration 配置系统的时钟GPIO_Configuration 配置GPIONVIC_Configuration 配置NVICLcdShow_Init 初始化LCD驱动,Timer2驱动LCDKEYS_Init 键盘接口初始化KEYS_Read 键值的读取表3 lcd.c包含的函数函数名函数功能描述Convert ASCII码字符转换成LCD的驱动缓存值write_char 在LCD上显示一个字符write_string 在LCD上显示一个字符串int2char 无符号整数值转换成一个字符串表4 stm32f10x_encoder.c包含的函数函数名函数功能描述ENC_Init 正交编码器接口的初始化,Timer3驱动编码器ENC_Get_Electrical_Angle 计算马达转子的位置电角度ENC_Clear_Speed_Buffer 初始化马达速度缓存ENC_Calc_Rot_Speed 计算马达转动的电频率ENC_Calc_Average_Speed 计算马达转动的平均电频率LCD_Display LCD显示管理TIM3_IRQHandler Timer3的Update中断处理程序表5 stm32f10x_it.c包含的函数函数名函数功能描述TIM2_IRQHandler Timer2的OC中断处理程序,实现LCD的动态驱动表6 stm32f10x_Timebase.c包含的函数函数名函数功能描述TB_Init 时基定时器(SysTick)的初始化TB_Set_DisplayDelay_500us LCD显示刷新的时基配置TB_DisplayDelay_IsElapsed 判断LCD显示刷新的时基是否已经结束SysTickHandler SysTick的中断处理程序3.4例程性能分析增量编码器由TM32F10x的定时器硬件处理,查看该例程,我们可以发现,定时器有一个Update中断。
该中断响应定时器的计数器溢出事件。
其中断处理程序如下:void TIM3_IRQHandler(void){/* Clear the interrupt pending flag */TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);if (hEncoder_Timer_Overflow != U16_MAX){hEncoder_Timer_Overflow++;}}上述函数是CPU唯一要处理的,它只有几条语句,因此几乎不需要CPU花多少时间去处理它。