stm32的通用计数器用于编码器的脉冲计数

发布者:Jinyu521最新更新时间:2018-07-19 来源: eefocus关键字:stm32  通用计数器  编码器  脉冲计数 手机看文章 扫描二维码
随时随地手机看文章

这周做电脑鼠的编码器模块,整整的折腾了一周。
这过程真是让我们哭笑不得,我们打算用TIM3的CH3和CH4通道采集左电机的pwm来测速和测距,用TIM4的CH2和CH1来测右电机的。
写代码时,我们先做的是左电机的,整整闹到了礼拜五,才发现通用定时器的CH3和CH4通道不能用来做PWM输入,晕!!下面是我们的配置之一,拿出来与大家分享分享!
  我们用GPIO_B_7,TIMER4的二通道


 void MY_CONFIG(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;  
   GPIO_InitTypeDef GPIO_InitStructure;
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   /* TIM4 clock source enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  /* Enable GPIOA, clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 
GPIO_Init(GPIOB, &GPIO_InitStructure);

//TIM4输出初始化 
TIM_DeInit(TIM4);  
TIM_TimeBaseStructure.TIM_Period = 100; //计数值=100-1 
TIM_TimeBaseStructure.TIM_Prescaler = 0; //预分频 
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down; //模式 
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //基本初始化

TIM_SetCounter(TIM4, 100); //设置 TIM4 计数器寄存器值  
 //设置 TIMx 自动重装载寄存器值 
 TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2); //若为通道1 ,则为TIM_TS_TI1FP1
//TIM_SelectInputTrigger(TIM2, TIM_TS_TI1F_ED); 
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1); 
//TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);

TIM_SetCompare2(TIM4, 100); //若用1通道。则为:TIM_SetComper1(TIM4,100);
TIM_Cmd(TIM4, ENABLE); //启动TIM4 
TIM_ClearFlag(TIM4, TIM_IT_CC2); //若用一通道,则此处和后面的TIM_IT_CC2都改为TIM_IT_CC1
TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE)
//中断配置

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel;; // 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级0 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级0 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断 
NVIC_Init(&NVIC_InitStructure);    //写入设置 
}

void TIM4_IRQHandler(void) 
{

TIM_ClearFlag(TIM4, TIM_IT_CC2);


悲催了,还得重新画板子。不过关于stm32的通用定时器学到了不少,继续加油


关键字:stm32  通用计数器  编码器  脉冲计数 引用地址:stm32的通用计数器用于编码器的脉冲计数

上一篇:STM32正交编码器接口
下一篇:STM32定时器的编码器模式

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

STM32时钟树-RCC
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接 外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、 HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最 大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被 选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源 还可以选
[单片机]
STM32 逐次逼近寄存器型(SAR)模拟数字转换器(ADC)
是采样速率低于5Msps (每秒百万次采样)的中等至高分辨率应用的常见结构。 SAR ADC的分辨率一般为8位至16位,具有低功耗、小尺寸等特点。 这些特点使该类型ADC具有很宽的应用范围,例如便携/电池供电仪表、笔输入量化器、工业控制和数据/信号采集等。 顾名思义,SAR ADC实质上是实现一种二进制搜索算法。 所以,当内部电路运行在数兆赫兹(MHz)时,由于逐次逼近算法的缘故,ADC采样速率仅是该数值的几分之一。 SAR ADC的架构 尽管实现SAR ADC的方式千差万别,但其基本结构非常简单(见图1)。 模拟输入电压(VIN)由采样/保持电路保持。 为实现二进制搜索算法,N位寄存器首先设置在中间刻度(即:100... .00
[单片机]
<font color='red'>STM32</font> 逐次逼近寄存器型(SAR)模拟数字转换器(ADC)
stm32使用FPU时注意事项
除了网上的教程外,还要特别注意,当运算中有浮点的数字时要把,数字后面加上一个f。例如表达式中有4.321参与运算。。当你不在4.321后加f时,stm32F405的片子不知道把他当做单精度float用FPU来运算,,默认可能是当做double来运算(我不确定),运算速度还是很慢。。切记所有浮点数字后面加上f,,,,有时候keil会提示warning: #1035-D: single-precision operand implicitly converted to double-precision 这句话的意思就是单精度运算隐式转换成了双精度运算了。这个时候就要在单精度数字后面加个f keilmdk的设置中完整的define是
[单片机]
STM32外设ADC细节】-注入组与规则组的不同点
参考文档:RM0008 Reference manual.pdf(STM32参考手册) 参考章节: 11.3 AD functional description 11.3.3 Channel selection 11.3.9 Injected channel management 一、注入组与规则组的不同点如下: 1、通道数不同 ADC模块有16个多路通道,可以把转换组织成2个组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 规则组最多16个转换组成。而注入组最多4个转换组成。 2、注入组通道可以打
[单片机]
终于我也可以对STM32低功耗进行总结
STM32F103R8和RC的停机模式的休眠电流还不一样,R8停机模式实测为11UA,RC停机模式实测为30uA,还以为又是我的程序哪里没做好呢,仔细看了PDF,这两个芯片PDF上标的值的确有区别,和我测的值差不多,那我就没有再深究的意义了! 结合下文的高手经验,反复摸索, standby模式1.9uA,PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); stop模式:11uA, PWR_EnterSTANDBYMode(); 实验证明,将IO端口设成IPU/IPD/AIN/PPOUT=1/PPOUT=0/ODOUT=0,电流是基本
[单片机]
终于我也可以对<font color='red'>STM32</font>低功耗进行总结
关于STM32串口首字符出现乱码的问题
出现的问题:在使用sscom32串口调试助手,首字符出现乱码“tarttarttarttarttarttart” 原因:波特率过高 解决办法:将波特率设置的低一点,通常9600即可 现象:乱码为波特率较高; 正常显示波特率较低 函数代码如下: int main(void) { USART1_Init(); printf( Start ); } #include usart1.h void USART1_Init(void) { USART1_GPIO_Config(); USART1_Structure_Config(); USART_Cmd(USART1, ENABLE); }
[单片机]
关于<font color='red'>STM32</font>串口首字符出现乱码的问题
STM32之DAC
STM32F103VCT6自带两个12位DAC,DAC的转换速度一直没有查到,网上有人说是1MHZ的频率,那就是1us了。ADC的转换时间在56MHZ工作频率下为1us,在72MHZ工作频率下为1.17us。如果AD和DA有对称关系的话,那么很可能跟ADC的时间相同。(仅作分析用!) DAC于我,有两个用途:输出波形和输出固定电压。先来说说前者的配置。 第一个参数:触发方式,DAC_InitStructure.DAC_Trigger。可选的外部触发源一共有八个。六个是定时器触发:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下两个分别是:EXTI线路9和软件触发。如果采用定时器触发的话,就
[单片机]
STM32速成笔记(10)—IWDG
一、IWDG简介 独立看门狗 (Independent Watchdog, IWDG ),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。 二、STM32的IWDG 2.1 STM32的IWDG简介 STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗
[单片机]
<font color='red'>STM32</font>速成笔记(10)—IWDG
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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