OpenEdv-开源电子网

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

我现在正在做小车测速,用的是外部脉冲计数,计数值始终显示是0,求助

[复制链接]

3

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-6-2
在线时间
6 小时
发表于 2016-6-13 18:32:33 | 显示全部楼层 |阅读模式
10金钱
帮忙看一下,做了一天了,始终没找到毛病,比较急,谢谢了,


#include "CE_SU.h"
#include "led.h"
#include "usart.h"


void TIM3_cesu_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructure.TIM_Period =0xFFFF;       
        TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ClearFlag(TIM3, TIM_FLAG_Update);       
        TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
        TIM_SetCounter(TIM3, 0);
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM3, ENABLE);
}




void TIM6_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

        TIM_ITConfig( TIM6, TIM_IT_Update ,ENABLE  );
        NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        TIM_Cmd(TIM6, ENABLE);
                                                         
}


u16        TIM3_CAPTURE_VAL;
float speed;

void TIM6_IRQHandler(void)  
{
        TIM_Cmd(TIM3, DISABLE);
       
       
        if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
                {
                       
               
                TIM_ClearITPendingBit(TIM6, TIM_IT_Update);  
                TIM3_CAPTURE_VAL=TIM_GetCounter(TIM3);               
                speed=TIM3_CAPTURE_VAL;       
               
     TIM_SetCounter(TIM3,0);
               
                       
                }
               
               
                TIM_Cmd(TIM3, ENABLE);
}



















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-14 09:32:07 | 显示全部楼层
两点,你中断里怎么写,还有smcr的寄存器值配进去了没,仿真查看该寄存器值是不是按手册说明的控制值
回复

使用道具 举报

17

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2016-6-1
在线时间
33 小时
发表于 2016-6-15 13:14:46 | 显示全部楼层
我现在在做PID电机调速,你这个问题很简单,一个定时中断,一个外部中断就OK了。
外部中断:
#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"

//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//Mini STM32¿a·¢°å
//ía2¿ÖD¶Ï Çy¶ˉ′úÂë                          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2010/12/01  
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) ÕyμãÔ-×ó 2009-2019
//All rights reserved          
//////////////////////////////////////////////////////////////////////////////////           

extern unsigned int s1;
extern unsigned int s2;
//ía2¿ÖD¶Ï3õê¼»ˉoˉêy
void EXTIX_Init(void)
{

          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_Initok;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ía2¿ÖD¶Ï£¬Dèòaê1ÄüAFIOê±Öó

          KEY_Init();//3õê¼»ˉ°′¼ü¶Ôó|ioÄ£ê½

    //GPIOA.0          ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖÃ
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

           EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷

          NVIC_Initok.NVIC_IRQChannel = EXTI0_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_Initok.NVIC_IRQChannelPreemptionPriority = 0x02;        //ÇàÕ¼óÅÏè¼¶2
          NVIC_Initok.NVIC_IRQChannelSubPriority = 0x02;                                        //×óóÅÏè¼¶1
          NVIC_Initok.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_Initok);            //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
//GPIOC.5 ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖÃ
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource5);

          EXTI_InitStructure.EXTI_Line=EXTI_Line5;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//ϽμÑØ′¥·¢
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷

                NVIC_Initok.NVIC_IRQChannel = EXTI9_5_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_Initok.NVIC_IRQChannelPreemptionPriority = 0x02;        //ÇàÕ¼óÅÏè¼¶2£¬
          NVIC_Initok.NVIC_IRQChannelSubPriority = 0x01;                                        //×óóÅÏè¼¶1
          NVIC_Initok.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_Initok);

        }


void EXTI0_IRQHandler(void)
{
s1=s1+1;

        EXTI_ClearITPendingBit(EXTI_Line0);  //Çå3yEXTI0Ïß·1òÆeλ
}

void EXTI9_5_IRQHandler(void)
{                       
        s2=s2+1;
         EXTI_ClearITPendingBit(EXTI_Line5);    //Çå3yLINE5éÏμÄÖD¶Ï±ê־λ  
}
定时中断:
#include "timer.h"
#include "led.h"
  
//í¨óö¨ê±Æ÷ÖD¶Ï3õê¼»ˉ
//Õaàïê±ÖóÑ¡ÔñÎaAPB1μÄ2±¶£¬¶øAPB1Îa36M
//arr£o×Ô¶ˉ֨װÖμ¡£
//psc£oê±ÖóÔ¤·ÖÆμêy
//Õaàïê1óÃμÄêǶ¨ê±Æ÷3!
extern unsigned int k;
//unsigned int s1;
//unsigned int s2;
//extern unsigned int a1;
//extern unsigned int a2;
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê±Öóê1Äü

        TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         ¼Æêyμ½5000Îa500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  10KhzμļÆêyÆμÂê  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ

        TIM_ITConfig(  //ê1Äü»òÕßê§ÄüÖ¸¶¨μÄTIMÖD¶Ï
                TIM3, //TIM2
                TIM_IT_Update ,
                ENABLE  //ê1Äü
                );
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //ÏèÕ¼óÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óóÅÏè¼¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷

        TIM_Cmd(TIM3, ENABLE);  //ê1ÄüTIMxíaéè
                                                         
}

void TIM3_IRQHandler(void)   //TIM3ÖD¶Ï
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì2éÖ¸¶¨μÄTIMÖD¶Ï·¢éúóë·ñ:TIM ÖD¶ÏÔ′
                {
                        k++;
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //Çå3yTIMxμÄÖD¶Ï′y′|àíλ:TIM ÖD¶ÏÔ′
               
                }
}

外带一句,我做的是两路电机测试的,所以有两个外部中断服务函数
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-15 15:43:52 | 显示全部楼层
龙战云野 发表于 2016-6-15 13:14
我现在在做PID电机调速,你这个问题很简单,一个定时中断,一个外部中断就OK了。
外部中断:
#include "e ...

紧抓寄存器值
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 00:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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