找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2864|回复: 6
收起左侧

基于正点原子mini开发板的方波测频,信号输出以及正弦波幅值测量

[复制链接]
ID:547218 发表于 2019-7-28 14:39 | 显示全部楼层 |阅读模式
这是根据输入捕获试验改的,可以实现方波测频并且根据测量值输出100倍频的pwm波,按键可控制*1,*3,*5的关系。
项目用来做电赛的滤波芯片的时钟信号的,测量基波频率并用单片机输出芯片的时钟来测量基波,3次谐波和5次谐波的幅值。
源代码注释很详细,电赛2017年自适应滤波器的发挥部分。


单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "timer.h"
  5. #include "usart.h"
  6. #include "lcd.h"
  7. #include "adc.h"
  8. #include "key.h"
  9. extern u8  TIM2CH1_CAPTURE_STA;                                            
  10. extern u16        TIM2CH1_CAPTURE_VAL
  11. int main(void)
  12. {
  13.         static int t=1;
  14.         u32 temp=0;
  15.         u32 freq,cop,freq1,Ccr,psc1;
  16.         float templ;
  17.         u16 adcx,adcx1,adcdip,adccop=0;
  18.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
  19.         delay_init();            
  20.         uart_init(9600);                        
  21.          LCD_Init();
  22.          Adc_Init();
  23.          KEY_Init();
  24.          TIM1_PWM_Init(65535,71);                 
  25.          TIM2_Cap_Init(0xFFFF,72-1);        
  26.          POINT_COLOR=RED

  27.            while(1)
  28.         {


  29.                  

  30.                  if(TIM2CH1_CAPTURE_STA&0X80
  31.                  {
  32.                          temp=TIM2CH1_CAPTURE_STA&0X3F;   
  33.                          temp*=65536;                                
  34.                          temp+=TIM2CH1_CAPTURE_VAL;        
  35.                          freq=1000000/temp;  
  36.                          TIM2CH1_CAPTURE_STA=0;               
  37.                  }
  38.                  
  39.                  if((freq>=49)&&(freq<=200))  
  40.                  {
  41.                    cop=freq;  
  42.                  }
  43.                  
  44.                  if(KEY_Scan(1)==WKUP_PRES)  
  45.                 {
  46.                         t=1;              
  47.             adcx=Get_Adc_Average(ADC_Channel_1,10);  
  48.                         if(adccop<=adcx)  
  49.                         {
  50.                                 adccop=adcx;  
  51.                                 adcdip=adccop;  
  52.                         }else
  53.                         adcdip=adccop;
  54.                         templ=(float)adcdip*(3.3/4096);  
  55.                         adcx1=templ;            
  56.                         templ-=adcx1;              
  57.                         templ*=1000;                  
  58.                         delay_ms(250);        
  59.                 }
  60.                 if(KEY_Scan(1)==KEY1_PRES)
  61.                 {
  62.                         t=3;  
  63.             adcx=Get_Adc_Average(ADC_Channel_1,10);
  64.                         if(adccop<=adcx)
  65.                         {
  66.                                 adccop=adcx;
  67.                                 adcdip=adccop;
  68.                         }else
  69.                         adcdip=adccop;
  70.                         templ=(float)adcdip*(3.3/4096);
  71.                         adcx1=templ;
  72.                         templ-=adcx1;
  73.                         templ*=1000;
  74.                         delay_ms(250);               
  75.                 }
  76.                 if(KEY_Scan(1)==KEY0_PRES)
  77.                 {
  78.                         t=5;      
  79.             adcx=Get_Adc_Average(ADC_Channel_1,10);
  80.                         if(adccop<=adcx)
  81.                         {
  82.                                 adccop=adcx;
  83.                                 adcdip=adccop;
  84.                         }else
  85.                         adcdip=adccop;
  86.                         templ=(float)adcdip*(3.3/4096);
  87.                         adcx1=templ;
  88.                         templ-=adcx1;
  89.                         templ*=1000;
  90.                         delay_ms(250);               
  91.                 }

  92.                         delay_ms(300);¨
  93.                   freq1=(10000/cop/t)-1;      
  94.                   Ccr=(5000/cop/t)-1;         
  95.                         TIM_SetAutoreload(TIM1,freq1)
  96.                   TIM_SetCompare1(TIM1,Ccr);   
  97.                         delay_ms(200);

  98.                         
  99.                         printf("Frequency:%d HZ\r\n",cop);
  100.                   LCD_ShowString(60,60,200,16,16,"Frequency:       HZ");        
  101.                         LCD_ShowString(60,80,200,16,16,"Vrms:0.000  V");
  102.                   LCD_ShowString(60,100,200,16,16,"ARR:      ");
  103.                   LCD_ShowxNum(140,100,freq1,4,16,0);      
  104.                   LCD_ShowxNum(140,60,cop,4,16,0);         
  105.                         LCD_ShowxNum(116,80,templ,3,16,0x80);         
  106.       LCD_ShowxNum(100,80,adcx1,1,16,0);      
  107.                         delay_ms(500);
  108.                         LCD_Clear(WHITE);  
  109.         
  110.         }
  111. }
复制代码

全部程序51hei下载地址:
测方波频率并输出100倍频.7z (229.65 KB, 下载次数: 45)

评分

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

查看全部评分

回复

使用道具 举报

ID:511461 发表于 2019-7-31 15:25 | 显示全部楼层
谢谢大佬分享
回复

使用道具 举报

ID:511461 发表于 2019-7-31 16:32 | 显示全部楼层
幅值是显示的Vrms吗?
还有如果测量的是三次谐波,假设为100hz,是不是PA8脚会输出300hz的方波
回复

使用道具 举报

ID:547218 发表于 2019-8-2 09:43 | 显示全部楼层
aaaaaa。 发表于 2019-7-31 16:32
幅值是显示的Vrms吗?
还有如果测量的是三次谐波,假设为100hz,是不是PA8脚会输出300hz的方波

这个按键控制,key0是3次谐波也就是频率*3,key1同理
回复

使用道具 举报

ID:586490 发表于 2019-8-8 09:47 | 显示全部楼层
代码中timer.c中注释了一部分,请问需要取消注释吗
回复

使用道具 举报

ID:547218 发表于 2019-8-8 14:16 | 显示全部楼层
神犬辛巴 发表于 2019-8-8 09:47
代码中timer.c中注释了一部分,请问需要取消注释吗

不用的,直接烧录就能用
回复

使用道具 举报

ID:586490 发表于 2019-8-8 14:39 | 显示全部楼层
谢谢楼主分享的程序,亲测有效。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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