欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 2018年TI杯電流信號檢測裝置STM32代碼,電路原理圖和文檔 [打印本頁]

作者: 我叫小李    時間: 2019-7-24 15:00
標題: 2018年TI杯電流信號檢測裝置STM32代碼,電路原理圖和文檔
這是2018年TI杯電流信號檢測裝置一等獎作品,有原理圖,源代碼資料
主控是STM32F103ZET6
原理圖是用AD畫的。

摘要:設計并制作了一種電流信號檢測裝置,系統主要由功率放大電路,電流傳感、檢測及調理電路,由ARM單片機為核心的數據采集、參數測量以及顯示電路組成。功率放大電路以TDA2030為核心搭成電壓增益為1的電流放大電路,驅動10Ω負載產生10mA~1A的電流,使用漆包線繞制成的線圈作為電流傳感器感應電流信號,使用INA2134OP07構成信號調理電路,將感應到的微弱信號變為易于單片機采集和處理的電壓信號,由STM32單片機采集電壓信號,實現被測信號峰峰值檢測、頻率計算FFT分析與顯示。當該系統輸入頻率范圍為50Hz~200Hz非正弦信號時,通過FFT算法能實現電流信號基波頻率的測量,以及基波和各次諧波分量幅度的測量。
        經過測量表明,作品指標全部滿足競賽題目要求。
1.任務
如圖1所示,由任意波信號發生器產生的信號經功率放大電路驅動后,通過導線連接10Ω電阻負載,形成一電流環路;設計一采用非接觸式傳感的電流信號檢測裝置,檢測環路電流信號的幅度及頻率,并將信號的參數顯示出來。
圖1  電流信號檢測連接圖

一、方案設計與選擇
系統主要由功率放大電路,電流傳感、檢測及調理電路,由ARM單片機為核心的數據采集、參數測量以及顯示電路組成
1.電流傳感方案選擇
        方案一:使用集成電流傳感器件。集成電流傳感器,使用方便,測量結果準確,但是的缺點是線圈的匝數固定不變,不能根據自己實際電路和測量要求來改變線圈匝數。
        方案二:漆包線手工繞制電流傳感器。采用漆包線手工繞制電流傳感器。可根據自己的需求,改變磁芯材質、漆包線粗細和線圈的繞制匝數,來適應測量電路,滿足測量要求。繞制簡單,易于實現。
        綜上所述,本次系統設計選用方案二。
2.功率放大電路的論證與選擇
方案一:使用分立器件制作功率放大電路。功率管用大功率三極管。使用分立器件制作的功率放大電路,靜態電流大,非線性失真小,管耗大,且效率低。用該電路作為前級功率放大電路輸出的電流峰峰值遠遠大于1A,但是輸入方波時有些諧波會丟失,導致經過功放后輸出的方波波形有點失真。
方案二:TDA2030芯片。TDA2030是一款單芯片音頻功率放大器集成電路,具有高電流輸出和高工作電壓,低諧波和交越失真等特點。該電路輸出的電流能滿足題目要求,并且非線性失真小,即使輸入方波,三角波也不會丟失諧波分量。
綜上所述,本次系統設計選用方案二。
3.差動放大器的論證與選擇
方案一:選擇INA217儀表放大器將差分電流信號轉化為單端輸出電流信號,該芯片具有低噪聲,低失真,高帶寬等特點,但是檢測小電流信號時,檢測的波形有些失真。
方案二:AD620芯片。選擇AD620儀表放大器將差分電流信號轉化為單端輸出電流信號,AD620是低功耗儀表放大器,該芯片具有低功耗,低噪音,直流性能出色等特點,但是檢測微弱信號時會出現噪聲干擾,波形出現的毛刺多,單片機很難檢測
方案三:INA2134芯片。該INA2134是一個差分線路接收機組成的高性能運算放大器,具有片上精密電阻器,低失真和高的轉換速率。該電路能夠檢測出50Hz~1kHz,100mV~10V的正弦波和50Hz~200Hz的方波,并且波形不失真,噪聲好。
綜上所述,本次系統設計選用方案三。
4.后級運算放大器的論證與選擇
方案一:LM358雙差分輸入運算放大器作為微弱信號放大,該芯片的低頻特性很好但是高頻特性差,由于有偏置電流所以輸出的波形不是很好,并且最后給單片機的信號是正的,所以需要把信號往上偏置到正半軸,但是LM358的失調電壓大,所以這里不選擇LM358
   方案二:OP07芯片是一種低噪聲,非斬波穩零的雙極性運算放大器集成電路。由于OP07具有非常低的失調電壓,所以OP07不需要額外的調零措施,OP07同時具有輸入偏置電流低和開環增益高的特點,這種低失調,高增益的特性使得OP07在檢測小信號時效果出色。
綜上所述,本次系統設計選用方案二。

二、系統結構論述與框圖
系統主要由功率放大電路,電流傳感、檢測及調理電路,由ARM單片機為核心的數據采集、參數測量以及顯示電路組成。系統總體框圖如圖2.1所示。
              由任意波形發生器提供所需信號,輸入到功率放大電路進行功率放大,放大后的信號經過10Ω負載轉化為電流信號,該電流信號以非接觸的方式,通過磁耦合在由漆包線繞制的線圈兩側產生感應電流。由于感應電流信號非常微弱,需經過信號調理電路,將微弱信號變為單片機可識別檢測的信號,進行采集。單片機采集到數據之后,進行FFT計算,對數據進行處理,并將處理后的數據顯示到屏幕上。


圖2.1 系統結構框圖
三、理論分析及相關參數計算
1.功率放大器理論分析
功率放大器以TDA2030音頻放大器制作,TDA2030具有體積小、輸出功率大、失真小等特點。該功放可實現電流和電壓的放大,根據題目要求,將電壓增益設計為1。
2.電流檢測分析電路的理論分析
電流檢測分析電路包括差分電路、跟隨器、同相放大電路、反相加法電路、反相電路和基準源電路組成。
差分電路是將從電流傳感器輸出的差分信號轉化為單端輸出信號,差分電路用INA2134芯片設計,該芯片是高性能的運算放大器,內部具有導通芯片的精密電阻。后面跟一級電壓跟隨器,起到前后級緩沖、隔離的作用,再經過一級放大,因此可以將微弱信號放大,便于單片機檢測。反相加法器將穩壓源AMS1117-1.8V輸出的直流電壓和放大器輸出的信號相加使得信號偏置到正半軸,但因為采用反相加法,信號全部在負半軸,需要一級反相器來使信號在正半軸。
四、電路設計
1.硬件設計
1.1功率放大電路設計
功率放大電路用TDA2030芯片設計,電壓放大倍數為1,設計電路圖如下:

         
圖4.1 功率放大器TDA2030電路圖
1.2電流檢測分析電路
電流檢測分析電路大致分為三個部分,信號放大部分、穩壓源部分、信號偏移部分。
信號放大部分包括差分電路、跟隨電路、放大電路。差分輸入端并一個100歐姆的電阻,將差分輸入的電流信號轉化為電壓信號。經過差分電路轉化為單端輸出信號,再經過跟隨,放大。放大倍數為電路圖如下:
圖4.2信號放大部分電路圖

穩壓源部分用固定式低壓降線性穩壓器AMS1117-1.8V設計,輸出1.8V直流電壓,電路如圖:
                     
圖4.3 穩壓源部分電路圖

信號偏移部分由反向加法器和反向電路組成,電路如圖:
      
圖4.4  信號偏移部分電路
2.軟件設計
STM32單片機對送入的非正弦信號進行AD采樣,并進行FFT分析,根據分析結果即可得到被測信號的基波頻率、諧波頻率和幅值。主控程序的流程如圖4.5所示。

圖4.5 主控程序流程圖

五、測試方案與測試結果
1.測試儀器
數字信號發生器:DG4062;
臺式萬用表:DM3058;
雙蹤示波器:DS2202E。
2.測試方案
分析可知,輸入信號的頻率、幅度都有可能影響測量結果,這兩者都屬于變量,故采用控制變量法進行結果測量;使用雙蹤示波器觀察電流信號有無明顯失真。
(1)當輸入正弦信號頻率范圍為50Hz-1kHz時,測量流過10Ω負載電阻的電流峰峰值,用示波器觀察系統輸出波形;
(2)控制輸入信號的幅度不變,測量輸入信號頻率對測量結果的影響,并記錄數據;
(3)控制輸入信號的頻率不變,測量輸入信號幅度對測量結果的影響,并記錄數據;
(4)信號發生器輸出非正弦信號,基波頻率范圍為50Hz-200Hz,測量電流信號基波頻率和基波及各次諧波分量的幅度,并記錄數據。
3.測試數據及結果
(1)分別設置輸入信號的頻率為50Hz、500Hz、1kHz,測量流過10Ω負載電阻電流峰峰值,并用雙蹤示波器觀察輸出信號的波形。測試結果如表5.1所示。
表5.1 不同頻率下的電流峰峰值
頻率
50Hz
500Hz
1kHz
電流峰峰值
1.152A
1.149A
1.155A
結論:滿足競賽題目要求,輸出電流峰峰值大于1A
(2)控制輸入信號的幅度不變,改變頻率測量。分別設置輸入信號幅度峰峰值為100mA、5V、10V,改變頻率進行測量。測試結果如表5.2、5.3、5.4所示。



單片機源程序如下:
  1. /**
  2.         ADC + DMA + 定時器
  3.         定時器觸發ADC轉換。
  4.         采樣出來的點進行 FFT 分析。
  5.         
  6.   ******************************************************************************
  7. **/

  8. #include "stm32f10x.h"  
  9. #include "sys.h"
  10. #include "_SysTick.h"

  11. #include "_Usart.h"
  12. #include "lcd.h"
  13. #include "./key/bsp_key.h"
  14. #include "_Led.h"

  15. #include "_ADC.h"

  16. #include "math.h"
  17. #include "arm_math.h"  

  18. #define FFT_LENGTH                4096                 //FFT長度,默認是1024點FFT

  19. float FFT_PARAMETERS(float * pSrc,u16 numSamples);

  20. float fft_inputbuf[FFT_LENGTH*2];        //FFT輸入數組
  21. float fft_outputbuf[FFT_LENGTH];        //FFT輸出數組
  22. float MAX_AMP = 0;
  23. u16   base_fre = 0;
  24. float          harmonic_waves[20] = {0};//前20次諧波的幅度存儲

  25.         arm_cfft_radix4_instance_f32 scfft;        //


  26. ///===============================================================================================        

  27. ///* Private variables ---------------------------------------------------------*/
  28. ///
  29. extern uint8_t _DisplayTemp[60];        //存放 需要屏幕顯示的 字符串
  30. ///
  31. uint8_t dis_temp=0;        //默認0, 按鍵1切換1,顯示頻譜
  32. //float mode_temp = 2.96;//測試模式,默認,串聯電流表檢測,系數是2.96。 按鍵2切換1,并聯測電壓檢測
  33. float mode_temp = 1;//2.965;//修正系數,默認,2.965并聯測電壓檢測.串聯電流表檢測。 按鍵2切換1,

  34.         uint8_t k=0;
  35. //uint8_t _Flag_DMA_IT=0;

  36. extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];// ADC1轉換的電壓值通過DMA方式傳到SRAM
  37. //float ADC_ConvertedValueLocal[NOFCHANEL];  // 局部變量,用于保存轉換計算后的電壓值
  38. ///

  39. /* Private function prototypes -----------------------------------------------*/

  40. void _ADC_Process1(void);//ADC處理
  41. //顯示各頻點的柱條
  42. void dsp_column(void);
  43. void display(void);
  44. ///===============================================================================================


  45. ///===============================================================================================
  46. int main(void)
  47. {
  48. ///====== 變量 =====================
  49.         
  50.         
  51. ///====== 初始化 ===================
  52.         SysTick_Init();/* 配置SysTick 為1us中斷一次 */
  53.         USART_Config();//初始化串口1
  54.                
  55.         LED_GPIO_Config();
  56.         Key_GPIO_Config();
  57.         LCD_Init();
  58.                
  59.         ADCx_Init();                        //開了ADC1,4個通道。通道10~13對PC0~3。        
  60.         _TIM3_Config();

  61. ///===============================================================================================        
  62.         POINT_COLOR = BLACK;
  63.         //LCD_ShowString(8,8,240,300,16,"Measuring System");
  64.         
  65.         
  66.         
  67.         while(1)
  68.         {
  69.   #if 1 ///// 引腳 PC0 , ADC1, ADC_Channel_10
  70. DMA_Cmd( DMA1_Channel1 , ENABLE);
  71. TIM_Cmd( TIM3, ENABLE);
  72.                
  73.                 if( Key_Scan( KEY1_GPIO_PORT ,KEY1_GPIO_PIN) == KEY_ON )
  74.                 {
  75.                         dis_temp = !dis_temp;        //默認0, 按鍵1切換1,顯示頻譜
  76.                         LCD_Clear( WHITE);         //清屏
  77.                         LCD_Display_Dir( dis_temp);                //設置屏幕顯示方向
  78.                 }
  79.         ///~~~~~~~~~~~~////
  80.                 if( Key_Scan( KEY2_GPIO_PORT ,KEY2_GPIO_PIN) == KEY_ON )
  81.                 {
  82.                         mode_temp = 2.96;        //  按鍵2切換1,2.96串聯電流表檢測。默認,2.965并聯測電壓檢測,系數.。
  83.                         LED1_0;
  84.                 }        
  85.                
  86.                 ///////// 按下KEY4.切換到另一組模塊
  87.                         /*檢測是否有按鍵按下 */
  88.         if(GPIO_ReadInputDataBit(KEY4_GPIO_PORT,KEY4_GPIO_PIN) == 1 )  
  89.         {
  90.                 /*等待按鍵釋放 */
  91.                 while(GPIO_ReadInputDataBit(KEY4_GPIO_PORT,KEY4_GPIO_PIN) == 1 )  ;   
  92.                         mode_temp = 1.478;        // 默認,并聯測電壓檢測,系數。 按鍵2切換1,串聯電流表檢測
  93.                         LED1_0;LED2_0;
  94.         }
  95.         
  96.                
  97.                 if( Key_Scan( KEY3_GPIO_PORT ,KEY3_GPIO_PIN) == KEY_ON )
  98.                 {
  99.                         mode_temp = 1.414;        //按鍵3切換,串聯電流表檢測。。 默認,并聯測電壓檢測,系數2.96.。
  100.                         LED1_1;
  101.                 }        
  102. #endif
  103. /////                        
  104.         
  105.         }
  106. }
  107.         ////////////////////////////////////////////////////////////
  108. void  DMA1_Channel1_IRQHandler (void)
  109. {
  110.     u16 i ;
  111.         
  112.         DMA_ClearITPendingBit( DMA1_IT_TC1);
  113.         TIM_Cmd( TIM3, DISABLE);        
  114.         DMA_Cmd( DMA1_Channel1 , DISABLE);

  115.         TIM_SetCounter(TIM3,0);
  116.         

  117. arm_cfft_radix4_init_f32( &scfft,FFT_LENGTH,0,1 );//初始化scfft結構體,設定FFT相關參數
  118.         
  119. for( i=0;i<FFT_LENGTH;i++)//
  120. {
  121. fft_inputbuf[2*i]=ADC_ConvertedValue[i]*3.3/4096;//
  122. fft_inputbuf[2*i+1] = 0;
  123. }   

  124. arm_cfft_radix4_f32( &scfft, fft_inputbuf);        //FFT計算(基4)        
  125. arm_cmplx_mag_f32( fft_inputbuf, fft_outputbuf, FFT_LENGTH);        //把運算結果復數求模得幅值

  126. FFT_PARAMETERS( fft_outputbuf, FFT_LENGTH);        //FFT_LENGTH                4096                 //FFT長度,默認是1024點FFT

  127. //////////////////////////

  128. ////////////
  129. if(dis_temp)//默認0, 按鍵1切換1,顯示頻譜
  130.         
  131.         dsp_column();//顯示柱條。

  132. else
  133.         display        ();//顯示
  134.         
  135. }
  136. ////====================================================///
  137. float FFT_PARAMETERS(float * pSrc,u16 numSamples)
  138. {
  139.         u16 i;
  140.         float temp_MAX=0;
  141.         u16   temp_FRE=0;
  142.         pSrc[0] = 0;
  143.         for(i=0;i<numSamples/2;i++)
  144.         {
  145.         //        printf("test[%d]:%f\r\n",i,pSrc[i]);
  146.                 temp_MAX = 0;
  147.                 if (pSrc[i]>pSrc[temp_FRE])
  148.                 {
  149. //                        temp_MAX = pSrc[i];
  150.                         temp_FRE = i;        
  151.                 }        
  152. //                else
  153. //                {
  154. //                        temp_MAX = temp_MAX;
  155. //                        temp_FRE = temp_FRE;
  156. //                }
  157.         }
  158.         MAX_AMP = temp_MAX;
  159.         base_fre = temp_FRE;
  160.         for(i=0;i<20;i++)
  161.         {
  162.                 if(temp_FRE*(i+1)<=1000)
  163.                 harmonic_waves[i]=pSrc[temp_FRE*(i+1)]/2048*1.02;
  164.                 else
  165.                 {        //k++;        
  166.                         harmonic_waves[i] = 10101;
  167.                 }
  168.         }
  169.         return 0 ;
  170. }/////
  171. //////////////////////////////////////////////
  172. //顯示        V單位
  173. #if 0
  174. void display(void)
  175. {
  176.         uint8_t i;
  177.         
  178. //諧波振幅
  179. for(i=0;i<20;i++)
  180. {
  181.         if( harmonic_waves[i] == 10101 )        //超過題目要求的1k范圍的 不顯示
  182.         {
  183. //        printf("harmonic_waves[%d]:%c\r\n",i,'-');
  184.         
  185.         //sprintf((char*)_DisplayTemp," fre(%2d)_V =  --       ", i+1 );//將信息打印到_DisplayTemp地址空間里。
  186.         LCD_ShowString(56,40+13*i,240,24,12,"                     ");//顯示
  187.         //        k--;
  188.         }
  189.         else
  190.         {
  191. //        printf("harmonic_waves[%d]:%f\r\n",i,harmonic_waves[i]/2.8);
  192.         
  193.         sprintf((char*)_DisplayTemp," f(%2d) I =%f mA   ", i+1 , harmonic_waves[i]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
  194.         LCD_ShowString( 56,40+13*i,240,24,12,_DisplayTemp);//顯示
  195.         }
  196. }        
  197. //printf("base_fre:%d\r\n",base_fre);
  198. //printf("Ipp=%f A \r\n", 2*harmonic_waves[0]/2.8 );
  199. //頻率
  200.         sprintf((char*)_DisplayTemp," Fre = %d Hz     ", base_fre );//將信息打印到_DisplayTemp地址空間里。
  201.         LCD_ShowString(26,16,240,24,12,_DisplayTemp);//顯示
  202. //基波
  203.         sprintf((char*)_DisplayTemp," Ipp = %f mA   ", 2 * harmonic_waves[0]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
  204.         LCD_ShowString(116,16,240,24,12,_DisplayTemp);//顯示
  205.         
  206. }
  207. #endif
  208. //顯示        mV單位
  209. #if 1
  210. void display(void)
  211. {
  212.         uint8_t i;
  213.         
  214. //諧波振幅
  215. for(i=0;i<20;i++)
  216. {
  217.         if( harmonic_waves[i] == 10101 )        //超過題目要求的1k范圍的 不顯示
  218.         {
  219. //        printf("harmonic_waves[%d]:%c\r\n",i,'-');
  220.         
  221.         //sprintf((char*)_DisplayTemp," fre(%2d)_V =  --       ", i+1 );//將信息打印到_DisplayTemp地址空間里。
  222.         LCD_ShowString(56,40+13*i,240,24,12,"                     ");//顯示
  223.         //        k--;
  224.         }
  225.         else
  226.         {
  227. //        printf("harmonic_waves[%d]:%f\r\n",i,harmonic_waves[i]/2.8);
  228.         
  229.         sprintf((char*)_DisplayTemp," f(%2d) I =%7.3f mA   ", i+1 , harmonic_waves[i]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
  230.         LCD_ShowString( 56,40+13*i,240,24,12,_DisplayTemp);//顯示
  231.         }
  232. }        
  233. //printf("base_fre:%d\r\n",base_fre);
  234. //printf("Ipp=%f A \r\n", 2*harmonic_waves[0]/2.8 );
  235. //頻率
  236.         sprintf((char*)_DisplayTemp," Fre = %d Hz     ", base_fre );//將信息打印到_DisplayTemp地址空間里。
  237.         LCD_ShowString(26,16,240,24,12,_DisplayTemp);//顯示
  238. //基波
  239.         sprintf((char*)_DisplayTemp," Ipp = %.3f mA   ", 2 * harmonic_waves[0]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
  240.         LCD_ShowString(116,16,240,24,12,_DisplayTemp);//顯示
  241.         
  242. }
  243. #endif
  244. //顯示各頻點的柱條
  245. void dsp_column(void)
  246. {
  247.    uint16_t i,j=0,m;
  248. //        
  249.         LCD_Clear( WHITE);         //清屏
  250. //        LCD_Display_Dir(1);                //設置屏幕顯示方向
  251.         
  252.         // LCD_Fill(0,228,320,240, WHITE );//填充指定顏色
  253.          for(i=0;i<20;i++)
  254.            {
  255.                 LCD_Fill(3+j, 228 - (uint16_t)(harmonic_waves[i]*90),12+j, 228 , BRRED );
  256.                 LCD_ShowxNum(2+j,228, i+1 ,2, 12,0); //顯示一個數字
  257.                 if( harmonic_waves[i] != 10101 )        
  258.                 {               
  259.                 sprintf((char*)_DisplayTemp,"%d", (uint16_t)(harmonic_waves[i]*1000/ mode_temp) );//將信息打印到_DisplayTemp地址空間里。
  260.                 LCD_ShowString( 2+j, 216 - (uint16_t)(harmonic_waves[i]*90),240,24,12,_DisplayTemp);//顯示
  261.                         j=j+16;
  262.                 }
  263.                 }
  264.                 LCD_ShowString( 2, 0 ,240,24,12,"Ip/mV");//顯示
  265.                
  266. }


  267.         /////////////
  268. /*********************************************END OF FILE**********************/
復制代碼

所有資料51hei提供下載:
2018年電賽電流信號檢測裝置.rar (2.39 MB, 下載次數: 236)


作者: 46856    時間: 2019-8-1 21:07
請問那個差分電路的兩個輸入和線圈接的時候有正負的區分嗎?
作者: users123    時間: 2019-10-15 20:00
樓主能不能留下聯系方式,有問題需要了解
作者: Rogerm    時間: 2020-2-6 18:25
樓主還在么,看到的話方便留個聯系方式嗎,有問題請教




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