计(PG端)脉冲数测速

2019-08-16 18:41发布

新手上路,接触STM32没多久,之前都是学习正点原子的例程。这次公司要求要做一个采集驱动器PG端信号转换之后数码管显示速度的模块,第一次自己写一个针对完整的产品的东西,也不知道算不算的上产品哈。发个帖子,自我总结,有啥不对的指正哈![mw_shl_code=c,true]#include "timer.h"
#include "74hc595.h"
#include "math.h"
u16 a,b,c,d,aaa,FlagCount=0;
u32 SpeedValue=0,count=0,times=0,TTT;
void TIM1_CH2_Init(u16 arr,u16 psc)
{         

        TIM_ICInitTypeDef  TIM1_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);        //使能时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);        //ê1ÄüGPIOA

        //初始化捕获交 PA9   复用AF2 TIM1CH2
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_2);/
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;                                                                                                                                                                                                                                        //zz
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //3õê¼»ˉ¶¨ê±Æ÷TIM1
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //Ô¤·ÖÆμÆ÷   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  
        //3õê¼»ˉTIM3êäèë2¶»ñ2Îêy
        TIM1_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01         Ñ¡Ôñêäèë¶Ë IC1ó3éäμ½TI1éÏ     //zz
  TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //éÏéyÑØ2¶»ñ
  TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3éäμ½TI1éÏ
// TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
  TIM1_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
  TIM_ICInit(TIM1, &TIM1_ICInitStructure);
       

        //ÖD¶Ï·Ö×é3õê¼»ˉ
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  //TIM1ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_InitStructure.NVIC_IRQChannelPriority           = 0;
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
       
        TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC2,ENABLE);//ÔêDí¸üDÂÖD¶Ï ,ÔêDíCC1IE2¶»ñÖD¶Ï           //zz
   TIM_SetCounter(TIM1, 0);
        TIM_Cmd(TIM1,ENABLE );         //ê1Äü¶¨ê±Æ÷3
   


}

u8  TIM1CH2_CAPTURE_STA=0;        //êäèë2¶»ñ×′쬠                                                  
u16        TIM1CH2_CAPTURE_VAL;        //êäèë2¶»ñÖμ
void TIM1_CC_IRQHandler(void)   //TIM3ÖD¶Ï
{
       

        if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)//捕获事件发生
                {       
                        if(FlagCount==0)                                                                                                //开机后第一次进去捕获,用于同步时间
                        {                                                                                                                                                               
                                 GPIOC->ODR ^= 0x4000;                                                                //每次进去捕获中断 电平翻转 用于示波器监控
                                 TIM_Cmd(TIM3,ENABLE);                                                                //在该状态位开启小脉冲计数时钟,同步开启时间
                                 FlagCount = 1;                                                                                                               
                                 times ++;                                                                                                                //
                               
                        }else if(FlagCount==1)                                                                       
                        {
                                //count++;
                                if(times == 24)                                                                                                //24个PG信号为一圈,消灭边缘效应
                                {
                                        TIM_Cmd(TIM3,DISABLE);                                                        //
                                        TTT = count;                                                                                                //
                                        count = 0;                                                                                                       
                                        FlagCount = 0;       
                                        times = 0;                                                                                                        //
                                       
                                }else
                                {
                                        times++;                                                                                                                                       
                                }
                        }                       
        }

        TIM_ClearITPendingBit(TIM1, TIM_IT_CC2|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ        //zz
                       
                }
/*
***********************************************************
*               
* TIM3 óÃóú¼Æêy
*               
***********************************************************
*/
void TIM3_Init(u16 arr,u16 psc)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        TIM_TimeBaseInitStructure.TIM_Period = arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler =psc;
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        TIM_Cmd(TIM3, DISABLE);
}

void TIM3_IRQHandler(void)
{

        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                count++;                                        //×÷Îaò»¸ö¾Ö2¿±äá¿£¬Ã¿′νøèëÖD¶Ïoó½øDD¼ó12ù×÷
        }
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
        GPIOC->ODR ^= 0x8000;

}[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
XCN
2019-08-16 20:55
[mw_shl_code=c,true]int main(void)
{
        extern u8  TIM1CH2_CAPTURE_STA;                //êäèë2¶»ñ×′쬠                                                  
        extern u16        TIM1CH2_CAPTURE_VAL;        //êäèë2¶»ñÖμ
        extern u32 SpeedValue,times,TTT,FlagCount;
        u8 t,len;
        //u16 times;
        HAL_LEDInit();
        delay_init();
        uart_init(115200);
        TIM1_CH2_Init(0xffff,4799);
        TIM3_Init(7,47);
        TIM14_Init(200,47);
        hc595_Init();
        while(1)
{
SpeedValue = 30000000/TTT;
                //printf("Times£o%d ",SpeedValue);
                delay_ms(500);
}[/mw_shl_code]

主程序就做了初始化,然后就是之前通过 语句 TTT=count得到了,捕获24个脉冲得到的小脉冲TIM3的次数,小脉冲溢出时间设置为8us,方便计算,这样误差基本在一到两个小脉冲以内    速度 计算就不多说了 根据电机而异。24个捕获脉冲的时间等于(TTT*8)us

一周热门 更多>