找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3824|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于正點(diǎn)原子mini開發(fā)板的方波測(cè)頻,信號(hào)輸出以及正弦波幅值測(cè)量

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:547218 發(fā)表于 2019-7-28 14:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這是根據(jù)輸入捕獲試驗(yàn)改的,可以實(shí)現(xiàn)方波測(cè)頻并且根據(jù)測(cè)量值輸出100倍頻的pwm波,按鍵可控制*1,*3,*5的關(guān)系。
項(xiàng)目用來(lái)做電賽的濾波芯片的時(shí)鐘信號(hào)的,測(cè)量基波頻率并用單片機(jī)輸出芯片的時(shí)鐘來(lái)測(cè)量基波,3次諧波和5次諧波的幅值。
源代碼注釋很詳細(xì),電賽2017年自適應(yīng)濾波器的發(fā)揮部分。


單片機(jī)源程序如下:
  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. }
復(fù)制代碼

全部程序51hei下載地址:
測(cè)方波頻率并輸出100倍頻.7z (229.65 KB, 下載次數(shù): 45)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:511461 發(fā)表于 2019-7-31 15:25 | 只看該作者
謝謝大佬分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:511461 發(fā)表于 2019-7-31 16:32 | 只看該作者
幅值是顯示的Vrms嗎?
還有如果測(cè)量的是三次諧波,假設(shè)為100hz,是不是PA8腳會(huì)輸出300hz的方波
回復(fù)

使用道具 舉報(bào)

地板
ID:547218 發(fā)表于 2019-8-2 09:43 | 只看該作者
aaaaaa。 發(fā)表于 2019-7-31 16:32
幅值是顯示的Vrms嗎?
還有如果測(cè)量的是三次諧波,假設(shè)為100hz,是不是PA8腳會(huì)輸出300hz的方波

這個(gè)按鍵控制,key0是3次諧波也就是頻率*3,key1同理
回復(fù)

使用道具 舉報(bào)

5#
ID:586490 發(fā)表于 2019-8-8 09:47 | 只看該作者
代碼中timer.c中注釋了一部分,請(qǐng)問(wèn)需要取消注釋嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:547218 發(fā)表于 2019-8-8 14:16 | 只看該作者
神犬辛巴 發(fā)表于 2019-8-8 09:47
代碼中timer.c中注釋了一部分,請(qǐng)問(wèn)需要取消注釋嗎

不用的,直接燒錄就能用
回復(fù)

使用道具 舉報(bào)

7#
ID:586490 發(fā)表于 2019-8-8 14:39 | 只看該作者
謝謝樓主分享的程序,親測(cè)有效。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表