[STM32F0]

STM32使用M/T法检测单路脉冲

[复制链接]
284|22
手机看帖
扫描二维码
随时随地手机跟帖
范德萨发额|  楼主 | 2022-11-30 23:47 | 显示全部楼层 |阅读模式
实验目的:刚开始接触关机电机检测领域,准备探索关于定时器在检测单路脉冲中的应用,从而进行转速的检测。
使用芯片:STM32F407
使用平台:STM32Cube IDE

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法采用前一种方法。

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:49 | 显示全部楼层
定时器设置
200ms定时器设置

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:50 | 显示全部楼层
首先需要设置好一个用来定时时间的定时器,我使用TIM1,定时200ms。定时器时钟信号是80MHz

4200163877b94091e3.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:50 | 显示全部楼层
3267963877bb371245.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:51 | 显示全部楼层
4786563877bd95a614.png
采用200ms定时。

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:51 | 显示全部楼层
外部脉冲捕获设置
使用TIM3_CH1进行外部脉冲输入捕获,定时器设置如下

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:52 | 显示全部楼层
3208463877c140a6d1.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:52 | 显示全部楼层
5829763877c352145d.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:53 | 显示全部楼层
对电机脉冲进行上升沿捕获,通过捕获来判断外部脉冲开始。

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:53 | 显示全部楼层
对外部脉冲进行计数
使用TIM4进行脉冲计数,将定时器TIM4的时钟源选用外部脉冲就可以实现脉冲计数功能,设置如下:
9401863877c7c1df87.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:54 | 显示全部楼层
4033163877c920c9d2.png
当捕获到外部脉冲时就准备开始外部脉冲计数。

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:54 | 显示全部楼层
高频脉冲产生器
使用TIM5定时器来产生5MHz方波频率
345263877cc988039.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:55 | 显示全部楼层
998763877cdc54160.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:56 | 显示全部楼层
对高频脉冲进行计数
使用TIM8进行高频脉冲计数
4929963877cfb203fb.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:56 | 显示全部楼层
7725963877d2081549.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:57 | 显示全部楼层
9012763877d3e4b905.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:57 | 显示全部楼层
相当于对TIM5产生高频5MHz脉冲进行计数,通过定时器的主从模式就可以实现该功能。

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:58 | 显示全部楼层
6502263877d85c780f.png

使用特权

评论回复
范德萨发额|  楼主 | 2022-11-30 23:59 | 显示全部楼层
通过该功能表进行选择。
程序代码实现
主函数中
          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://4

                        T_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);
                                }
                  }

使用特权

评论回复
范德萨发额|  楼主 | 2022-12-29 23:27 | 显示全部楼层
在中断中
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++;
    }  
  
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

779

帖子

1

粉丝