當前位置:妙知谷 >

家居 >生活常識 >

12V500w車載工頻逆變器製作

12V500w車載工頻逆變器製作

操作方法

(01)首先要準備一個變壓器,我的變壓器是功放裏面拆出來的,雙輸出32V,500W,將次級拆出來

12V500w車載工頻逆變器製作
12V500w車載工頻逆變器製作 第2張

(02)拆除次級後用毛巾包住手(有手套的最好用手套),將銅絲稍微擬直,因為等會兒要重新制作變壓器,逆變變壓器的電壓利用率是很低的,比如要繞12V的變壓器,則只需要繞12V的一半電壓,這樣在滿載的情況下輸出才有充分的餘量,

12V500w車載工頻逆變器製作 第3張

(03)將銅絲擬直後,下面就要開始繞變壓器了,根據輸入電流計算,這裏我將之前的銅絲對摺為4根,12V變壓器要根據實際情況來繞,繞好後通電大約5.8V左右就行

12V500w車載工頻逆變器製作 第4張
12V500w車載工頻逆變器製作 第5張

(04)繞好變壓器後,需要用膠帶纏繞一下,這裏我因為沒有高温膠帶,則用空調銅管的纏繞帶,由於我的變壓器是環變,漏感是比較小的,由於是硅鋼片上,到20K的載波時損耗太大,需要外加一個電感來濾掉這個高頻載波,這裏我用一個鐵硅鋁磁環,繞了8圈,注意:環變一定要加這個磁環,不然空載電流相當大,方形變壓器則可以不用。

12V500w車載工頻逆變器製作 第6張

方法/步驟2

(01)變壓器繞好後,下面就是功率主板了,剛好以前做實驗的時候留了幾塊在身邊,好多東西搬家的時候都搞丟了,由於沒有TO-247的MOS管,在電子垃圾堆裏翻到5個75NF75,500W滿載大概50多A,75A的管子將就着用了,

12V500w車載工頻逆變器製作 第7張
12V500w車載工頻逆變器製作 第8張

(02)焊接了一上午,終於焊接好了

12V500w車載工頻逆變器製作 第9張

(03)下面就是比較關鍵的東西 了,正弦波驅動板,這裏我用的單片機產生SPWM,單片機採用比較便宜的STM8S003F,通過IR211S驅動MOS管,顯示器採用74HC595擴展做的動態掃描顯示,採用2個3位數碼管,分別輪流顯示輸出電壓,電流,電池電壓,頻率。調製方式採用雙極性調製,因為單極性的輸出過零點會有個毛刺,雙極性的輸出則很乾淨,空載電流也一樣

12V500w車載工頻逆變器製作 第10張
12V500w車載工頻逆變器製作 第11張

方法/步驟3

(01)裝好後的整機

12V500w車載工頻逆變器製作 第12張

(02)這是通電的測試,13V下空載電流0.55A,損耗還是比較大的,

12V500w車載工頻逆變器製作 第13張
12V500w車載工頻逆變器製作 第14張
12V500w車載工頻逆變器製作 第15張

(03)下面則是你們最關心的了--程序,我採用的IAR的編譯器,下面是主函數://採用雙極性方式調製,載波20K#include "IOSTM8S103F3.h"#include "APP.h"/*採用2個共陰三段數碼管做顯示(SM320281)74hc595高位(bit7)接數碼管a,最低位接小數點(spi採用高位在前,低位在後)管腳定義:Poin1:FAN+      poin20:VFBpoin2:TFB       poin19:50HZ/60HZ(引腳懸空默認50HZ輸出)poin3:IFB       poin18:NCpoin4:RST       poin17:SPI_RCKpoin5:NC        poin16:SPI_DIpoin6:HZ_out    poin15:SPI_SCKpoin7:GND       poin14:SPWM_Ppoin8:VCAP      poin13:SPWM_Npoin9:3.3V      poin12:NCpoin10:LED-     poin11:SPWM_EN*/#define u8 unsigned char#define u16 unsigned int#define u32 unsigned long#define  LED            PA_ODR_ODR3 //LED-指示輸出PA3//#define  HZ_out         PA_ODR_ODR2 //基準方波輸出#define  HZ_out         PD_ODR_ODR1 //基準方波輸出#define  SST_Tset       1#define FQ              PD_IDR_IDR2      //PD2#define num50hz    416//50hzu8 ADC_flag;u16 ADC_Value,ADC_VFB,ADC_TFB,ADC_IFB,IFB_temp;u8 sin_error;u16 cont;u8 ms_10,t,d;u8 dis[6];//第一頁顯示緩存u8 dis_2[6];//第二頁顯示緩存u16 sin_num_max;        //點數最大值u8 page_cnt;int sin_b;const u8 logo_tab[14][6]=;const u8 sin_50[416]={ //50HZ正弦表129,131,133,135,137,139,141,143,145,147,149,151,152,154,156,158,160,162,164,166,167,169,171,173,175,176,178,180,182,184,185,187,189,190,192,194,195,197,199,200,202,203,205,206,208,209,211,212,214,215,217,218,219,221,222,223,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,243,244,245,246,246,247,248,248,249,250,250,251,251,252,252,253,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,253,253,253,252,252,251,251,250,250,249,248,248,247,246,246,245,244,243,243,242,241,240,239,238,237,236,235,234,233,232,231,229,228,227,226,225,223,222,221,219,218,217,215,214,212,211,209,208,206,205,203,202,200,199,197,195,194,192,190,189,187,185,184,182,180,178,176,175,173,171,169,167,166,164,162,160,158,156,154,152,151,149,147,145,143,141,139,137,135,133,131,129,128,126,124,122,120,118,116,114,112,110,108,106,104,103,101,99,97,95,93,91,89,88,86,84,82,80,79,77,75,73,71,70,68,66,65,63,61,60,58,56,55,53,52,50,49,47,46,44,43,41,40,38,37,36,34,33,32,30,29,28,27,26,24,23,22,21,20,19,18,17,16,15,14,13,12,12,11,10,9,9,8,7,7,6,5,5,4,4,3,3,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,3,3,4,4,5,5,6,7,7,8,9,9,10,11,12,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,32,33,34,36,37,38,40,41,43,44,46,47,49,50,52,53,55,56,58,60,61,63,65,66,68,70,71,73,75,77,79,80,82,84,86,88,89,91,93,95,97,99,101,103,104,106,108,110,112,114,116,118,120,122,124,126,128,};const u8 tab_wei[6]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};//6個位選,第一位為電壓顯示最高位(595—bit5)const u8 tab_num[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x39,0xB9,0x76};//14個數,最後一位清空不顯示const u8 Error_tab[6]={0x6D,0x6D,0x78,0x79,0x70,0x70};//故障代碼顯示(SSt,Err)void System_Init(void)extern u8 Last_temp;           //保存最新的温度值int main(){System_Init();//系統初始化,打開內部RC=16MhzTimer1_Init();//SPWM初始化Timer2_Init();//FAN輸出初始化ADC_Init();//ADC初始化HC595_Dispaly_Init();//初始化SPI// IWDG_Init();//看門狗初始化// IWDG_KR = 0xaa;//喂狗TIM2_CCR1L = 200;//開啟風扇LED = 0;//開啟燈光asm("rim");//開中斷,sim為關中斷//=====================================================軟啟動#if (SST_Tset>0)ms_10=0;while(1)else if(sin_b>=254)//軟啟動失敗{sin_b = 10;//減小幅度for(;;)//無窮迴圈{if(ADC_flag>0){ADC_VFB=ADC_Convert_8(VFB);//得到輸出結果ADC_flag=0;}//打開模擬調節器if(ADC_VFB>250)sin_b--;//減小幅度else if(ADC_VFB<246)sin_b++;//增大幅度//限制數據if(sin_b>=254)sin_b = 254;else if(sin_b<=10)sin_b = 10;//屏幕顯示故障HC595_Send_16bit(tab_wei[d],Error_tab[d]);if(++d>5)d=0;// IWDG_KR = 0xaa;//喂狗}}}}}#elsesin_b=100;//初始化SPWM調製度#endifADC_flag=0;//清除標誌ADC_Value=0;ADC_VFB=0;t=0;while(1)}//空閒處理温度 (PWM控制範圍:25度-60度:543)else{       //30度打開風扇(NTC=10K,5V電壓,下拉電阻1.3K)ADC_TFB = ADC_Convert_8(TFB);//TFB轉換8次if((Last_temp&0x7F)>30)//25度TIM2_CCR1L = (Last_temp&0x7F)<< 2;//控制風扇轉速 *4elseTIM2_CCR1L=0;//關閉風扇}//LED閃爍指示,查看CPU運行速度if(ms_10>=15){ms_10=0;if((TIM1_SR1&0x80)>0)LED=0;else LED=~LED;if(++page_cnt>=100)page_cnt=0;//輪換顯示//翻頁計數器}//電壓,電流,温度,頻率刷屏顯示處理if(page_cnt<50){if(d==4) HC595_Send_16bit(tab_wei[d],tab_num[dis[d]]|0x80);//數碼管第5位顯示小數點else     HC595_Send_16bit(tab_wei[d],tab_num[dis[d]]);}else if(page_cnt>=50)HC595_Send_16bit(tab_wei[d],tab_num[dis_2[d]]);if(++d>5)d=0;// IWDG_KR = 0xaa;//喂狗}// return 0;}//end main#pragma vector=TIM1_OVR_UIF_vector//TIM1更新中斷__interrupt void TIM1_OVR_UIF(void){u8 PWM_P = 255 - sin_50[cont];TIM1_CCR4L=ALU(sin_50[cont],sin_error);TIM1_CCR3L=ALU(PWM_P,sin_error);HZ_out = (cont>=208)?1:0;//基準波輸出if(++cont>=416){cont=0;ms_10++;sin_error=sin_b;  //零點投放誤差}if(cont==62||cont==270)ADC_flag++;//開始ADC採樣64個點//IWDG_KR = 0xaa;//喂狗TIM1_SR1 = 0; // 清除更新中斷return;}這裏是功能模塊的初始化:#include "APP.h"u8 Last_temp;           //保存最新的温度值union change{ // 兩個單字節結合一個雙字節:u16 two;u8 one[2];}ss;const u8 Temp_table[110]=;//==================PID迭代================================//==================PID迭代================================signed char PIDCalc(u16 NextPoint){int iError;static int ek1,ek_d;static int ek2,ek3;//U(k+1) = U(k) + ( KP*E(k) + KI*E(k-1) + KD*E(k-2) )iError = SetPoint - NextPoint; //增量計算ek1+= iError;ek_d = ek2-ek3;ek3 = ek2;ek2 = iError;return (iError>>Proportion)  //E[k]項+  (ek1>>Integral)  //E[k-1]項+  (ek_d>>Derivative); //E[k-2]項}//=======================同週期乘法器========================u8 ALU(u8 multiplier, u16 multiplicand){u16 product = 0;u8  t=0;do{if(multiplier & 1)product += multiplicand;else product +=0;multiplicand <<= 1;multiplier >>= 1;} while(++t<8);return product>>8;}/*************************************************函數名稱:u8 Temp_search(u8 k)**功    能:温度搜索**參    數:無**輸入:ADC採樣值**返回值  :10進制,帶符號的温度值(&0x80):"1":為正温度(含0)“0”為負温度**調用    :***********************************************/u8 Temp_search(u8 t_new)//搜索{u8 i;if(t_new>=Temp_table[Last_temp]){while(1){if(t_new>=Temp_table[Temp_max])//判斷數據是否超出範圍,超出後顯示100度{i= 99;//返回最大温度值break;}else{for(;t_new>=Temp_table[Last_temp];Last_temp++);//t_new大於數組表則退出循環i= Last_temp;break;}}}else //小於最低温度後{while(1){if(t_new<Temp_table[0])//比最低温度還要小時{i=0;break;}else{for(;t_new<Temp_table[Last_temp-1];Last_temp--);//尋找最低匹配温度i= Last_temp;break;}}}if(i>=Temp_min){i=i-Temp_min; return (i|0x80);}//大於Temp_min則對應的温度為正温度數,最高位為1則為正,包含特殊0else {i=Temp_min-i;return i;}//顯示負温度}void ADC_Init(void){ADC_CSR=VFB; //選擇通道 AIN3/PD2,VFBADC_CR1=0;//Fadc=Fmast/2// ADC_CR1=0x10;// /3//ADC_CR1=0x20;// /4//ADC_CR1=0x30;// /6//ADC_CR1=0x40;// /8//ADC_CR1=0x50;// /10//ADC_CR1=0x60;// /12//ADC_CR1=0x70;// /18ADC_CR2=0x38; // 數據排列,右對齊ADC_TDRL=0x01;//禁止施密特出發}u16 ADC_Convert_8(u8 k)//連續轉換8次{u8 i;u16 result=0;ADC_CSR=k;//獲取通道ADC_CR1|=0x01;//低功耗喚醒ADCfor(i=0;i<8;i++){ADC_CR1|=0x01;//開啟轉換while(!(ADC_CSR & 0x80)); // 等待轉換結束ADC_CSR&=0xef;//清除標誌s1=ADC_DRL;//防止數據錯亂,先讀低位在讀高位s0=ADC_DRH;result+=s2;//累計}return result>>3;}void Timer2_Init(void)//PWM控制風扇轉速{PD_DDR|= 0x10;//PD4輸出模式,FANPD_CR1|= 0x10;//推輓輸出PD_CR2=0;TIM2_IER  = 0x00;  //禁止中斷TIM2_IER=0x00;//不使用中斷//    TIM2_EGR  =0x01;   //允許產生更新標誌TIM2_CCMR1 = 0x68;//模式1,啟用影子寄存器TIM2_CCER1 = 0x01;//信號輸出到對應的引腳TIM2_CNTRH = 0;TIM2_CNTRL=199;//計數器值TIM2_ARRH = 0x00;TIM2_ARRL=0xFF;//自動重裝的值(16bit寄存器)TIM2_PSCR=3;//分頻值2^3,         Fs = 16Mhz/(255+1)/(2^3)=7.8KhzTIM2_CCR1H = 0;//TIM2_CCR1L = 0;//(0-255)TIM2_CR1=0x01;//使能計數器}void Timer1_Init(void)//PWM輸出配置{PC_DDR|= 0x18;//Pc3,7為輸出模式PC_CR1|= 0x18;//推輓輸出PC_CR2 = 0;//TIM1_CH3,TIM1_CH4輸出SPWMTIM1_PSCRH=0;//預分頻TIM1_PSCRL=2;//Fs = 16Mhz/(2+1)=5.3MhzTIM1_ARRH=0;//設定重裝載值TIM1_ARRL=0xFF;//最大PWM分辨率為8bit,載波 = 5.3Mhz/255 = 20.9Khz#if (Unipolar_Choice>0)TIM1_CR1|=0xA0;//使能影子寄存器,選擇中心對齊模式#elseTIM1_CR1|=0x80;//使能影子寄存器,選擇邊沿對齊模式#endifTIM1_EGR|=0x01;//產生一個更新事件,使預分頻設置有效TIM1_CCR3H=0;//佔空比TIM1_CCR4H=0;//佔空比TIM1_CCR3L=0;//關閉輸出TIM1_CCR4L=0;TIM1_CCMR3=0x68;//PWM模式1TIM1_CCMR4=0x68;//PWM模式1// TIM1_CCER1=0x10;//TIM1_CCER2=0x11;//TIM1_CH3獨立輸出,TIM1_CH4獨立輸出(無死區)// TIM1_DTR = 0x25;//死區控制TIM1_IER = 0x01;//允許TIM1更新中斷TIM1_BKR|=0xF1;//開啟輸出,開啟剎車使能,1級鎖定TIM1_CR1|=0x01;//向上計數,緩存,使能}void HC595_Dispaly_Init(void)//595顯示初始化(發送時鐘:16Mhz/2=8Mhz){PC_DDR|= 0xe0;//Pc5,6,7為輸出模式PC_CR1|= 0xe0;//推輓輸出PC_CR2 = 0;SPI_CR2|=0xC0;//只發送模式SPI_CR1=0x04;// /2//SPI_CR1=0x0C;// /4//SPI_CR1=0x14;// /8//SPI_CR1=0x1C;// /16//SPI_CR1=0x24;// /32//SPI_CR1=0x2C;///64//SPI_CR1=0x34;//128//SPI_CR1=0x3C;//256SPI_DR=0;//發送空SPI_CR1|=0x40;//開啟SPISPI_RCK=0;}void HC595_Send_16bit(u8 duan,u8 data_i)//發送16bit數據(高位在前,低位在後){SPI_RCK=0;//======================== numwhile(!(SPI_SR&0x02));//等待發送完成SPI_DR=duan;//發送數據//======================== duanwhile(!(SPI_SR&0x02));//等待發送完成SPI_DR=data_i;//發送數據while(SPI_SR&0x80);//查看是否忙//=================================endwhile(!(SPI_SR&0x02));//等待發送完成while(SPI_SR&0x80);//查看是否忙SPI_RCK=1;//595輸出使能開,輸出數據return;}extern u8 dis[6];//第一頁顯示緩存extern u8 dis_2[6];//第二頁顯示緩存extern u16 ADC_VFB,ADC_TFB,ADC_IFB;//extern u8 sin_error;//extern u8 HZ_50_60;void  Dispaly_KEX_DEC(void)//16進制轉換到10進制{u16 temp;temp=ADC_VFB;//輸出電壓計算temp+=ADC_VFB<<2;//*320temp>>=4;//temp/1024dis[0]=temp/100;temp = temp-(dis[0]*100);dis[1] = temp/10;dis[2] = temp%10;if(dis[0]==0)dis[0]=10;//不顯示//=====================================================temp= ADC_IFB*55;//輸出電流轉換,外部採樣電阻0.03/2 = 0.015R//temp+= ADC_IFB<<2;//*220->temp>>=4;//temp/1024dis[3]=temp/100;temp = temp-(dis[3]*100);dis[4] = temp/10;dis[5] = temp%10;if(dis[3]==0)dis[3]=10;//不顯示//======================================================dis_2[1]= Temp_search(ADC_TFB>>2);//温度轉換if(dis_2[1]&0x80)//正温度dis_2[2] = 11;//顯示Celse//負温度dis_2[2] = 12;//顯示_2[1]&=0x7F;//出去温度符號位dis_2[0] = dis_2[1]/10;//得到温度高位dis_2[1] = dis_2[1]%10;//得到温度低位if(dis_2[0]==0)dis_2[0]=10;//不顯示//======================================================//頻率顯示//if(HZ_50_60>0)//60hz//dis_2[3]=6;//顯示6//elsedis_2[3]=5;dis_2[4]=0;dis_2[5]=13;//顯示Hreturn;}void IWDG_Init(void) //配置並啟動看門狗{IWDG_KR = 0xcc;//啟動獨立看門狗IWDG_KR = 0x55;//寫入解鎖IWDG_PR = 0x06;//256分頻IWDG_RLR = 0xff;//設置重載寄存器IWDG_KR = 0xaa;//鎖定並刷新}

  • 文章版權屬於文章作者所有,轉載請註明 https://miaozhigu.com/jj/changshi/r8y8y0.html