找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4563|回复: 0
收起左侧

STM32定时器捕获,计算频率成功例程源代码

[复制链接]
ID:320528 发表于 2018-5-15 10:49 | 显示全部楼层 |阅读模式
亲自试过,调试成功

1.0  从此版本开始,代码中所有变量都定义在sysconfig.h中

2.0  PB6接步进电机脉冲
     PC9接步进电机方向   
     PC8接电磁阀
     PC7接泄气阀
     PC1接AD采样

3.0  A5 A6 06 03 05 00     点动前进
     A5 A6 06 04 05 07     点动后退
     A5 A6 05 05 00        持续前进
     A5 A6 05 06 03        持续后退
     A5 A6 05 07 02        停止

单片机源程序如下:
  1. /********************************************************************************
  2. * 文件名  :main.c
  3. * 描述    :        
  4. * 实验平台:STM32开发板
  5. * 库版本  :ST3.5.0
  6. * 作者    :liuzhen
  7. ********************************************************************************/
  8. #include "stm32f10x.h"
  9. #include "sysconfig.h"
  10. #include "usart1.h"
  11. #include "BSP.H"
  12. #include "led.h"
  13. #include "tim2.h"
  14. #include "pwm_output.h"
  15. #include "exti.h"
  16. #include "moto.h"
  17. #include "adc.h"
  18. //================================ 串口所用变量 ==============================================
  19. u8 Rx1Buffer[Rx1Buffer_Length];                //串口1接收数据缓冲区
  20. u8 Tx1Buffer[Tx1Buffer_Length];                //串口1发送数据缓冲区
  21. u8 Rx1Cnt=0;                                         //串口1接收数据计数
  22. u8 RX1_Recive_Frame_State=0;                         //串口1接收帧头状态,初始化位0
  23. u8 RX1_Recive_FrameCnt_State=0;         //串口1接收一帧数据的总长度(即一帧数据的第三个元素表示该帧的总长度)
  24. u8 RX1_Over_Flag=0;                                        //串口1接收数据完成标志位
  25. //=============================== 压接机所用变量 ==============================================
  26. u8 Press_Mold_Length=0;                                   //定义压膜长度
  27. u8 Press_Overlap=0;                                                                //定义叠压长度
  28. u8 Press_Mold_Cnt=0;                                      //定义总压膜次数               
  29. u16 Mid_Unpress_Length=0;                                  //定义中间不压区长度
  30. u8 Press_Mold_Effect_Length=0;                //定义滑块有效行走长度,等于压膜长度-叠压长度
  31. u8 Latest_PressQuality_Flag=0;          //上次压接质量合格标志位
  32. u8 Current_Press_Cnt=0;           //定义当前压膜编号
  33. u32 LeftDone_MoveRight_NeedPWMCnt=0;  //接续管左边全部压完,右移时需多少PWM回到右边压接初始点
  34. u8 Press_Cnt_OddEven_Flag=0;                            //总压接次数为偶数是该位0,总压接次数为奇数是该位1

  35. u8 Hydraumatic_80MPa_Flag=0;                 //液压达到80MPa标志位
  36. u8 Hydropress_Reset_Flag=0;                 //液压机复位标志位,如果液压机不完全释放,会影响滑台前进
  37. u8 Hydropress_Finish_Onepress_Flag=0; //液压机完成一次压接标志位

  38. u8 Manual_ContinueMove_Flag=0;                           //手动下,持续控制滑台行走
  39. u8 AutoPressTest_Start_Flag = 0;            //自动压接检测开始标志位,也是整个设备开始工作标志位
  40. u8 AutoPressTest_SlipStep_FinishFlag = 0;    //自动压接检测时,滑块每完成一个最小单位的移动标志位
  41. u8 DiameterDetect_FinishFlag=0;                                //检测装置检测完成标志位
  42. u8 SlidBlock_GoBackMove_Flag=0;                    //滑台返工标志位,返回不合格处时,只需再次压接,检测装置不需要检测
  43. //============================= 滑台步进电机所用变量 ===========================================
  44. float mm_PWMCnt=0.0;                          //滑块行走1mm需要的脉冲数                       
  45. u32 PWMCnt=0;                                                                //当前输出PWM脉冲,正方向加,反方向减
  46. u32 PWMAll=0;                                                                //记录从开始到结束发出的PWM总数,默认正方向加,反方向减

  47. u8 Move_SequenceNO=0;                    //滑块在第一压接处Move_SequenceNO为0,下一压机处Move_SequenceNO为1......
  48. /*=====================================================================
  49.         Move_order[0] == 1表示滑块已处在第一模压接处,开始压接前默认处于第一模位置
  50.         Move_order[1] == 1表示滑块开始向第二模压接处移动
  51.         Move_order[2] == 1表示滑块开始向第三模压接处移动
  52.         。。。。。。
  53. =====================================================================*/
  54. u8 Move_order[30]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  55.                                                                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  56.                                                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
  57. u16 Tim6_Frequency = 0;
  58. u16 Tim2_CH2 =0;       
  59. u16 Tim3_CH2 =0;
  60. u16 Tim4_CH2 =0;
  61. u16 Tim5_CH2 =0;                                                                         
  62. u16 Tim8_CH2 =0;
  63. u16 Tim1_CH2 =0;                                                                                 
  64. //============================= 压力传感器所用变量 ===========================================                                                                         
  65. __IO uint16_t ADC_ConvertedValue;                                                                         
  66. //================================= 函数原型声明 ===========================================                                                                                                                  
  67. void Delay(__IO uint32_t nCount);         //延时函数原型声明
  68. void GPIO_Configuration(void);      //TIM2 channel 2 pin (PA.01) configuration
  69. /*=================================================================================
  70. * 函数名:SYS_INIT
  71. * 描述  :外设初始化
  72. * 输入  :无
  73. * 输出  : 无
  74. * 调用  :内部调用
  75. ================================================================================*/
  76. void SYS_INIT(void)
  77. {
  78.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);            //先打开APB2的复用时钟AFIO
  79.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //使能SWD关闭JTAG,释放被占用的引脚                  

  80.         USART1_Config(115200);                //配置串口1为:115200 8-N-1
  81.         LED_GPIO_Config();
  82.         GPIO_Configuration();     /* TIM2 channel 2 pin (PA.01) configuration */
  83.         Nvic_Init();                          
  84.         Tim6_Init(500);        //Tim6用于基本定时,Tim6_Init(500)代表500us中断一次
  85.         Tim1_Init();           //Tim5捕获初始化
  86.         Tim2_Init();                 //Tim2捕获初始化
  87.         Tim3_Init();           //Tim3捕获初始化
  88.         Tim4_Init();           //Tim4捕获初始化
  89.         Tim8_Init();           //Tim5捕获初始化
  90.         printf("\r\n 初始化完毕 \r\n");
  91. }
  92. /*=================================================================================
  93. * 函数名:main
  94. * 描述  :主函数
  95. ================================================================================*/
  96. int main(void)
  97. {        
  98.         SYS_INIT();
  99.         while(1)
  100.         {
  101.      ;
  102.         }
  103. }

  104. void GPIO_Configuration(void)
  105. {               
  106.   GPIO_InitTypeDef GPIO_InitStructure;
  107.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/* GPIOA clock enable */
  108.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/* GPIOA clock enable */
  109.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* GPIOA clock enable */
  110.   /* TIM2 channel 2 pin (PA.01) configuration */
  111.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7;
  112.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  113.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  114.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  115.        
  116.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  117.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  118.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  119.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  120.        
  121.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  122.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  123.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  124.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  125.        
  126.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);  //开启即将使用重映射的时钟
  127.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);                            //TIM1复用功能完全映射
  128.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  129.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  130.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  131.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  132. }
  133. /*=================================================================================
  134. * 函数名:Delay
  135. * 描述  :延时函数
  136. * 输入  :无
  137. * 输出  : 无
  138. * 调用  :外部调用
  139. ================================================================================*/
  140. void Delay(__IO uint32_t nCount)
  141. {
  142.   for(; nCount != 0; nCount--);
  143. }
  144. //typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;
  145. //__IO TestStatus TransferStatus1 = FAILED;
  146. //TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);

  147. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/

复制代码

所有资料51hei提供下载:
TimBuHuo_20160415wan.rar (470.25 KB, 下载次数: 46)
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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