OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2508|回复: 6

求助:计算两次高电平直接的时间,我把捕获原代码改了n次,然而结果一直不对,求代码

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-3-21
在线时间
8 小时
发表于 2018-3-21 17:28:29 | 显示全部楼层 |阅读模式
3金钱

最佳答案

查看完整内容[请看2#楼]

以下代码紧供参考,原代码用于电机转速脉冲测量,频率不高,小于 1KHZ,如果需测量更高的脉冲,需修改配置。 #include #include /* ¶¨ê±Æ÷×üÏßê±ÖóÆμÂê */ #define PLUS_TIM_CLK 72000000 /* ¶¨ê±Æ÷êäèëê±Öó·ÖÆμ */ //#define PLUS_TIM_PSC 71 #define PLUS_TIM_PSC 1999 /* ¶¨ê±Æ÷¼ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2015-7-8
在线时间
46 小时
发表于 2018-3-21 17:28:30 | 显示全部楼层
以下代码紧供参考,原代码用于电机转速脉冲测量,频率不高,小于 1KHZ,如果需测量更高的脉冲,需修改配置。


#include <STM32F10X.H>
#include <PLUS.H>

/* &#182;¨ê±&#198;÷×ü&#207;&#223;ê±&#214;ó&#198;μ&#194;ê */
#define PLUS_TIM_CLK                72000000

/* &#182;¨ê±&#198;÷ê&#228;è&#235;ê±&#214;ó·&#214;&#198;μ */
//#define PLUS_TIM_PSC                71
#define PLUS_TIM_PSC                1999

/* &#182;¨ê±&#198;÷&#188;&#198;êyê±&#214;ó&#198;μ&#194;ê */
//#define PLUS_TIM_CKINT        1000000                 //( PLUS_TIM_CLK / PLUS_TIM_PSC )
#define PLUS_TIM_CKINT        72000

/* &#194;&#246;3&#229;&#198;μ&#194;ê&#187;o3&#229; */
uint16_t PlusFreq[ 10 ] = { 0x00 } , CaptureCounter = 0x00 ;

/*===============================================================================*/
//
// &#194;&#246;3&#229;&#188;&#198;êy&#191;&#216;&#214;&#198;3&#245;ê&#188;&#187;ˉ
//
/*===============================================================================*/
void PLUS_Init( void )
{
/* &#197;&#228;&#214;&#195; IO &#191;ú */
        if( !( RCC -> APB2ENR & RCC_APB2ENR_IOPBEN ) )
        {
                RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN ;
        }
       
        GPIOB -> CRL &= 0xFF0FFFFF ;
        GPIOB -> CRL |= 0x00400000 ;

/* &#189;&#171; TIM3 μ&#196; CH2 í¨μà&#214;&#216;ó3é&#228; */       
        if( !( RCC -> APB2ENR & RCC_APB2ENR_AFIOEN ) )
        {
                RCC -> APB2ENR |= RCC_APB2ENR_AFIOEN ;
        }
       
        AFIO -> MAPR &= ~AFIO_MAPR_TIM3_REMAP ;
        AFIO -> MAPR |= AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ;

/* &#191;a&#198;&#244; TIM3 ê±&#214;ó */       
        if( !( RCC -> APB1ENR & RCC_APB1ENR_TIM3EN ) )
        {
                RCC -> APB1ENR |= RCC_APB1ENR_TIM3EN ;
        }

/* &#189;&#171; CC1 á&#172;&#189;óμ&#189; TIM3 μ&#196; CH2 é&#207; */       
        TIM3 -> CCMR1 &= ~TIM_CCMR1_CC1S ;
        TIM3 -> CCMR1 |= TIM_CCMR1_CC1S_1 ;

/* &#189;&#171; CC2 á&#172;&#189;óμ&#189; TIM3 μ&#196; CH2 é&#207;*/       
        TIM3 -> CCMR1 &= ~TIM_CCMR1_CC2S ;
        TIM3 -> CCMR1 |= TIM_CCMR1_CC2S_0 ;

/* CC1 &#209;&#161;&#212;&#241; é&#207;éy&#209;&#216; óDD§£&#172;CC2 &#209;&#161;&#212;&#241; &#207;&#194;&#189;μ&#209;&#216; óDD§ */
        TIM3 -> CCER |= TIM_CCER_CC1P ;
        TIM3 -> CCER &= ~TIM_CCER_CC2P ;

/* ′ó&#196;£ê&#189;&#209;&#161;&#212;&#241;&#184;′&#206;&#187;&#196;£ê&#189;£&#172;é&#207;éy&#209;&#216;ê±&#214;&#216;D&#194;&#188;&#198;êy */       
        TIM3 -> SMCR &= ~TIM_SMCR_SMS ;
        TIM3 -> SMCR |= TIM_SMCR_SMS_2 ;

/* ′¥·¢·&#189;ê&#189;&#209;&#161;&#212;&#241; TI2 &#194;&#203;2¨oóμ&#196;ê&#228;è&#235; */       
        TIM3 -> SMCR &= ~TIM_SMCR_TS ;
        TIM3 -> SMCR |= TIM_SMCR_TS_2 | TIM_SMCR_TS_1 ;

/* &#182;¨ê±&#198;÷·&#214;&#198;μ£&#172;2¢&#188;ó&#212;&#216;&#214;&#216;&#212;&#216;&#214;μ */
        TIM3 -> PSC = PLUS_TIM_PSC;
        TIM3 -> ARR = 0xFFFF ;
       
/* ê1&#196;ü 2&#182;&#187;&#241;1 ó&#235; &#182;¨ê±&#198;÷ */
        TIM3 -> DIER |= TIM_DIER_CC2IE ;
        TIM3 -> CR1  |= TIM_CR1_CEN ;

/* NVIC &#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;ó&#235;ê1&#196;ü&#197;&#228;&#214;&#195; */
        NVIC -> IP[ 29 ] = 0x00 ;
        NVIC -> ISER[ 0 ] |= NVIC_ISER_SETENA_29 ;
}

/*===============================================================================*/
//
// &#198;&#244;&#182;ˉ/1&#216;±&#213; &#194;&#246;3&#229;&#188;&#198;êy
//
/*===============================================================================*/
void PLUS_CalFreq( void )
{
        uint32_t i = 0x00 , Freq = 0x00 , FanSpeed = 0x00 , FanSpeedPeak = 0x00 ;
       
/* 1&#216;±&#213;&#194;&#246;3&#229;2aá&#191;&#188;à&#191;&#216; */
        SYS_Monitor.FanSpeedTest_Monitor.MonitorEn = Monitor_Disable ;

/* &#198;μ&#194;ê&#199;ó&#198;&#189;&#190;ù&#214;μ */       
        for( ; i<0x0A ; i++ )
        {
                Freq += PlusFreq[ i ] ;
                PlusFreq[ i ] = 0x00 ;
        }

/* ·&#231;&#187;ú×a&#203;ù&#188;&#198;&#203;&#227; £&#172;&#188;&#251;oó&#195;&#230;&#189;aêí A */       
        if( Freq )
        {
//                FanSpeed = 10000000 / ( Freq * 12 ) ;
                FanSpeed = 1800000 / Freq ;                                //3600000 / Freq ;
        }
        else
        {
                REG_FANSPEED_REAL( ) = 0x00 ;
                return ;
        }
       
/* ×a&#203;ùD&#161;óú 5 ×a£&#172;&#182;&#188;è&#207;&#206;a×a&#203;ù&#206;a 0 £&#172;&#213;a&#198;&#228;&#214;D′&#230;&#212;ú&#188;&#198;êy&#198;÷ò&#231;3&#246;&#206;êìa£&#172;D&#161;óú2×aê±&#188;&#198;êy&#198;÷&#187;áò&#231;3&#246; */
        FanSpeedPeak = ( REG_FANSPEED_PEAK( REG_HIG ) << 8 ) | REG_FANSPEED_PEAK( REG_LOW ) ;
        if( FanSpeed < 0x09 )                       
        {
                REG_FANSPEED_REAL( ) = 0x00 ;
        }
        else
        if( FanSpeed > FanSpeedPeak )
        {
                REG_FANSPEED_REAL( ) = 0x64 ;               
        }
        else
        {
                REG_FANSPEED_REAL( ) = (uint16_t)FanSpeed * 100 / FanSpeedPeak ;
        }
}

/*===============================================================================*/
//
// &#198;&#244;&#182;ˉ &#194;&#246;3&#229;&#198;μ&#194;ê2&#182;&#187;&#241;
//
/*===============================================================================*/
void PLUS_StartFreqCapture( void )
{
        CaptureCounter = 0x00 ;
       
        SYS_Monitor.FanSpeedTest_Monitor.MonitorCounter = 0x00 ;
        SYS_Monitor.FanSpeedTest_Monitor.MonitorEn = Monitor_Enable ;
       
        TIM3 -> CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E ;
}

/*===============================================================================*/
//
// í£&#214;1 &#194;&#246;3&#229;&#198;μ&#194;ê2&#182;&#187;&#241;
//
/*===============================================================================*/
void PLUS_StopFreqCapture( void )
{
        CaptureCounter = 0x00 ;
        TIM3 -> CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E ;
        TIM3 -> SR &= ~( TIM_SR_UIF | TIM_SR_CC1IF | TIM_SR_CC2IF | TIM_SR_CC1OF | TIM_SR_CC2OF ) ;       
}

/*===============================================================================*/
//
// &#214;D&#182;&#207;′|àí
//
/*===============================================================================*/
void TIM3_IRQHandler( void )
{
/* 1&#216;±&#213;2&#182;&#187;&#241;ê1&#196;ü£&#172;&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190; */       
//        TIM3 -> CCER &= ~( TIM_CCER_CC1E | TIM_CCER_CC2E ) ;
//        TIM3 -> SR &= ~( TIM_SR_UIF | TIM_SR_CC1IF | TIM_SR_CC2IF | TIM_SR_CC1OF | TIM_SR_CC2OF ) ;       

        TIM3 -> CCER = 0x00 ;
        TIM3 -> SR &= 0xF9F8 ;

/* 2é&#209;ù&#214;μ&#187;o3&#229; */       
        PlusFreq[ CaptureCounter++ ] = TIM3 -> CCR1 ;

/* 2é&#209;ù′&#206;êy′&#239;μ&#189; 10 ′&#206;£&#172;&#212;ò&#182;&#212;&#199;ó×a&#203;ù */
        if( CaptureCounter > 0x09 )
        {
                PLUS_CalFreq( ) ;
                return ;
        }

/* &#206;′′&#239;μ&#189; 10 ′&#206;2é&#209;ù£&#172;&#188;ìD&#248;2é&#209;ù */
//        TIM3 -> CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E ;
        TIM3 -> CCER = 0x0011 ;
}
回复

使用道具 举报

12

主题

330

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2294
金钱
2294
注册时间
2016-5-21
在线时间
954 小时
发表于 2018-3-21 18:16:45 | 显示全部楼层
捕获调不通就试试中断,记录2次中断的时间
回复

使用道具 举报

22

主题

117

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
798
金钱
798
注册时间
2015-10-24
在线时间
160 小时
发表于 2018-3-21 18:17:09 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-3-21
在线时间
8 小时
 楼主| 发表于 2018-3-26 22:18:05 | 显示全部楼层
寂青山 发表于 2018-3-21 21:20
以下代码紧供参考,原代码用于电机转速脉冲测量,频率不高,小于 1KHZ,如果需测量更高的脉冲,需修改配置 ...

想用来测量一个电机转速非脉冲的,传感器信号类似于正弦函数的波形,如何编程计算它的转速
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-3-21
在线时间
8 小时
 楼主| 发表于 2018-3-27 09:53:52 | 显示全部楼层

不要帮顶,求思路
回复

使用道具 举报

3

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2015-7-8
在线时间
46 小时
发表于 2018-3-31 11:03:04 | 显示全部楼层
一頁書 发表于 2018-3-26 22:18
想用来测量一个电机转速非脉冲的,传感器信号类似于正弦函数的波形,如何编程计算它的转速

转速的计算方法不清楚,不敢乱说,如果是类似脉冲频率表示转速的,个人第一想法是,可将正弦波转为方波,然后计频率。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表