找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2221|回复: 2
收起左侧

2021电赛周期信号波形识别及参数测量 STM32源程序

[复制链接]
ID:811102 发表于 2021-11-15 09:54 | 显示全部楼层 |阅读模式
2021电子设计大赛周期信号检测和参数检测
自己用STM32写的
可以参考

单片机源程序如下:
  1. #include "stdio.h"
  2. #include "main.h"
  3. #include "math.h"
  4. #include <ctype.h>
  5. #include "stm32f4xx.h"
  6. #include "input.h"
  7. #include "oscilloscope.h"
  8. #include "digital_multimeter.h"
  9. #include "stm32f4xx.h"
  10. #include "led.h"

  11. u16 buff[400];//存储ADC所采集到的波形数据
  12. float buf[400],buf1[400];
  13. float Vpp_p; //存储峰峰值
  14. long long indata=0;
  15. u8  Vpp_buff[20] = {0};//sprintf数据输出
  16. int str[20],c_1=0,str_max=0;
  17. //全局变量
  18. int key_val=0;
  19. int key_c=0;
  20. int key_d=0;
  21. float vpp;
  22. //函数声明
  23. //int flag=0;
  24. void Square_wave(void);  //方波


  25. void Kai_display()  //矩形
  26. {
  27.         POINT_COLOR = RED;
  28.         POINT_COLOR = 0x5510;
  29.     LCD_Clear(BLACK);        
  30.         LCD_DrawRectangle(350,200,0,300);//矩形
  31.         
  32. }
  33. void Kai_display_1()  //矩形
  34. {
  35.         POINT_COLOR = RED;
  36.         POINT_COLOR = 0x5510;
  37.     LCD_Clear(BLACK);        
  38.         LCD_DrawRectangle(350,0,0,200);//矩形        
  39.         
  40. }
  41. void Init(void){//初始化
  42.         SysTick_Init(168);
  43.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
  44.         LED_Init();
  45.         LCD_Init();                //LCD初始化
  46.         KEY_Init();
  47.         LCD_Clear(WHITE);//BLACK:黑
  48.         Hwjs_Init();
  49.         USART1_Init(115200);
  50.         uart2_init(9600);
  51.         Kai_display_1();//开机显示
  52.         Adc_Init();//初始化ADC
  53.         TIM3_Int_Init(10000-1,8400-1);        
  54.         extix_init();        
  55.         TIM5_CH1_Input_Init(0xffffffff,83);  //以1M频率计数
  56. }        

  57. int main()
  58. {        
  59.         int adcx,key=0,key_1=0,i=0;
  60.         float temp;        
  61.         Kai_display_1();
  62.         Init();//初始化
  63.         
  64.         BACK_COLOR= BLACK;        
  65.         POINT_COLOR = RED;
  66.         LCD_DrawRectangle(350,200,0,350);//矩形
  67.         while(1)
  68.         {
  69.                 key = Hw_Scan();
  70.                 if(key == 1){key_val = 1;}
  71.                 if(key == 2){key_val = 2;}
  72.                 if(key == 3){key_val = 3;}
  73.                 if(key == 4){key_val = 4;}
  74.                 if(key == 5){key_val = 5;key_c =1;}
  75.                 if(key == 6){key_val = 6;}
  76.                 if(key == 7){key_val = 7;}
  77.                 if(key == 8){key_val = 8;}
  78.                 if(key == 9){key_val = 9;}
  79.                 if(key == 12){key_val = 3;key_d =2;}
  80.                 if(key == 13){key_val = 3;key_d =3;}
  81.                 if(key == 14){key_val = 3;key_d =4;}
  82.                 if(key == 15){key_val = 3;key_d =5;}
  83.                 if(key == 16){key_val = 3;key_d =6;}
  84.                 if(key == 17){key_val = 3;key_d =7;}               
  85.                 if(key == 10){NVIC_SystemReset(); }
  86.                         
  87.                 if(key_val == 8)
  88.                 {
  89.                         adcx = Get_Adc_Average(ADC_Channel_5,200);
  90.                         temp = (float)adcx*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111        
  91.                         sprintf((char*)Vpp_buff,"V: %.2f    V",temp);
  92.                         LCD_ShowString(10,290,210,16,16,Vpp_buff);                        
  93.                         delay_ms(500);
  94.                 }
  95.                 if(key_val == 3)
  96.                 {
  97.                         get_vpp_fb(buff);                                
  98.                 }               
  99.                 if(key_val == 4)
  100.                 {
  101.                         get_vpp_fb(buff);                        
  102.                         sprintf((char*)Vpp_buff,"Vpp:%0.2f V",Vpp);
  103.                         LCD_ShowString(10,230,210,16,16,Vpp_buff);        
  104.                         delay_ms(200);
  105.                 }
  106.                 if(key_val == 5)
  107.                 {
  108.                         get_vpp_fb(buff);        
  109.                         str[c_1] = num1;
  110.                         c_1++;
  111.                         if(c_1 == 20)
  112.                         {        
  113. //                                for(i=0;i<20;i++)
  114. //                                {
  115. //                                        if(str[i] > str_max)
  116. //                                                str_max = str[i];
  117. //                                }
  118. //                                printf("%d  ",str_max);
  119. //                                if(0.8<(freq_1/1000) <1.2 )
  120. //                                {
  121. //                                        if(str_max == 9){key_d =2;}
  122. //                                        if( str_max>=7 && str_max<=8){key_d =4;}               
  123. //                                        if( str_max>=4 && str_max<=5){key_d =3;}
  124. //                                }                                       
  125.                                 c_1 =  0;
  126.                                 str_max = 0;
  127.                         }
  128.                 }        
  129.                 if(key_val == 7) //全部显示
  130.                 {
  131.                         key_c =1;
  132.                         LCD_ShowString(10,250,210,16,16,"FREQ:");
  133.                         LCD_ShowString(10,270,210,16,16,"Dcycle:");
  134.                         LCD_ShowString(120,270,210,16,16,"%");
  135.                         get_vpp_fb(buff);        
  136.                         sprintf((char*)Vpp_buff,"Vpp:%0.2f V",Vpp);
  137.                         LCD_ShowString(10,230,210,16,16,Vpp_buff);        
  138.                         delay_ms(200);                        
  139.                 }               

  140.                 if(key_val == 9)
  141.                 {
  142.                         get_vpp_fb(buff);                        
  143.                         sprintf((char*)Vpp_buff,"fudu: %.2f V",fudu);
  144.                         LCD_ShowString(10,290,210,16,16,Vpp_buff);                                
  145.                 }               
  146.                
  147.                 if(TIM5_CH1_CAPTURE_STA&0x80) //成功捕获
  148.                 {
  149.                         indata=TIM5_CH1_CAPTURE_STA&0x3f;
  150.                         indata*=0xffffffff; //溢出次数乘以一次的计数次数时间 us
  151.                         indata+=TIM5_CH1_CAPTURE_VAL;//加上高电平捕获的时间
  152.                         TIM5_CH1_CAPTURE_STA=0; //开始下一次捕获
  153.                 }
  154.         }
  155. }

  156. //----------------------------函数-----------------------//
复制代码

Keil代码下载: 周期波形信号识别和参数测量.7z (484.61 KB, 下载次数: 49)

评分

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

查看全部评分

回复

使用道具 举报

ID:988833 发表于 2021-12-7 21:32 | 显示全部楼层
请问一下大佬信号有经过处理才输入到单片机的吗
回复

使用道具 举报

ID:876099 发表于 2022-5-25 11:43 | 显示全部楼层
波形怎么识别的可以说明一下吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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