標(biāo)題: 基于正點原子mini開發(fā)板的方波測頻,信號輸出以及正弦波幅值測量 [打印本頁]

作者: ALIEN_M    時間: 2019-7-28 14:39
標(biāo)題: 基于正點原子mini開發(fā)板的方波測頻,信號輸出以及正弦波幅值測量
這是根據(jù)輸入捕獲試驗改的,可以實現(xiàn)方波測頻并且根據(jù)測量值輸出100倍頻的pwm波,按鍵可控制*1,*3,*5的關(guān)系。
項目用來做電賽的濾波芯片的時鐘信號的,測量基波頻率并用單片機輸出芯片的時鐘來測量基波,3次諧波和5次諧波的幅值。
源代碼注釋很詳細(xì),電賽2017年自適應(yīng)濾波器的發(fā)揮部分。


單片機源程序如下:
  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下載地址:
測方波頻率并輸出100倍頻.7z (229.65 KB, 下載次數(shù): 45)

作者: aaaaaa。    時間: 2019-7-31 15:25
謝謝大佬分享
作者: aaaaaa。    時間: 2019-7-31 16:32
幅值是顯示的Vrms嗎?
還有如果測量的是三次諧波,假設(shè)為100hz,是不是PA8腳會輸出300hz的方波
作者: ALIEN_M    時間: 2019-8-2 09:43
aaaaaa。 發(fā)表于 2019-7-31 16:32
幅值是顯示的Vrms嗎?
還有如果測量的是三次諧波,假設(shè)為100hz,是不是PA8腳會輸出300hz的方波

這個按鍵控制,key0是3次諧波也就是頻率*3,key1同理
作者: 神犬辛巴    時間: 2019-8-8 09:47
代碼中timer.c中注釋了一部分,請問需要取消注釋嗎
作者: ALIEN_M    時間: 2019-8-8 14:16
神犬辛巴 發(fā)表于 2019-8-8 09:47
代碼中timer.c中注釋了一部分,請問需要取消注釋嗎

不用的,直接燒錄就能用
作者: 神犬辛巴    時間: 2019-8-8 14:39
謝謝樓主分享的程序,親測有效。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1