stm32f103 编码器模式总结

发布者:SereneSpirit最新更新时间:2017-09-26 来源: eefocus关键字:stm32f103  编码器模式 手机看文章 扫描二维码
随时随地手机看文章

/**************************************************************************

函数功能:把TIM2初始化为编码器接口模式

入口参数:无

返回 值:无

**************************************************************************/

void Encoder_Init_TIM2(void)

{

RCC->APB1ENR|=1<<0; //TIM2时钟使能

RCC->APB2ENR|=1<<2; //使能PORTA时钟

GPIOA->CRL&=0XFFFFFF00;//PA0 PA1

GPIOA->CRL|=0X00000044;//浮空输入

/* 把定时器初始化为编码器模式 */

TIM2->DIER|=1<<0; //允许更新中断

TIM2->DIER|=1<<6; //允许触发中断

MY_NVIC_Init(1,3,TIM2_IRQn,1);


/* Timer configuration in Encoder mode */

TIM2->PSC = 0x0;//预分频器

TIM2->ARR = 65535;//设定计数器自动重装值

TIM2->CR1 &=~(3<<8);// 选择时钟分频:不分频

TIM2->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式,计数器依据方向位DIR向上向下计数

//这里的计数方向根据TI1和TI2脉冲前后硬件决定

TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1

TIM2->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2

TIM2->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1

TIM2->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2

TIM2->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器

TIM2->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效

if(Menu_MODE==1) TIM2->CNT = 10000; //位置模式

else TIM2->CNT = 0; //速度模式

TIM2->CR1 |= 0x01; //CEN=1,使能定时器

}



/**************************************************************************

函数功能:把TIM2编码器接口模式中断

--

--

**************************************************************************/

void TIM2_IRQHandler(void)

{

if(TIM2->SR&0X0001)//溢出中断

{

}

TIM2->SR&=~(1<<0);//清除中断标志位

}



/**************************************************************************

函数功能:单位时间读取编码器计数

入口参数:定时器

返回 值:速度值 重点在于清零CNT寄存器的值

**************************************************************************/

int Read_Velocity(u8 TIMX)

{

int Encoder_TIM;

switch(TIMX)

{

case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0; break;

case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0; break;

case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0; break;

default: Encoder_TIM=0;

}

}


/**************************************************************************

函数功能:读取位置信息

入口参数:定时器

返回 值:位置值 重点在于不清零CNT寄存器的值

**************************************************************************/

int Read_Position(u8 TIMX)

{

int Encoder_TIM;

switch(TIMX)

{

case 2: Encoder_TIM= (short)TIM2 -> CNT; break;

case 3: Encoder_TIM= (short)TIM3 -> CNT; break;

case 4: Encoder_TIM= (short)TIM4 -> CNT; break;

default: Encoder_TIM=0;

}

return Encoder_TIM;

}







关键字:stm32f103  编码器模式 引用地址:stm32f103 编码器模式总结

上一篇:stm32f103 pwm模式配置总结
下一篇:STM32定时器单脉冲输出

推荐阅读最新更新时间:2024-03-16 15:38

STM32F103 GPIO基本原理与寄存器
GPIO基本原理与寄存器配置 STM32F103ZET6 一共有7组IO口 每组IO口有16个IO 一共16X7=112个IO GPIOA,GPIOB—GPIOG 4种输入模式: 输入浮空 输入上拉 输入下拉 模拟输入 4种输出模式: 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 3种最大翻转速度: -2MHZ -10MHz -50MHz 上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。 推挽输出:可以输出强高低电平,连接数字器件 开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相
[单片机]
STM32F103 与 STM32F407引脚兼容问题
解决方案1: STM32F103有的功能407都有,并且这些功能的引脚完全兼容,只是程序不同而已。。。 而STM32F407有的功能103不一定有,因为407强大些。。。。。。希望对你有用 解决方案2: 不能。407支持摄像头,I2S等引脚,103都没有 解决方案3: 普通IO都一样,407有更多的附加功能。值得注意的是,407的电源引脚与103的有很大的区别,一定要注意!
[单片机]
stm32f103——IIC总线通信与EEPROM
IIC总线通信——集成电路总线 1》物理层 1,IIC是一种简单的双向二线制串行通信的通信方式,SCL(时钟线),SDA(数据线)(可双向传输数据),注意:IIC是半双工同步通信协议。 2,IIC是飞利浦公司开发总线协议。IIC是高位先行的通信方式(先发送高位) 3,IIC可以实现多主机多从机通信,但是IIC没有片选信号。每一个设备都有唯一的ID,主机通过SDA数据线发送设备的地址来查找从机 4,在IIC总线上必须接两个上拉电阻,用于将总线拉高 5,IIC的SCL线的作用:用于控制SDA线上的数据的有效性----SCL为高电平时,SDA线上的数据有效。SCL为低电平时,SDA线上的数据无效 6,当有
[单片机]
<font color='red'>stm32f103</font>——IIC总线通信与EEPROM
STM32F103单片机使用内部RC振荡器做时钟源
平时在做项目的时候都用的是外部晶振做为时钟源,想试试用内部RC振荡器做为时钟源,在网上搜了一下如何设置内部时钟,发现资料比较少的。决定将设置内部RC振荡器做为时钟源的方法记录下来。 用的单片机是STM32F103C8T6,项目工程是在正点原子的示例代码上修改来的。用一个LED工程测试,在主程序中闪烁LED灯。 #include sys.h #include delay.h #include usart.h #include led.h int main ( void ) { delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口 while
[单片机]
错误解决:STM32F103串口1与串口3相同代码却结果不同
在前几天调试openmv时发现同样的代码串口1和串口3的结果却是不一样的,当时着实是把我坑了很久,怎么都找不到原因,用示波器看波形也是没有问题的,在Openedv网站上有位网友指出是我初始化代码的问题,在翻阅参考手册后终于发现了问题。 下列代码为我原本的初始化代码: #include sys.h #include usart.h #include led.h #include usart3.h int theta_err,rho_err; int main(void) { Stm32_Clock_Init(9); //=====系统时钟设置 delay_init(72); //
[单片机]
错误解决:<font color='red'>STM32F103</font>串口1与串口3相同代码却结果不同
stm32f103r6仿真计数器程序+Proteus
单片机源程序如下: #include stm32f10x.h #include Delay.h #include smg.h #include sys.h #include timer.h #include led.h #include fmq.h #include key.h #include stm32f10x_tim.h uint16_t table = { /* 0, 1, 2, 3, 4, 5, 6, 7, 8, */ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, /* 9, A, B, C,
[单片机]
<font color='red'>stm32f103</font>r6仿真计数器程序+Proteus
基于stm32f103zet6的外部中断学习
一、关于中断中的结构体EXTI_InitTypeDef 原型:uint32_t EXTI_InitTypeDef::EXTI_Line { uint32_t EXTI_Line FunctionalState EXTI_LineCmd EXTIMode_TypeDef EXTI_Mode EXTITrigger_TypeDef EXTI_Trigger }含有4个成员 1、Specifies the EXTI lines to be enabled or disabled. This parameter can be any combination of EXTI_Lines EXTI_Lines的取值可以是下面的数字 #defi
[单片机]
STM32F103单片机RTC结合time.h使用
在使用stm32f103系列单片机的时候总是会碰到RTC计时的问题,103系列单片机的RTC使用的是秒计时 在经过一段时间的研究,终于发现了一种比较简单而且易于理解的使用方法,就是结合系统文件time.h的使用 首先要添加头文件 #include time.h RTC的初始化和普通方式无区别 u8 RTC_Init(void) { //检查是不是第一次配置时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE);
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved