找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5802|回复: 12
打印 上一主题 下一主题
收起左侧

2018电赛程序 测量频率及幅度的STM32F103系列的程序

[复制链接]
跳转到指定楼层
楼主
ID:304013 发表于 2018-7-21 19:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序仅供大家参考

Stm32_template_输入捕获最终
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "12864.h"
  4. #include "stdio.h"
  5. #include "usart.h"
  6. #include "sys.h"




  7. u8  TIM3CH1_CAPTURE_STA=0;        //输入捕获状态
  8. //[7]:捕获两个上升沿
  9. //[6]:捕获到第一个上升沿                                                  
  10. //[5:0]:溢出计时器

  11. u32        TIM3CH1_CAPTURE_VAL;        //输入捕获值


  12. void TIM2_PWMconf(u16 arr,u16 psc);
  13. void TIM3_Cap_Init(u16 arr,u16 psc);
  14. void MY_GPIO(void);

  15. /***********************main***************************
  16. 函数:main
  17. 描述:
  18. ******************************************************/
  19. u8 flag,flag2;
  20. int main(void)
  21. {               
  22.         u32 temp=0,freqdisplay=0;
  23.         double freq,temp1;
  24.         GPIO_InitTypeDef mygpio;
  25.         delay_init();
  26.         NVIC_Configuration();
  27.         uart_init(9600);
  28.         Lcd12864_init();
  29.         lcd_clr();
  30.         MY_GPIO();
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  32.         mygpio.GPIO_Mode=GPIO_Mode_Out_PP;
  33.         mygpio.GPIO_Pin=GPIO_Pin_0;
  34.         mygpio.GPIO_Speed=GPIO_Speed_50MHz;
  35.         GPIO_Init(GPIOA,&mygpio);       
  36.         Display();
  37.         TIM2_PWMconf(899,5555);            //不分频。PWM频率=72000/(899+1)=80Khz               
  38.         TIM3_Cap_Init(0xffff,72-1);        //以1Mhz的频率计数  
  39.   while(1)
  40.         {       
  41.                 //delay_ms(10);
  42.                 if(TIM3CH1_CAPTURE_STA&0X80)     //成功捕获到了一次上升沿
  43.                 {
  44.                         temp1=TIM3CH1_CAPTURE_STA&0X3F;
  45.                         printf("周期0:%f us\r\n",temp1);
  46.                         //freq=temp1;
  47.                         temp1*=65536;                   //溢出时间总和
  48.                         //printf("周期1:%f us\r\n",temp1);
  49.                         //temp1+=2.5;
  50.                         temp1+=TIM3CH1_CAPTURE_VAL;     //得到总的高电平时间
  51.                         //printf("周期2:%d us\r\n",TIM3CH1_CAPTURE_VAL);
  52.                         //printf("周期3:%f us\r\n",temp1);
  53.                         //temp1*=1000;
  54.                         temp=temp1;
  55.                         freq=1000000.0/temp;                                         
  56.                         addr_choose(2,0);
  57.                         Write_data_12864(0x30+temp/100000);
  58.                         Write_data_12864(0x30+temp%100000/10000);
  59.                         Write_data_12864(0x30+temp%10000/1000);
  60.                         Write_data_12864(0x2e);
  61.                         Write_data_12864(0x30+temp%1000/100);
  62.                         Write_data_12864(0x30+temp%100/10);
  63. //                        Write_data_12864(0x30+temp%10000/1000);
  64. //                        Write_data_12864(0x30+temp%100/10);
  65.                         Write_data_12864(0x30+temp%10);
  66.                         //printf("频率:%f us\r\n",freq);         //打印总的高点平时间
  67. //                        freqdisplay=freq;
  68. //                        addr_choose(4,0);
  69. //                        Write_data_12864(0x30+freqdisplay/100000);
  70. //                  Write_data_12864(0x30+freqdisplay%100000/10000);
  71. //                        Write_data_12864(0x30+freqdisplay%10000/1000);
  72. //                        Write_data_12864(0x2e);
  73. //                        Write_data_12864(0x30+freqdisplay%1000/100);
  74. //                        Write_data_12864(0x30+freqdisplay%100/10);
  75. //                        Write_data_12864(0x30+freqdisplay%10);
  76.                         freqdisplay=freq*1000;
  77.                         addr_choose(4,0);
  78.                         Write_data_12864(0x30+freqdisplay/100000000);
  79.                   Write_data_12864(0x30+freqdisplay%100000000/10000000);
  80.                         Write_data_12864(0x30+freqdisplay%10000000/1000000);
  81.                         Write_data_12864(0x2e);
  82.                         Write_data_12864(0x30+freqdisplay%1000000/100000);
  83.                         Write_data_12864(0x30+freqdisplay%100000/10000);
  84.                         Write_data_12864(0x30+freqdisplay%10000/1000);
  85.                         Write_data_12864(0x30+freqdisplay%1000/100);
  86.                         Write_data_12864(0x30+freqdisplay%100/10);
  87.                         Write_data_12864(0x30+freqdisplay%10);
  88.                         TIM3CH1_CAPTURE_STA=0;         //开启下一次捕获

  89.                 }
  90.         }
  91. }


  92. void MY_GPIO(void)
  93. {
  94.         GPIO_InitTypeDef MY_GPIO;
  95.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  96.        
  97.         MY_GPIO.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0;
  98.         MY_GPIO.GPIO_Mode=GPIO_Mode_Out_PP;
  99.         MY_GPIO.GPIO_Speed= GPIO_Speed_50MHz;
  100.   GPIO_Init(GPIOB,&MY_GPIO);

  101. }




  102. void TIM2_PWMconf(u16 arr,u16 psc)
  103. {
  104.         GPIO_InitTypeDef mygpio;
  105.         TIM_TimeBaseInitTypeDef mytimebase;
  106.         TIM_OCInitTypeDef  mytimeOC;
  107.        

  108.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器2时钟
  109.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //使能AFIO复用功能模块时钟
  110.        
  111.         mygpio.GPIO_Mode=GPIO_Mode_AF_PP;//复用输出
  112.         mygpio.GPIO_Pin=GPIO_Pin_1;//CH2
  113.         mygpio.GPIO_Speed=GPIO_Speed_50MHz;
  114.         GPIO_Init(GPIOA,&mygpio);
  115.          
  116.         //初始化TIM2
  117.         mytimebase.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
  118.         mytimebase.TIM_Period=arr;
  119.         mytimebase.TIM_Prescaler=psc;
  120.         mytimebase.TIM_ClockDivision=TIM_CKD_DIV1;
  121.         TIM_TimeBaseInit(TIM2,&mytimebase);
  122.         //初始化TIM2 Channel2 PWM模式         
  123.        
  124.         mytimeOC.TIM_OCMode=TIM_OCMode_PWM1;//pwm1 模式
  125.         mytimeOC.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性高
  126.         mytimeOC.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
  127.         TIM_OC2Init(TIM2,&mytimeOC);// TIM2 OC2初始化
  128.        
  129.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2上的预装载寄存器
  130.        
  131.         TIM_Cmd(TIM2,ENABLE);//使能TIM2
  132.        
  133.         TIM_SetCompare2(TIM2,450);//CCR2值
  134. }


  135. void TIM3_Cap_Init(u16 arr,u16 psc)
  136. {
  137.         GPIO_InitTypeDef mygpio;
  138.         TIM_TimeBaseInitTypeDef mytimebase;
  139.         TIM_ICInitTypeDef myic;
  140.         NVIC_InitTypeDef mynvic;
  141.        
  142.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  143.        
  144.         mygpio.GPIO_Mode=GPIO_Mode_IPD; //设置成下拉输入 空闲时电平
  145.         mygpio.GPIO_Pin=GPIO_Pin_6;
  146.         GPIO_Init (GPIOA,&mygpio);
  147.         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
  148.         //初始化 定时器3 TIM3
  149.         mytimebase.TIM_Period=arr;
  150.         mytimebase.TIM_Prescaler=psc;
  151.         mytimebase.TIM_CounterMode=TIM_CounterMode_Up;
  152.         mytimebase.TIM_ClockDivision=TIM_CKD_DIV1;
  153.         TIM_TimeBaseInit(TIM3,&mytimebase);
  154.        
  155.         //初始化TIM3 输入捕获参数
  156.         myic.TIM_Channel=TIM_Channel_1;
  157.         myic.TIM_ICPolarity=TIM_ICPolarity_Rising;
  158.         myic.TIM_ICSelection=TIM_ICSelection_DirectTI;
  159.         myic.TIM_ICPrescaler=TIM_ICPSC_DIV1;
  160.         myic.TIM_ICFilter=0x00;
  161.         TIM_ICInit(TIM3,&myic);
  162.        
  163.         //中断分组初始化
  164.         mynvic.NVIC_IRQChannel=TIM3_IRQn ;
  165.         mynvic.NVIC_IRQChannelPreemptionPriority=2;
  166.         mynvic.NVIC_IRQChannelSubPriority=0;
  167.         mynvic.NVIC_IRQChannelCmd=ENABLE;
  168.         NVIC_Init(&mynvic);
  169.        

  170.         TIM_ITConfig(TIM3,TIM_IT_CC1|TIM_IT_Update,ENABLE);
  171.         TIM_Cmd(TIM3,ENABLE);
  172.        
  173.        
  174. }


  175.   
  176. void TIM3_IRQHandler(void)
  177. {
  178.         if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
  179.         {          
  180.                 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)         
  181.                         {            
  182.                                 if(TIM3CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  183.                                         {
  184.                                                 if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  185.                                                         {
  186.                                                                 TIM3CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  187.                                                                 TIM3CH1_CAPTURE_VAL=0XFFFF;
  188.                                                         }
  189.                                                 else
  190.                                                                 TIM3CH1_CAPTURE_STA++;
  191.                                         }         
  192.                         }
  193.                
  194.                 if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  195.                 {       
  196.               if(TIM3CH1_CAPTURE_STA&0X40)                //捕获到一个上升沿                
  197.                                 {                                 
  198.                                                 TIM3CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  199.                                                 TIM3CH1_CAPTURE_VAL=TIM_GetCounter(TIM3);
  200.                                 }
  201.                                 else                                     //还未开始,第一次捕获上升沿
  202.                                 {
  203.                                                 TIM3CH1_CAPTURE_STA=0;                        //清空
  204.                                                 TIM3CH1_CAPTURE_VAL=0;
  205.                                                 TIM_SetCounter(TIM3,0);
  206.                                                 TIM3CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  207.                                 }                                       
  208.                 }
  209.         }

  210.         TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

  211. }



复制代码

全部资料51hei下载地址:
测频率LCD12864.rar (302.78 KB, 下载次数: 163)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:288398 发表于 2018-7-22 13:57 来自手机 | 只看该作者
楼主大佬
回复

使用道具 举报

板凳
ID:334796 发表于 2018-7-22 15:38 来自手机 | 只看该作者
成功了吗
回复

使用道具 举报

地板
ID:484657 发表于 2019-4-14 20:52 | 只看该作者
您好,12864数据口和stm32具体的连线程序中有说明吗,谢谢
回复

使用道具 举报

5#
ID:513359 发表于 2019-4-16 10:21 | 只看该作者
感谢大佬
回复

使用道具 举报

6#
ID:511461 发表于 2019-4-17 13:37 | 只看该作者
请问这个是哪个型号的单片机,迷你版还是战舰版,
回复

使用道具 举报

7#
ID:511461 发表于 2019-4-17 13:41 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

8#
ID:286252 发表于 2019-4-18 09:57 | 只看该作者
通过捕获电平的长度可以达到精度要求吗?
回复

使用道具 举报

9#
ID:512017 发表于 2019-5-14 01:54 | 只看该作者
楼主编译时出现了这样的错误
..\Output\stm32_DEMO.axf: error: L6031U: Could not open scatter description file ..\Output\stm32_DEMO.sct: No such file or directory
Not enough information to list image symbols.
Not enough information to list the image map.
回复

使用道具 举报

10#
ID:512017 发表于 2019-5-31 13:48 | 只看该作者
pwm123 发表于 2019-5-14 01:54
楼主编译时出现了这样的错误
..\Output\stm32_DEMO.axf: error: L6031U: Could not open scatter descript ...

linker 里面删掉路径
回复

使用道具 举报

11#
ID:512017 发表于 2019-5-31 13:48 | 只看该作者
pwm123 发表于 2019-5-14 01:54
楼主编译时出现了这样的错误
..\Output\stm32_DEMO.axf: error: L6031U: Could not open scatter descript ...

https://blog.csdn.net/xiang_shao344/article/details/81474288
回复

使用道具 举报

12#
ID:584645 发表于 2019-7-15 19:31 | 只看该作者
挺好挺好...
回复

使用道具 举报

13#
ID:588361 发表于 2019-8-9 21:55 | 只看该作者
很有帮助~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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