void TIM4_Init(u16 arr,u16 psc)

{

TIM4_Handler.Instance=TIM4;

TIM4_Handler.Init.Prescaler=psc;                     //分频系数

TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器

TIM4_Handler.Init.Period=arr;                        //自动装载值

TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子

TIM4_Encoder_Handler.EncoderMode=TIM_ENCODERMODE_TI12;

TIM4_Encoder_Handler.IC1Filter=0;

TIM4_Encoder_Handler.IC1Polarity=TIM_ICPOLARITY_RISING;

TIM4_Encoder_Handler.IC1Prescaler=TIM_ICPSC_DIV1;

TIM4_Encoder_Handler.IC1Selection=TIM_ICSELECTION_DIRECTTI;

TIM4_Encoder_Handler.IC2Filter=0;

TIM4_Encoder_Handler.IC2Polarity=TIM_ICPOLARITY_RISING;

TIM4_Encoder_Handler.IC2Selection=TIM_ICSELECTION_DIRECTTI;

TIM4_Encoder_Handler.IC2Prescaler=TIM_ICPSC_DIV1;

HAL_TIM_Encoder_Init(&TIM4_Handler,&TIM4_Encoder_Handler);

HAL_TIM_Encoder_Start(&TIM4_Handler,TIM_CHANNEL_ALL);

HAL_TIM_Encoder_Start_IT(&TIM4_Handler,TIM_CHANNEL_ALL);//开启中断

TIM4->CNT=1000;

__HAL_TIM_ENABLE_IT(&TIM4_Handler,TIM_IT_UPDATE);   //使能更新中断

__HAL_TIM_ENABLE(&TIM4_Handler);

}

在这里我们配置编码器模式,开启时钟和溢出中断

//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

if(htim==(&TIM4_Handler))
        {
                if ( (TIM4->CR1&0x0010) == 0 )  //向上计数溢出                 {
                        Interupt_Num++ ;
                }
                else //向下计数溢出
                {
                        Interupt_Num-- ;
                }               
        }
}

在中断回调函数里,我们将TIM4->CR1的第5位不变,假如第五位是0,应选择递增计数,我们让计数器增加1。(0x0010==0000 0000 0001 0000)这里的次数我们是在计算溢出次数。要注意我们在TIM4_Init() 是把计数器CNT的值设为了1000,而ARR设置成了2000,这样计数器每次开始工作都是从1000->2000,0->2000,0->2000这样循环,Interupt_Num的值就是我们记录的溢出总数,而最开始的一次溢出是从1000开始,所以总的脉冲数就是 (溢出总数-1)*2000+1000(最开始的1000)+ CNT(计数器内未达到2000的值),之所以用溢出总数-1是因为我们总的脉冲数里把最开始1000->2000的值加进去了,所以要减去1000->2000的一次溢出次数。
TIM4_Init(2000,3);在主函数内初始化TIM4时设置了ARR为2000。

void Circle_Print()
{       
        AAA =Pulse_Num;
        if (Interupt_Num ==0 )                        //CNT从1000开始,刚开始的时候计算脉冲的方法
                Pulse_Num = TIM4->CNT-1000 ;
        else
        {  
                Pulse_Num = 1000 + (Interupt_Num - 1) *2000 +TIM4->CNT ; //在第一圈完成之后,计算脉冲数多的方法
        }

speed =(Pulse_Num-AAA);//每100ms转过的脉冲,近似看成速度了
        Circle_NUm =  Pulse_Num/1560.0f                ;                 //所有人脉冲除以细分数就可以得到转的圈数(正负之分)
        printf("Interupt_Num的值是:%ld--捕获到的总数是%ld*****转过的圈数是%f*****本次脉冲为%f\r\n" , Interupt_Num, Pulse_Num , Circle_NUm ,speed );
}

AAA是我设置用来计算速度的变量。在每次最开始调用Circle_Print()的时候我们首先把测过的总的脉冲数赋给变量AAA,此时AAA=0,,然后在Pulse_Num = 1000 + (Interupt_Num - 1) *2000 +TIM4->CNT ; //在第一圈完成之后,计算脉冲数多的方法这一句计算总的脉冲数,计算原理我们已经在上一条说过了。然后在这一句speed =(Pulse_Num-AAA);我们用至今为此总的脉冲数减去AAA即为每两次调用Circle_Print()的脉冲差,而我们在主函数中使用一个100ms的延时,所以时间差为100ms,脉冲反映小车路程,可以得到速度。
***硬件***
我使用的编码器(6线,分AB相,客服叫做13相?不太懂)转一圈是390个脉冲,使用四倍频,转一圈即为1560个脉冲。用总脉冲数除以1560即为至今为止转过的圈数。
小车直径为6.3cm(没找到参数,手动测量的0.0),  周长约为0.204m.
***下载验证***
 可以看到,第一个返回总的溢出数,第二个为总圈数,第三个为速度。
因为在主函数中使用一个100ms的延时,每0.1秒转过的脉冲数为160左右,约为0.1圈,每秒转过1圈。
***tips***
在@北名茗水 的中断回调函数程序里有一句PB0!=PB0;而我的电机一IN1接的就是PB0,我改的时候忘记删掉了这句,然后我的第一个轮子(编码器接的第二个轮子)就一会转一会不转0.0

在文件中写入了函数之后要在头文件和主函数里添加初始化,否则不会识别。

TIM4_Init(2000,3);在主函数内初始化TIM4时设置了ARR为2000。

欢迎批评斧正。

89MVP0O2BU~@CJ){Y]]`JD2.png (39.54 KB, 下载次数: 5)

学习笔记STM32F429使用编码器测速HAL库版本相关推荐

  1. STM32定时器编码器模式实现直流有刷电机测速(HAL库)

    前言 最近在做一个单片机大作业,要用到直流有刷,在这里把学习编码器的知识记录一下,学习参考资料: 正点原子DMF407电机控制专题教程_V1.0 编码器测速原理 我所使用的编码器是市面上常见的磁电增量 ...

  2. STM32 HAL库实现编码器测速

    STM32 HAL库实现编码器测速 (还开了串口1用来调试,下文没写:然后那个short的用法就是看平衡小车之家(就是喵呜实验室的文档里头的,用法确实惊艳),文末贴了工程) 编码器接口模式 TI1和T ...

  3. smb测速工具_编码器测速例子

    编码器测速例子 各位好,我现在要用 CPU226 通过编码器测电机转速,看了许多手册编的程序总是测不出来, 编码器用的是 A/B 两相的,那位能给发个简单的例子啊, 转自网上的回答, 我也正在学习这个 ...

  4. Stm32-使用TB6612驱动电机及编码器测速

    这里写目录标题 起因 一.电机及编码器的参数 二.硬件 三.接线 四.驱动电机 1.TB6612电机驱动 2.定时器的PWM模式驱动电机 五.编码器测速 1.定时器的编码器接口模式 2.定时器编码器模 ...

  5. 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc

    课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...

  6. 一种基于STM32F1 MCU的增量型编码器测速的方法

    遇到的问题 1. 编码器信号,用来计量长度,如果需要同时测量当前实时速度,在不增加接口的情况下,实现较为准确实时的测速 2. 简单的M法速度,对于低速信号,测量精度较差,实时性也不高. 测速方法 之前 ...

  7. CUDA学习笔记(持续更新——蜗速)

    CUDA学习笔记(持续更新--蜗速) 1.CUDA 程序实现流程如下 2.内存管理 3.核函数 4.全局数据访问唯一索引 5.设备管理 附录代码 1.CUDA 程序实现流程如下 将数据从CPU内存拷贝 ...

  8. 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc

    基于51单片机光电编码器测速 PAGE PAGE 2 课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器 ...

  9. 直流有刷电机编码器测速基于STM32F302R8+X-NUCLEO-IHM07M1

    文章目录 前言 一.编码器测速原理 二.STM32F302R8+X-NUCLEO-IHM07M1直流电机编码器测速 2.1.功能需求 2.2.硬件设计 2.3.软件设计 2.3.1.底层配置 2.3. ...

最新文章

  1. WebSpider的编码问题(乱码)浅析
  2. Linux shell 编程入门 - 使用ubuntu-14.10
  3. 15.4.5 简化元组的使用
  4. Windows 之 删除文件出现“该项目不在请确认该项目的位置”
  5. 35岁以前把下面十件事做好
  6. 代码质量检测平台架构设计
  7. HDU2025 查找最大元素【最值】
  8. 数域、有限域(伽罗瓦域)
  9. 瑞利信道,莱斯信道和高斯信道模型
  10. 三星530换固态硬盘_笔记本电脑换固态硬盘+装系统
  11. 免费苹果账号(apple id)申请ios证书p12真机调试
  12. css常见定位、居中方案
  13. 职能部门绩效考核指标设置
  14. HTML与CSS学习
  15. 微信卡包开发php,一个用起来非常简单,功能丰富的微信开发包
  16. Jupyter Notebook简洁教程
  17. 网络工程师模拟测试题
  18. 外汇交易与实务--即期外汇交易
  19. 关于EBGP用回环口起邻居遇到的问题
  20. maven明明本地仓库有依赖包,还会远程下载的问题

热门文章

  1. 爆了!K哥搞定8个Offer
  2. 论文阅读《How Does Knowledge Graph Embedding Extrapolate to Unseen Data: A Semantic Evidence View》
  3. python - windows 之 win32api资料教程与函数大全
  4. 如何使用WordPress事件日历插件
  5. c语言装饰,C/C++知识点之装饰器模式(Decorator) C++
  6. 小白兔是世界上笑话最多的禽兽
  7. L4级自动驾驶方案---安霸CV2 SOC芯片
  8. 2020华为实习生(提前批)面试经验
  9. 利用大数据挖掘创新市场监管新方式
  10. 创新实训(1)——小组成员初步讨论,进行小组分工,明确项目范围项目范围