中级会员
 
- 积分
- 241
- 金钱
- 241
- 注册时间
- 2015-7-8
- 在线时间
- 46 小时
|
发表于 2018-3-21 17:28:30
|
显示全部楼层
以下代码紧供参考,原代码用于电机转速脉冲测量,频率不高,小于 1KHZ,如果需测量更高的脉冲,需修改配置。
#include <STM32F10X.H>
#include <PLUS.H>
/* ¶¨ê±Æ÷×üÏßê±ÖóÆμÂê */
#define PLUS_TIM_CLK 72000000
/* ¶¨ê±Æ÷êäèëê±Öó·ÖÆμ */
//#define PLUS_TIM_PSC 71
#define PLUS_TIM_PSC 1999
/* ¶¨ê±Æ÷¼Æêyê±ÖóÆμÂê */
//#define PLUS_TIM_CKINT 1000000 //( PLUS_TIM_CLK / PLUS_TIM_PSC )
#define PLUS_TIM_CKINT 72000
/* Âö3åÆμÂê»o3å */
uint16_t PlusFreq[ 10 ] = { 0x00 } , CaptureCounter = 0x00 ;
/*===============================================================================*/
//
// Âö3弯êy¿ØÖÆ3õê¼»ˉ
//
/*===============================================================================*/
void PLUS_Init( void )
{
/* ÅäÖÃ IO ¿ú */
if( !( RCC -> APB2ENR & RCC_APB2ENR_IOPBEN ) )
{
RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN ;
}
GPIOB -> CRL &= 0xFF0FFFFF ;
GPIOB -> CRL |= 0x00400000 ;
/* ½« TIM3 μÄ CH2 í¨μàÖØó3éä */
if( !( RCC -> APB2ENR & RCC_APB2ENR_AFIOEN ) )
{
RCC -> APB2ENR |= RCC_APB2ENR_AFIOEN ;
}
AFIO -> MAPR &= ~AFIO_MAPR_TIM3_REMAP ;
AFIO -> MAPR |= AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ;
/* ¿aÆô TIM3 ê±Öó */
if( !( RCC -> APB1ENR & RCC_APB1ENR_TIM3EN ) )
{
RCC -> APB1ENR |= RCC_APB1ENR_TIM3EN ;
}
/* ½« CC1 ᬽóμ½ TIM3 μÄ CH2 éÏ */
TIM3 -> CCMR1 &= ~TIM_CCMR1_CC1S ;
TIM3 -> CCMR1 |= TIM_CCMR1_CC1S_1 ;
/* ½« CC2 ᬽóμ½ TIM3 μÄ CH2 éÏ*/
TIM3 -> CCMR1 &= ~TIM_CCMR1_CC2S ;
TIM3 -> CCMR1 |= TIM_CCMR1_CC2S_0 ;
/* CC1 Ñ¡Ôñ éÏéyÑØ óDD§£¬CC2 Ñ¡Ôñ ϽμÑØ óDD§ */
TIM3 -> CCER |= TIM_CCER_CC1P ;
TIM3 -> CCER &= ~TIM_CCER_CC2P ;
/* ′óÄ£ê½Ñ¡Ôñ¸′λģ꽣¬éÏéyÑØê±ÖØD¼Æêy */
TIM3 -> SMCR &= ~TIM_SMCR_SMS ;
TIM3 -> SMCR |= TIM_SMCR_SMS_2 ;
/* ′¥·¢·½ê½Ñ¡Ôñ TI2 ÂË2¨oóμÄêäèë */
TIM3 -> SMCR &= ~TIM_SMCR_TS ;
TIM3 -> SMCR |= TIM_SMCR_TS_2 | TIM_SMCR_TS_1 ;
/* ¶¨ê±Æ÷·ÖÆμ£¬2¢¼óÔØÖØÔØÖμ */
TIM3 -> PSC = PLUS_TIM_PSC;
TIM3 -> ARR = 0xFFFF ;
/* ê1Äü 2¶»ñ1 óë ¶¨ê±Æ÷ */
TIM3 -> DIER |= TIM_DIER_CC2IE ;
TIM3 -> CR1 |= TIM_CR1_CEN ;
/* NVIC ÖD¶ÏóÅÏè¼¶óëê1ÄüÅäÖà */
NVIC -> IP[ 29 ] = 0x00 ;
NVIC -> ISER[ 0 ] |= NVIC_ISER_SETENA_29 ;
}
/*===============================================================================*/
//
// Æô¶ˉ/1Ø±Õ Âö3弯êy
//
/*===============================================================================*/
void PLUS_CalFreq( void )
{
uint32_t i = 0x00 , Freq = 0x00 , FanSpeed = 0x00 , FanSpeedPeak = 0x00 ;
/* 1رÕÂö3å2aá¿¼à¿Ø */
SYS_Monitor.FanSpeedTest_Monitor.MonitorEn = Monitor_Disable ;
/* ÆμÂêÇ󯽾ùÖμ */
for( ; i<0x0A ; i++ )
{
Freq += PlusFreq[ i ] ;
PlusFreq[ i ] = 0x00 ;
}
/* ·ç»ú×aËù¼ÆËã £¬¼ûoóÃæ½aêí A */
if( Freq )
{
// FanSpeed = 10000000 / ( Freq * 12 ) ;
FanSpeed = 1800000 / Freq ; //3600000 / Freq ;
}
else
{
REG_FANSPEED_REAL( ) = 0x00 ;
return ;
}
/* ×aËùD¡óú 5 ×a£¬¶¼èÏÎa×aËùÎa 0 £¬ÕaÆäÖD′æÔú¼ÆêyÆ÷òç3öÎêìa£¬D¡óú2×aê±¼ÆêyÆ÷»áòç3ö */
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 ;
}
}
/*===============================================================================*/
//
// Æô¶ˉ Âö3åÆμÂê2¶»ñ
//
/*===============================================================================*/
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 ;
}
/*===============================================================================*/
//
// í£Ö1 Âö3åÆμÂê2¶»ñ
//
/*===============================================================================*/
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 ) ;
}
/*===============================================================================*/
//
// ÖD¶Ï′|àí
//
/*===============================================================================*/
void TIM3_IRQHandler( void )
{
/* 1رÕ2¶»ñê1Äü£¬Çå3yÖD¶Ï±êÖ¾ */
// 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éÑùÖμ»o3å */
PlusFreq[ CaptureCounter++ ] = TIM3 -> CCR1 ;
/* 2éÑù′Îêy′ïμ½ 10 ′Σ¬Ôò¶ÔÇó×aËù */
if( CaptureCounter > 0x09 )
{
PLUS_CalFreq( ) ;
return ;
}
/* Î′′ïμ½ 10 ′Î2éÑù£¬¼ìDø2éÑù */
// TIM3 -> CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E ;
TIM3 -> CCER = 0x0011 ;
}
|
|