這是2018年TI杯電流信號檢測裝置一等獎作品,有原理圖,源代碼資料
主控是STM32F103ZET6
原理圖是用AD畫的。
摘要:設(shè)計并制作了一種電流信號檢測裝置,系統(tǒng)主要由功率放大電路,電流傳感、檢測及調(diào)理電路,由ARM單片機(jī)為核心的數(shù)據(jù)采集、參數(shù)測量以及顯示電路組成。功率放大電路以TDA2030為核心搭成電壓增益為1的電流放大電路,驅(qū)動10Ω負(fù)載產(chǎn)生10mA~1A的電流,使用漆包線繞制成的線圈作為電流傳感器感應(yīng)電流信號,使用INA2134和OP07構(gòu)成信號調(diào)理電路,將感應(yīng)到的微弱信號變?yōu)橐子趩纹瑱C(jī)采集和處理的電壓信號,由STM32單片機(jī)采集電壓信號,實現(xiàn)被測信號峰峰值檢測、頻率計算、FFT分析與顯示。當(dāng)該系統(tǒng)輸入頻率范圍為50Hz~200Hz非正弦信號時,通過FFT算法能實現(xiàn)電流信號基波頻率的測量,以及基波和各次諧波分量幅度的測量。 經(jīng)過測量表明,作品指標(biāo)全部滿足競賽題目要求。
1.任務(wù) 如圖1所示,由任意波信號發(fā)生器產(chǎn)生的信號經(jīng)功率放大電路驅(qū)動后,通過導(dǎo)線連接10Ω電阻負(fù)載,形成一電流環(huán)路;設(shè)計一采用非接觸式傳感的電流信號檢測裝置,檢測環(huán)路電流信號的幅度及頻率,并將信號的參數(shù)顯示出來。 圖1 電流信號檢測連接圖
一、方案設(shè)計與選擇 系統(tǒng)主要由功率放大電路,電流傳感、檢測及調(diào)理電路,由ARM單片機(jī)為核心的數(shù)據(jù)采集、參數(shù)測量以及顯示電路組成 1.電流傳感方案選擇 方案一:使用集成電流傳感器件。集成電流傳感器,使用方便,測量結(jié)果準(zhǔn)確,但是它的缺點(diǎn)是線圈的匝數(shù)固定不變,不能根據(jù)自己實際電路和測量要求來改變線圈匝數(shù)。 方案二:漆包線手工繞制電流傳感器。采用漆包線手工繞制電流傳感器?筛鶕(jù)自己的需求,改變磁芯材質(zhì)、漆包線粗細(xì)和線圈的繞制匝數(shù),來適應(yīng)測量電路,滿足測量要求。繞制簡單,易于實現(xiàn)。 綜上所述,本次系統(tǒng)設(shè)計選用方案二。 2.功率放大電路的論證與選擇 方案一:使用分立器件制作功率放大電路。功率管用大功率三極管。使用分立器件制作的功率放大電路,靜態(tài)電流大,非線性失真小,管耗大,且效率低。用該電路作為前級功率放大電路輸出的電流峰峰值遠(yuǎn)遠(yuǎn)大于1A,但是輸入方波時有些諧波會丟失,導(dǎo)致經(jīng)過功放后輸出的方波波形有點(diǎn)失真。 方案二:TDA2030芯片。TDA2030是一款單芯片音頻功率放大器集成電路,具有高電流輸出和高工作電壓,低諧波和交越失真等特點(diǎn)。該電路輸出的電流能滿足題目要求,并且非線性失真小,即使輸入方波,三角波也不會丟失諧波分量。 綜上所述,本次系統(tǒng)設(shè)計選用方案二。 3.差動放大器的論證與選擇 方案一:選擇INA217儀表放大器將差分電流信號轉(zhuǎn)化為單端輸出電流信號,該芯片具有低噪聲,低失真,高帶寬等特點(diǎn),但是檢測小電流信號時,檢測的波形有些失真。 方案二:AD620芯片。選擇AD620儀表放大器將差分電流信號轉(zhuǎn)化為單端輸出電流信號,AD620是低功耗儀表放大器,該芯片具有低功耗,低噪音,直流性能出色等特點(diǎn),但是檢測微弱信號時會出現(xiàn)噪聲干擾,波形出現(xiàn)的毛刺多,單片機(jī)很難檢測。 方案三:INA2134芯片。該INA2134是一個差分線路接收機(jī)組成的高性能運(yùn)算放大器,具有片上精密電阻器,低失真和高的轉(zhuǎn)換速率。該電路能夠檢測出50Hz~1kHz,100mV~10V的正弦波和50Hz~200Hz的方波,并且波形不失真,噪聲好。 綜上所述,本次系統(tǒng)設(shè)計選用方案三。 4.后級運(yùn)算放大器的論證與選擇 方案一:LM358雙差分輸入運(yùn)算放大器作為微弱信號放大,該芯片的低頻特性很好但是高頻特性差,由于有偏置電流所以輸出的波形不是很好,并且最后給單片機(jī)的信號是正的,所以需要把信號往上偏置到正半軸,但是LM358的失調(diào)電壓大,所以這里不選擇LM358。 方案二:OP07芯片是一種低噪聲,非斬波穩(wěn)零的雙極性運(yùn)算放大器集成電路。由于OP07具有非常低的失調(diào)電壓,所以OP07不需要額外的調(diào)零措施,OP07同時具有輸入偏置電流低和開環(huán)增益高的特點(diǎn),這種低失調(diào),高增益的特性使得OP07在檢測小信號時效果出色。 綜上所述,本次系統(tǒng)設(shè)計選用方案二。
二、系統(tǒng)結(jié)構(gòu)論述與框圖 系統(tǒng)主要由功率放大電路,電流傳感、檢測及調(diào)理電路,由ARM單片機(jī)為核心的數(shù)據(jù)采集、參數(shù)測量以及顯示電路組成。系統(tǒng)總體框圖如圖2.1所示。 由任意波形發(fā)生器提供所需信號,輸入到功率放大電路進(jìn)行功率放大,放大后的信號經(jīng)過10Ω負(fù)載轉(zhuǎn)化為電流信號,該電流信號以非接觸的方式,通過磁耦合在由漆包線繞制的線圈兩側(cè)產(chǎn)生感應(yīng)電流。由于感應(yīng)電流信號非常微弱,需經(jīng)過信號調(diào)理電路,將微弱信號變?yōu)閱纹瑱C(jī)可識別檢測的信號,進(jìn)行采集。單片機(jī)采集到數(shù)據(jù)之后,進(jìn)行FFT計算,對數(shù)據(jù)進(jìn)行處理,并將處理后的數(shù)據(jù)顯示到屏幕上。
圖2.1 系統(tǒng)結(jié)構(gòu)框圖 三、理論分析及相關(guān)參數(shù)計算 1.功率放大器理論分析 功率放大器以TDA2030音頻放大器制作,TDA2030具有體積小、輸出功率大、失真小等特點(diǎn)。該功放可實現(xiàn)電流和電壓的放大,根據(jù)題目要求,將電壓增益設(shè)計為1。 2.電流檢測分析電路的理論分析 電流檢測分析電路包括差分電路、跟隨器、同相放大電路、反相加法電路、反相電路和基準(zhǔn)源電路組成。 差分電路是將從電流傳感器輸出的差分信號轉(zhuǎn)化為單端輸出信號,差分電路用INA2134芯片設(shè)計,該芯片是高性能的運(yùn)算放大器,內(nèi)部具有導(dǎo)通芯片的精密電阻。后面跟一級電壓跟隨器,起到前后級緩沖、隔離的作用,再經(jīng)過一級放大,因此可以將微弱信號放大,便于單片機(jī)檢測。反相加法器將穩(wěn)壓源AMS1117-1.8V輸出的直流電壓和放大器輸出的信號相加使得信號偏置到正半軸,但因為采用反相加法,信號全部在負(fù)半軸,需要一級反相器來使信號在正半軸。 四、電路設(shè)計 1.硬件設(shè)計 1.1功率放大電路設(shè)計 功率放大電路用TDA2030芯片設(shè)計,電壓放大倍數(shù)為1,設(shè)計電路圖如下:
圖4.1 功率放大器TDA2030電路圖 1.2電流檢測分析電路 電流檢測分析電路大致分為三個部分,信號放大部分、穩(wěn)壓源部分、信號偏移部分。 信號放大部分包括差分電路、跟隨電路、放大電路。差分輸入端并一個100歐姆的電阻,將差分輸入的電流信號轉(zhuǎn)化為電壓信號。經(jīng)過差分電路轉(zhuǎn)化為單端輸出信號,再經(jīng)過跟隨,放大。放大倍數(shù)為電路圖如下: 圖4.2信號放大部分電路圖
穩(wěn)壓源部分用固定式低壓降線性穩(wěn)壓器AMS1117-1.8V設(shè)計,輸出1.8V直流電壓,電路如圖: 圖4.3 穩(wěn)壓源部分電路圖
信號偏移部分由反向加法器和反向電路組成,電路如圖: 圖4.4 信號偏移部分電路 2.軟件設(shè)計 STM32單片機(jī)對送入的非正弦信號進(jìn)行AD采樣,并進(jìn)行FFT分析,根據(jù)分析結(jié)果即可得到被測信號的基波頻率、諧波頻率和幅值。主控程序的流程如圖4.5所示。
圖4.5 主控程序流程圖
五、測試方案與測試結(jié)果 1.測試儀器 數(shù)字信號發(fā)生器:DG4062; 臺式萬用表:DM3058; 雙蹤示波器:DS2202E。 2.測試方案 分析可知,輸入信號的頻率、幅度都有可能影響測量結(jié)果,這兩者都屬于變量,故采用控制變量法進(jìn)行結(jié)果測量;使用雙蹤示波器觀察電流信號有無明顯失真。 (1)當(dāng)輸入正弦信號頻率范圍為50Hz-1kHz時,測量流過10Ω負(fù)載電阻的電流峰峰值,用示波器觀察系統(tǒng)輸出波形; (2)控制輸入信號的幅度不變,測量輸入信號頻率對測量結(jié)果的影響,并記錄數(shù)據(jù); (3)控制輸入信號的頻率不變,測量輸入信號幅度對測量結(jié)果的影響,并記錄數(shù)據(jù); (4)信號發(fā)生器輸出非正弦信號,基波頻率范圍為50Hz-200Hz,測量電流信號基波頻率和基波及各次諧波分量的幅度,并記錄數(shù)據(jù)。 3.測試數(shù)據(jù)及結(jié)果 (1)分別設(shè)置輸入信號的頻率為50Hz、500Hz、1kHz,測量流過10Ω負(fù)載電阻電流峰峰值,并用雙蹤示波器觀察輸出信號的波形。測試結(jié)果如表5.1所示。 表5.1 不同頻率下的電流峰峰值 結(jié)論:滿足競賽題目要求,輸出電流峰峰值大于1A (2)控制輸入信號的幅度不變,改變頻率測量。分別設(shè)置輸入信號幅度峰峰值為100mA、5V、10V,改變頻率進(jìn)行測量。測試結(jié)果如表5.2、5.3、5.4所示。
0.png (47.46 KB, 下載次數(shù): 37)
下載附件
2019-7-24 15:47 上傳
單片機(jī)源程序如下:
- /**
- ADC + DMA + 定時器
- 定時器觸發(fā)ADC轉(zhuǎn)換。
- 采樣出來的點(diǎn)進(jìn)行 FFT 分析。
-
- ******************************************************************************
- **/
- #include "stm32f10x.h"
- #include "sys.h"
- #include "_SysTick.h"
- #include "_Usart.h"
- #include "lcd.h"
- #include "./key/bsp_key.h"
- #include "_Led.h"
- #include "_ADC.h"
- #include "math.h"
- #include "arm_math.h"
- #define FFT_LENGTH 4096 //FFT長度,默認(rèn)是1024點(diǎn)FFT
- float FFT_PARAMETERS(float * pSrc,u16 numSamples);
- float fft_inputbuf[FFT_LENGTH*2]; //FFT輸入數(shù)組
- float fft_outputbuf[FFT_LENGTH]; //FFT輸出數(shù)組
- float MAX_AMP = 0;
- u16 base_fre = 0;
- float harmonic_waves[20] = {0};//前20次諧波的幅度存儲
- arm_cfft_radix4_instance_f32 scfft; //
- ///===============================================================================================
- ///* Private variables ---------------------------------------------------------*/
- ///
- extern uint8_t _DisplayTemp[60]; //存放 需要屏幕顯示的 字符串
- ///
- uint8_t dis_temp=0; //默認(rèn)0, 按鍵1切換1,顯示頻譜
- //float mode_temp = 2.96;//測試模式,默認(rèn),串聯(lián)電流表檢測,系數(shù)是2.96。 按鍵2切換1,并聯(lián)測電壓檢測
- float mode_temp = 1;//2.965;//修正系數(shù),默認(rèn),2.965并聯(lián)測電壓檢測.串聯(lián)電流表檢測。 按鍵2切換1,
- uint8_t k=0;
- //uint8_t _Flag_DMA_IT=0;
- extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];// ADC1轉(zhuǎn)換的電壓值通過DMA方式傳到SRAM
- //float ADC_ConvertedValueLocal[NOFCHANEL]; // 局部變量,用于保存轉(zhuǎn)換計算后的電壓值
- ///
- /* Private function prototypes -----------------------------------------------*/
- void _ADC_Process1(void);//ADC處理
- //顯示各頻點(diǎn)的柱條
- void dsp_column(void);
- void display(void);
- ///===============================================================================================
- ///===============================================================================================
- int main(void)
- {
- ///====== 變量 =====================
-
-
- ///====== 初始化 ===================
- SysTick_Init();/* 配置SysTick 為1us中斷一次 */
- USART_Config();//初始化串口1
-
- LED_GPIO_Config();
- Key_GPIO_Config();
- LCD_Init();
-
- ADCx_Init(); //開了ADC1,4個通道。通道10~13對PC0~3。
- _TIM3_Config();
- ///===============================================================================================
- POINT_COLOR = BLACK;
- //LCD_ShowString(8,8,240,300,16,"Measuring System");
-
-
-
- while(1)
- {
- #if 1 ///// 引腳 PC0 , ADC1, ADC_Channel_10
- DMA_Cmd( DMA1_Channel1 , ENABLE);
- TIM_Cmd( TIM3, ENABLE);
-
- if( Key_Scan( KEY1_GPIO_PORT ,KEY1_GPIO_PIN) == KEY_ON )
- {
- dis_temp = !dis_temp; //默認(rèn)0, 按鍵1切換1,顯示頻譜
- LCD_Clear( WHITE); //清屏
- LCD_Display_Dir( dis_temp); //設(shè)置屏幕顯示方向
- }
- ///~~~~~~~~~~~~////
- if( Key_Scan( KEY2_GPIO_PORT ,KEY2_GPIO_PIN) == KEY_ON )
- {
- mode_temp = 2.96; // 按鍵2切換1,2.96串聯(lián)電流表檢測。默認(rèn),2.965并聯(lián)測電壓檢測,系數(shù).。
- LED1_0;
- }
-
- ///////// 按下KEY4.切換到另一組模塊
- /*檢測是否有按鍵按下 */
- if(GPIO_ReadInputDataBit(KEY4_GPIO_PORT,KEY4_GPIO_PIN) == 1 )
- {
- /*等待按鍵釋放 */
- while(GPIO_ReadInputDataBit(KEY4_GPIO_PORT,KEY4_GPIO_PIN) == 1 ) ;
- mode_temp = 1.478; // 默認(rèn),并聯(lián)測電壓檢測,系數(shù)。 按鍵2切換1,串聯(lián)電流表檢測
- LED1_0;LED2_0;
- }
-
-
- if( Key_Scan( KEY3_GPIO_PORT ,KEY3_GPIO_PIN) == KEY_ON )
- {
- mode_temp = 1.414; //按鍵3切換,串聯(lián)電流表檢測。。 默認(rèn),并聯(lián)測電壓檢測,系數(shù)2.96.。
- LED1_1;
- }
- #endif
- /////
-
- }
- }
- ////////////////////////////////////////////////////////////
- void DMA1_Channel1_IRQHandler (void)
- {
- u16 i ;
-
- DMA_ClearITPendingBit( DMA1_IT_TC1);
- TIM_Cmd( TIM3, DISABLE);
- DMA_Cmd( DMA1_Channel1 , DISABLE);
- TIM_SetCounter(TIM3,0);
-
- arm_cfft_radix4_init_f32( &scfft,FFT_LENGTH,0,1 );//初始化scfft結(jié)構(gòu)體,設(shè)定FFT相關(guān)參數(shù)
-
- for( i=0;i<FFT_LENGTH;i++)//
- {
- fft_inputbuf[2*i]=ADC_ConvertedValue[i]*3.3/4096;//
- fft_inputbuf[2*i+1] = 0;
- }
- arm_cfft_radix4_f32( &scfft, fft_inputbuf); //FFT計算(基4)
- arm_cmplx_mag_f32( fft_inputbuf, fft_outputbuf, FFT_LENGTH); //把運(yùn)算結(jié)果復(fù)數(shù)求模得幅值
- FFT_PARAMETERS( fft_outputbuf, FFT_LENGTH); //FFT_LENGTH 4096 //FFT長度,默認(rèn)是1024點(diǎn)FFT
- //////////////////////////
- ////////////
- if(dis_temp)//默認(rèn)0, 按鍵1切換1,顯示頻譜
-
- dsp_column();//顯示柱條。
- else
- display ();//顯示
-
- }
- ////====================================================///
- float FFT_PARAMETERS(float * pSrc,u16 numSamples)
- {
- u16 i;
- float temp_MAX=0;
- u16 temp_FRE=0;
- pSrc[0] = 0;
- for(i=0;i<numSamples/2;i++)
- {
- // printf("test[%d]:%f\r\n",i,pSrc[i]);
- temp_MAX = 0;
- if (pSrc[i]>pSrc[temp_FRE])
- {
- // temp_MAX = pSrc[i];
- temp_FRE = i;
- }
- // else
- // {
- // temp_MAX = temp_MAX;
- // temp_FRE = temp_FRE;
- // }
- }
- MAX_AMP = temp_MAX;
- base_fre = temp_FRE;
- for(i=0;i<20;i++)
- {
- if(temp_FRE*(i+1)<=1000)
- harmonic_waves[i]=pSrc[temp_FRE*(i+1)]/2048*1.02;
- else
- { //k++;
- harmonic_waves[i] = 10101;
- }
- }
- return 0 ;
- }/////
- //////////////////////////////////////////////
- //顯示 V單位
- #if 0
- void display(void)
- {
- uint8_t i;
-
- //諧波振幅
- for(i=0;i<20;i++)
- {
- if( harmonic_waves[i] == 10101 ) //超過題目要求的1k范圍的 不顯示
- {
- // printf("harmonic_waves[%d]:%c\r\n",i,'-');
-
- //sprintf((char*)_DisplayTemp," fre(%2d)_V = -- ", i+1 );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString(56,40+13*i,240,24,12," ");//顯示
- // k--;
- }
- else
- {
- // printf("harmonic_waves[%d]:%f\r\n",i,harmonic_waves[i]/2.8);
-
- sprintf((char*)_DisplayTemp," f(%2d) I =%f mA ", i+1 , harmonic_waves[i]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString( 56,40+13*i,240,24,12,_DisplayTemp);//顯示
- }
- }
- //printf("base_fre:%d\r\n",base_fre);
- //printf("Ipp=%f A \r\n", 2*harmonic_waves[0]/2.8 );
- //頻率
- sprintf((char*)_DisplayTemp," Fre = %d Hz ", base_fre );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString(26,16,240,24,12,_DisplayTemp);//顯示
- //基波
- sprintf((char*)_DisplayTemp," Ipp = %f mA ", 2 * harmonic_waves[0]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString(116,16,240,24,12,_DisplayTemp);//顯示
-
- }
- #endif
- //顯示 mV單位
- #if 1
- void display(void)
- {
- uint8_t i;
-
- //諧波振幅
- for(i=0;i<20;i++)
- {
- if( harmonic_waves[i] == 10101 ) //超過題目要求的1k范圍的 不顯示
- {
- // printf("harmonic_waves[%d]:%c\r\n",i,'-');
-
- //sprintf((char*)_DisplayTemp," fre(%2d)_V = -- ", i+1 );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString(56,40+13*i,240,24,12," ");//顯示
- // k--;
- }
- else
- {
- // printf("harmonic_waves[%d]:%f\r\n",i,harmonic_waves[i]/2.8);
-
- sprintf((char*)_DisplayTemp," f(%2d) I =%7.3f mA ", i+1 , harmonic_waves[i]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString( 56,40+13*i,240,24,12,_DisplayTemp);//顯示
- }
- }
- //printf("base_fre:%d\r\n",base_fre);
- //printf("Ipp=%f A \r\n", 2*harmonic_waves[0]/2.8 );
- //頻率
- sprintf((char*)_DisplayTemp," Fre = %d Hz ", base_fre );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString(26,16,240,24,12,_DisplayTemp);//顯示
- //基波
- sprintf((char*)_DisplayTemp," Ipp = %.3f mA ", 2 * harmonic_waves[0]*1000/ mode_temp );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString(116,16,240,24,12,_DisplayTemp);//顯示
-
- }
- #endif
- //顯示各頻點(diǎn)的柱條
- void dsp_column(void)
- {
- uint16_t i,j=0,m;
- //
- LCD_Clear( WHITE); //清屏
- // LCD_Display_Dir(1); //設(shè)置屏幕顯示方向
-
- // LCD_Fill(0,228,320,240, WHITE );//填充指定顏色
- for(i=0;i<20;i++)
- {
- LCD_Fill(3+j, 228 - (uint16_t)(harmonic_waves[i]*90),12+j, 228 , BRRED );
- LCD_ShowxNum(2+j,228, i+1 ,2, 12,0); //顯示一個數(shù)字
- if( harmonic_waves[i] != 10101 )
- {
- sprintf((char*)_DisplayTemp,"%d", (uint16_t)(harmonic_waves[i]*1000/ mode_temp) );//將信息打印到_DisplayTemp地址空間里。
- LCD_ShowString( 2+j, 216 - (uint16_t)(harmonic_waves[i]*90),240,24,12,_DisplayTemp);//顯示
- j=j+16;
- }
- }
- LCD_ShowString( 2, 0 ,240,24,12,"Ip/mV");//顯示
-
- }
- /////////////
- /*********************************************END OF FILE**********************/
復(fù)制代碼
0.png (6.52 KB, 下載次數(shù): 43)
下載附件
2019-7-24 15:48 上傳
所有資料51hei提供下載:
2018年電賽電流信號檢測裝置.rar
(2.39 MB, 下載次數(shù): 236)
2019-7-24 15:00 上傳
點(diǎn)擊文件名下載附件
代碼,原理圖 下載積分: 黑幣 -5
|