实验目的:刚开始接触关机电机检测领域,准备探索关于定时器在检测单路脉冲中的应用,从而进行转速的检测。
使用芯片:STM32F407
使用平台:STM32Cube IDE

  1. M/T法介绍
    对于M/T法网上的资料很多,因此我只做一些简单的介绍。
  • M法:在规定时间内检测脉冲个数来获得被测速度,适合测量高速速度。
    方法:在Tg时间内,设电机每转一圈发出的脉冲数为P,在Tg(单位为S)时间内测得的总脉冲数是m1,那么转速nM = 60 * m1/ (P * Tg),单位是r/min。
  • T法:测量相邻两个脉冲间的时间,再来反算速度,适合测量低速速度
    方法:已知频率为fc的高频脉冲,开始测速时fc会向一计数器发送脉冲数,当电机产生的相邻的两个脉冲中第一个脉冲出现时,计数器开始接收fc发过来的脉冲,当电机产生的相邻的两个脉冲中第二个脉冲出现时,即电机的一个周期到达时,计数器停止计数,相邻两脉冲之间的计数器读数为m2,已知电机一圈脉冲P个,那么转速nM = 60 * fc/ (P*m2),单位是r/min。
  • M/T法:同时测量检测时间和在此时间内脉冲发生器发出的脉冲个数来测量速度
    方法:已知频率为fc的高频脉冲,在Tg时间内测得的高频脉冲m2个,输入的电机脉冲m1个,已知电机一圈脉冲P个,那么转速nM=60 * m1 * fc/ (P*m2),单位是r/min。
    此外,我们也可以在捕获到电机上升沿脉冲时开启定时时间计数,在定时时间Tg到达后,继续等待一个上升沿脉冲,时间为Td,记录在此时间内的脉冲数,由脉冲数除以时间,就可以得到准确的频率从而计算速度。目前我使用的M/T法采用前一种方法。
    2、定时器设置
  • 200ms定时器设置

首先需要设置好一个用来定时时间的定时器,我使用TIM1,定时200ms。定时器时钟信号是80MHz



采用200ms定时。

  • 外部脉冲捕获设置
    使用TIM3_CH1进行外部脉冲输入捕获,定时器设置如下



    对电机脉冲进行上升沿捕获,通过捕获来判断外部脉冲开始。
  • 对外部脉冲进行计数
    使用TIM4进行脉冲计数,将定时器TIM4的时钟源选用外部脉冲就可以实现脉冲计数功能,设置如下:



    当捕获到外部脉冲时就准备开始外部脉冲计数。
  • 高频脉冲产生器
    使用TIM5定时器来产生5MHz方波频率

  • 对高频脉冲进行计数
    使用TIM8进行高频脉冲计数



    相当于对TIM5产生高频5MHz脉冲进行计数,通过定时器的主从模式就可以实现该功能。

    通过该功能表进行选择。
    3、程序代码实现
    主函数中
   switch (capture_Cnt){case 0:htim3.Instance->CNT = 0;htim4.Instance->CNT = 0;htim8.Instance->CNT = 0;TIM3_CNT = MSpeed_capture_Buf[2] = 0;ExPulse_Input = 0;TimeSet = 1;T200MS_CNT = ThighFre_CNT = TExPulse_CNT = T200SUS = 0;tt = 0;__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);//开启上升沿捕获HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);  //开启TIM3_CH1捕获__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);//更新中断用于溢出计数capture_Cnt++;HAL_TIM_Base_Start_IT(&htim1);  /* 200MS */break;case 4://4T_SPEED = 60.0 * CAL_capture_Buf[1] * High_Freq / (PULSE_CIRCLE * CAL_HIGHFRE_Buf[1]);//60.0 * HIGHFRE_Buf[1] / (PULSE_CIRCLE * capture_Buf[1]);
//          T_SPEED1 = 60.0 * capture_Buf[1] * High_Freq / (PULSE_CIRCLE * HIGHFRE_Buf[1]);capture_Cnt = 0;  if(MSpeed_capture_Buf[2] != 0){M_SPEED = 1.0 / (((MSpeed_capture_Buf[1] + MSpeed_capture_Buf[2]  * 65535) - MSpeed_capture_Buf[0]) / 80000000.0 * 2);if(M_SPEED < 0.5){MSpeed_capture_Buf[1] = 0;}MSpeed_capture_Buf[2] = 0;}else{M_SPEED = 1.0 / ((MSpeed_capture_Buf[1] - MSpeed_capture_Buf[0]) / 80000000.0 * 2);}}

在中断中

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(TIM1 == htim->Instance){//      HAL_GPIO_TogglePin(D2_LED_GPIO_Port,D2_LED_Pin);T200MS_CNT++;if(ExPulse_Input == 0)//200ms内还没捕获到第一个上升沿脉冲周期{T200MS_CNT = 0;tt++;if(tt == 10)//200*10 = 2000ms{}}else//200ms内已经捕获到第一个上升沿脉冲周期{if(T200MS_CNT == 1)//1  TimeSet{if(ExPulse_Input == 2){HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_SET);__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);//开启上升沿捕获HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);}else{T200MS_CNT = 1;T200SUS++;}}else if(T200MS_CNT == (TimeSet + 1))//2{{T200MS_CNT = 0;tt = 0;HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_RESET);}}}}if(TIM8 == htim->Instance){ThighFre_CNT++;}if(TIM4 == htim->Instance){TExPulse_CNT++;}if(TIM3 == htim->Instance){TIM3_CNT++;}  }
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(TIM3 == htim->Instance){switch(capture_Cnt){case 1://捕获到第一个上升沿ExPulse_Input = 1;HAL_GPIO_WritePin(LED2_GPIO,LED2_GPIO_PIN,GPIO_PIN_SET);htim3.Instance->CNT = 0;htim5.Instance->CNT = 0;HAL_TIM_Base_Start(&htim4);//HAL_TIM_Base_Start(&htim8);//
//              HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1); //停止捕获HAL_TIM_Base_Start_IT(&htim8);capture_Cnt++;MSpeed_capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);//开启下降沿捕获break;case 2://捕获到第二个上升沿,用来进行低速的测量,目前测试效果不好,可以不用管这一段ExPulse_Input = 2;MSpeed_capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1); //停止捕获
//              __HAL_TIM_DISABLE_IT(&htim3,TIM_IT_UPDATE);capture_Cnt++;MSpeed_capture_Buf[2] = TIM3_CNT;break;case 3://计数时间到时捕获到的最后一个上升沿  2ExPulse_Input = 3;
//              capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim16,TIM_CHANNEL_1);//闁兼儳鍢茶ぐ鍥亹閹惧啿顤呴柣銊ュ瀹曠喖鎳㈤敓????????????????????.HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1); //闁稿绮嶉娑㈠箲閺囷拷?锟界??????????   闁瑰瓨锟????: __HAL_TIM_DISABLE(&htim5);HAL_TIM_Base_Stop(&htim4);//閿燂??????????????閸氼垶鐝0鎴炴闁界喖顣堕敓锟??????HAL_TIM_Base_Stop(&htim8);//閿燂??????????????閸氼垵绶崗銉ㄥ墻閸愯尪顓搁弫鏉挎珤HAL_TIM_Base_Stop(&htim1);HAL_TIM_Base_Stop(&htim3);HAL_TIM_Base_Stop(&htim5);__HAL_TIM_DISABLE_IT(&htim3,TIM_IT_UPDATE);HAL_GPIO_WritePin(LED2_GPIO,LED2_GPIO_PIN,GPIO_PIN_RESET);capture_Cnt++;capture_Buf[1] = htim4.Instance->CNT;//HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);//闁兼儳鍢茶ぐ鍥亹閹惧啿顤呴柣銊ュ瀹曠喖鎳㈤敓????????????????????.HIGHFRE_Buf[1] = htim8.Instance->CNT;//HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1);if(ThighFre_CNT != 0){HIGHFRE_Buf[3] = ((ThighFre_CNT) * 65535 + HIGHFRE_Buf[1]);//*2.5;ThighFre_CNT = 0;CAL_HIGHFRE_Buf[1] = HIGHFRE_Buf[3];}else{HIGHFRE_Buf[3] = HIGHFRE_Buf[1];// * 2.5;CAL_HIGHFRE_Buf[1] = HIGHFRE_Buf[1];}if(TExPulse_CNT != 0){capture_Buf[3] = ((TExPulse_CNT) * 65535 + capture_Buf[1]);//*2.5;TExPulse_CNT = 0;CAL_capture_Buf[1] = capture_Buf[3];}else{capture_Buf[3] = capture_Buf[1] ;//* 2.5;CAL_capture_Buf[1] = capture_Buf[1];}break;}}}

4、实验数据说明:
假设PULSE_CIRCLE =1就是一圈一个脉冲,T_SPEED 就是最终的测速结果,单位就是r/min。

在小于0.3HZ/S的频率下,误差较大,其他情况下,误差基本都很小了。
实验结束。
有更好的测试方式欢迎大家提出!

STM32使用M/T法检测单路脉冲相关推荐

  1. 单路塔式服务器选购指南 2月最新行情

    2月初,春节前一周,单路塔式服务器价格继续下降,戴尔率先推出了搭载E3-1220V5处理器的两款新品T130和T330,暂时需要订货.其他品牌的型号,市场中有现货. 一.调查机型 当前主流机型有:HP ...

  2. 小微企业好选择 单路塔式服务器推荐

    单路塔式服务器的产品配置稳定,但价格方面,多数产品价格下降. 一.调查机型 当前主流机型有:惠普ML110Gen9;戴尔T130和T330;联想TS250和TS550,以及x系列的x3100M5.停产 ...

  3. dellt30服务器虚拟机安装,服务器价格指导 4月单路塔式服务器选购

    [IT168 导购]4月初,多款产品价格上涨,联想新增加了TS150. 一.调查机型 当前主流机型有:HPE ML110Gen10和Micro Server Gen10;戴尔T30.T130和T330 ...

  4. 基于STM32的多点温湿度无线传输检测及控制(基于单片机的蔬菜大棚温湿度智能控制系统)

    基于STM32的多点温湿度无线传输检测及控制(基于单片机的蔬菜大棚温湿度智能控制系统) 一前言(含研究目的及意义) 1.研究目的 2.研究意义 二.研究工作的主要内容 三.理论创新成果 四.实践创新成 ...

  5. 光度立体法检测原理讲解

    光度立体法检测 图像辐照度 决定场景表面片辐射的因素有两个: 1.在场景表面片的照明 投在某一特定表面片上的照明量取决于该表面片在场景中相对于光源的分布位置 2.表面片反射的入射照明部分 在某一特定方 ...

  6. 判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

    检测单链表中是否有环(C语言) 方法:双指针法思路 使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二. 在链表有环时,two指针与one指针相等就说明有环. ...

  7. 单路电压表c语言编程,用AT89C51单片机制作的数字电压表

    此数字电压表,利用A/D转换原理将被测模拟量转换成数字量,并通过控制系统用数字方式显示测量结果.本设计采用AT89C51单片机,ADC0809进行模/数转换,能够测量8路0-5V的输入电压值,可用四位 ...

  8. 双路服务器单路运行,单路还是双路?看需求选择_机箱电源评测-中关村在线

    电源的介绍里面,经常会看到"单路+12V输出"或者"双路+12V输出"的字样.那么单路+12V输出和双路+12V输出有什么区别呢?单路+12V输出有着什么样的优 ...

  9. C++头插法尾插法建立单链表,合并两个有序单链表

    A和B是两个单链表(带表头结点),其中元素递增有序.设计一个算法,将A和B归 并成一个按元素值非递减有序的链表 C,C由A 和B 中的结点组成. #include<iostream> #i ...

  10. Mysql优化_ORDER BY和GROUP BY 的优化讲解(单路排序和双路排序)

    ORDER BY 子句尽量使用Index方式排序,避免使用FileSort方式排序,尽可能在索引列上外城排序操作,遵照索引键的最佳左前缀.如果不在索引列上,FileSort有两种算法,Mysql就要启 ...

最新文章

  1. Win2008虚拟化实战之Hyper-V快速设置
  2. 【Python-ML】SKlearn库RANSAC拟合高鲁棒性回归模型
  3. 拼音开头有什么字_语文基础 孩子刚上一年级学习拼音太难了?家长在家这样教真不比老师差!...
  4. leetcode 332. Reconstruct Itinerary | 332. 重新安排行程(Java)
  5. 仿ios桌面vivo_原生万物,生态共赢丨永中移动Office为vivo文档提供定制版解决方案...
  6. DevExpress v15.1:Reporting控件功能增强(二)
  7. Python_Bool
  8. Android-基本控件和详解四种布局方式
  9. html语言pre,【已解决】html代码中用pre还是code表示程序代码以及如何指定代码的语音种类...
  10. 吉他学习笔记--更新中
  11. 2022保研经验帖——吉大、华师、浙大、中大、南航/理、东南、南开等
  12. 【Uipath杂谈】用Datatable处理数据(二)
  13. position: relative相对定位
  14. 关于Tween的几个注意事项
  15. 提取保存Win10锁屏壁纸
  16. python算法——字符串表达式的计算
  17. 使用 HTTPS 加密 Ingress 流量
  18. 百度超级链(xuperchain),make时出现错误
  19. 项目管理之-项目评估
  20. PHP读和写Excel文件

热门文章

  1. oracle对时间范围比较的语句
  2. VS 2019Xamarin开发Android App生成apk文件
  3. ubuntu 22.04 搜狗输入法 的问题
  4. 增长黑客——如何低成本实现爆发式成长
  5. 融资1个亿,5000万给魔窗,凭啥?
  6. VLAN划分-思科模拟器-基础回顾
  7. 深圳华睿彩印高温玻璃打印机介绍
  8. Python - 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构
  9. 工业物联网盒子python_【工业4.0面面观】之十八:基于AWS的工业物联网应用案例...
  10. 十九. 用户注册 --- 短信验证码实现 2021-04-16