痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 7338|回復: 29

野人獻曝: 電子負載

  [複製鏈接]
發表於 2013-10-13 01:16:03 | 顯示全部樓層 |閱讀模式
本帖最後由 antlu 於 2013-10-13 01:19 AM 編輯

電子負載線路.png

功能:
   上一行
   1.負載目前電源電壓
   2.負載目前電流
   3.已放電時間  

   下一行
   0.@ 輸出
   1.設定最低放電電壓
   2.設定放電電流
   3.設定放電時間

  硬體電路
   DSC07529.JPG

DSC07530.JPG

DSC07531.JPG

DSC07532.JPG

DSC07533.JPG

按鍵: 1 輸出 2.三個設定切換 3.數值 +  4.數值- 5. <移動 6.>移動

程式: 簡單功能 還需要在細調大家參考


/* 1. // 頭文字
2. 設定參數
3. 顯示部分
4. A/D 轉換程序(讀取 輸入,轉換程序)
5.掃描判斷
6.按鍵處理
7.計時與中斷
8.串並與輸出控制
9.主程式

*/




// 頭文字
#include<STC15F204EA.h>
#include<intrins.h>

//設定參數
bit Startflag;//start 1/ stop 0 開始放電旗標
bit VoI_flag;//volt 1 /current 0 設定終極放電電壓或放電電流
//bit Ts_flag;// down count second
bit TimeFlag;      //T0 counter 中斷定時器
unsigned char  Gcounter; //T0counter 計時器計數
unsigned char   Tcount;//秒計數
//unsigned char Tcounter;//T1 counter no use
unsigned char Idata;//current setting data send to DAPort then I_SET & I_CLR 送到595 的放電電流設定值
unsigned char Vdata;//volt setting data send to DAPort  then V_SET & V_CLR送到595 的終極放電電壓截止設定值
unsigned char Idigt;// LCM 3bit   0.00 ~ 1.00 000~100 設定電流 0~10.0A
unsigned char Vdigt;//LCM V 3bit   00.0~15.0 000~150 設定放電截止電壓25.5V
unsigned char Tdigt;//放電時間位數值
unsigned int Tdata;//放電時間數量
unsigned int KS,KSC;//按鍵掃描讀取DA值 data
bit Kinc;// + key 判斷按鍵按下後設此BIT為1
bit Kdec;// - key
bit Kls;// < key
bit Krs;//> key
unsigned char VoI;// volt 0 or Current 1 or Time 2 select
bit STRP;// start/stop
bit Khold;// 按鍵放開 key press/release

//顯示部分
sbit RS = P3^7;   //LCM control
sbit RW = P3^6;
sbit EN = P3^5;
sbit LV= P0^1;//當電壓低於設定值會變lo 開始之後3秒再檢查連續檢查後再 動作
unsigned char LVcount;
char displayword[16];
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P2 //STC15F204EA P1 A/D P2 LCM P3^7--RS  P3^6--W/R P3^5--E
//宣告
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
unsigned int Q,R,Dchg_T,Work_T,ADC_DATA,L,I,N;


/*------------------------------------------------
           LCM driver
4bit 驅動線程式 需要把要顯示的資料放在變數裡面
char displayword[16];

------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}

void LCD_Write_Com(char com) // 4bit
{  
while(LCD_Check_Busy());
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;//
com<<=4;
EN_SET; //
_nop_();
DataPort= com; //
EN_CLR;//
DelayMs(1);
}

void LCD_Write_Data(char Data) //for 4bit
{
while(LCD_Check_Busy()); //
RS_SET; //
RW_CLR;//
EN_SET; //
DataPort= Data; //
_nop_();//
EN_CLR;//
Data<<=4;
  EN_SET; //
DataPort= Data; //
EN_CLR;//
DelayMs(1);//
}



void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     
        }
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
while (*s)
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
LCD_Write_Data( Data);  
}

void LCD_Write_FChar(unsigned char x,unsigned char y)
{     //write cursor flash
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }
LCD_Write_Com(0x0f);        
}

/*------------------------------------------------
            initial LCM
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x28);    /*4bit mode*/
   DelayMs(5);
   LCD_Write_Com(0x28);
   DelayMs(5);
   LCD_Write_Com(0x28);
   DelayMs(5);
   LCD_Write_Com(0x28);  
   LCD_Write_Com(0x08);    /*?F?ü?×??*/
   LCD_Write_Com(0x01);    /*?F?ü2M?ì*/
   LCD_Write_Com(0x06);    /*?F?ü?ú?á2??e?|?m*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*?F?ü…{¤??ú?á?|?m*/
   }

void Display_pros(void)
{//實際電壓電流讀值 xx.xV xx.xA 999s
        displayword[0]= Q/100+'0';//百位
        displayword[1]= (Q%100)/10+'0';//十位
        displayword[2]= '.';
        displayword[3]= (Q%10)+'0';//個位
        displayword[4]= 'V';
        displayword[5]= ' ';
        displayword[6]= R/100+'0';
        displayword[7]= (R%100)/10+'0';
        displayword[8]= '.';
        displayword[9]= (R%10)+'0';
        displayword[10]='A';
        displayword[11]= ' ';
        displayword[12]= (Work_T /100)+'0' ;//工作秒數
        displayword[13]=( Work_T %100)/10+'0';
        displayword[14]= (Work_T %10)+'0';
        displayword[15]='S';
         LCD_Write_String(0,0, displayword);//以上為第一行顯示   
        DelayMs(50);
     
//設定值
if(Startflag) displayword[0]='@';
         else displayword[0]=' ';
        displayword[1]= Vdata/100+'0';//Vdata/100+'0';
        displayword[2]= (Vdata%100)/10+'0';//Vdata /10%10+'0';
        displayword[3]= '.';
        displayword[4]= (Vdata%10)+'0';//Vdata %10%10+'0';//??? 怪怪的 Vdata%100/10+’0’;
        displayword[5]= ' ';
        displayword[6]= Idata/100+'0';
        displayword[7]= Idata /10%10+'0';
        displayword[8]= '.';
        displayword[9]= Idata %10%10+'0';
        displayword[10]= 'A';
        displayword[11]= ' ';
        displayword[12]= (Dchg_T/100)+'0' ;//放電秒數
        displayword[13]= (Dchg_T %100)/10+'0';
        displayword[14]= (Dchg_T %10)+'0';
        displayword[15]='S';
    LCD_Write_String(0,1, displayword);//以上為第二行顯示值
                DelayMs(10);       
if(VoI==0)
{         
   if(Vdigt==2) LCD_Write_FChar(1,1); //閃爍用來輸入flash for input
         else if(Vdigt==1) LCD_Write_FChar(2,1);
         else LCD_Write_FChar(4,1);
  }
  if(VoI==1)
        {
   if(Idigt==2) LCD_Write_FChar(6,1); //閃爍用來輸入flash for input
         else if(Idigt==1) LCD_Write_FChar(7,1);
         else LCD_Write_FChar(9,1);
           }
if(VoI==2)                                         
{       
if(Tdigt==2) LCD_Write_FChar(12,1);
       else if(Tdigt==1) LCD_Write_FChar(13,1);                                         
                                else          LCD_Write_FChar(14,1);
}
}

//A/D 轉換程序
//P1M0 = 0xff; //設定15f204ea 的起始參數
//P1M1 = 0x00;
//P1ASF=0xff;        //all analog in put mode

/*******************************************************************
analog input  DATA read
*******************************************************************/
unsigned int Read (unsigned char CHA)
         {
     unsigned char AD_FIN=0; //set ad work finish
    CHA &= 0x07;            //set channel to hi 0000 0111 只允許0~7
    ADC_CONTR = 0x60;  //ADC暫存0XX0 0000 取樣速度設定
    _nop_();
    ADC_CONTR |= CHA;       //read port(CHA) 加入PORT選擇
    _nop_();
    ADC_CONTR |= 0x80;      //ADC電源開啟
    DelayMs(1);            //¨
/******開始A/D動作 start A/D **************/
    ADC_CONTR |= 0x08;      //AD暫存0000 1000  啟動轉換
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while (AD_FIN ==0){     //等待AD_FIN 變為1
    AD_FIN = (ADC_CONTR & 0x10); //0001 0000ADC_FLAG=1;轉態完成
    }
    ADC_CONTR &= 0xE7;      //1111 0111 把ADC_START=0;禁止再做ADC,
                ADC_DATA=ADC_RES*4+ADC_RESL;//取出10位的資料       
return (ADC_DATA);         

}




unsigned int Mavg(unsigned char an)
// read 5 times data and average 讀5次求平均值
// an for analog input no.
{
        unsigned char at;
        unsigned int M;
        M=0;
        for (at=0;at<5;at++)
  {
                M=Read(an)+M;//analog 3 input
                DelayMs(100);
        }
        M=M/5;
        return M;
}
void transfer(void){
// 取參考電壓2.5V把電壓的值換算成數值並且以此為依據推展到其他類比輸入電壓
L= Mavg(0);//Read(0); // read volt analog 讀取0通道資料存到L變數
I= Mavg(1);//read (1) read current analog讀取1通道資料存到I變數
N=Read(2);//ref 2.5V讀取2通道這是參考電壓2.5V資料存到N變數
Q=(L*256/N); //Q=L~N/2.5 =L/(N/2.5)= 相對於 1V的倍數 若輸入1.3V 則要顯示1.3 但是整數變數所以要把他乘上10倍或是100倍 …
R=(I*128/(N));//R=display current data 1V=1A R=((I*1.25)/N)*100
DelayMs(1);

}

//按鍵掃描部分 6個按鍵 利用A/D 讀近來判斷數量這僅限於8bit 若是10bit 還需要再做判斷修改程式  讀取 A/D(3)
//convert 6 key to 1.on/off 2.VoI  3.inc  4.dec  5. <   6. >
// bit--on bit--inc bit--dec bit-off
void Keyscan(void)
{
        KS=Read(3);//Read(3); //key scan read port3
        if(KS>1000) Khold=0;//no key pressed
if((KS<915)&&(!Khold))
{
          Khold=1;
         DelayMs(20);
         KS=Mavg(3);
   KSC=Mavg(3);
  if(KS==KSC)
         {                 
         if((KS<870)&&(KS>840)) //1st key > press
                                 Krs=1;
        else if((KS<839)&&(KS>810))//2nd key  < press
             Kls=1;
        else if((KS<809)&&(KS>720))//3rd key Inc press
          Kdec=1;
        else if((KS<719) &&(KS>600)) //4th key Dec press        
                   Kinc=1;
        else if((KS<599)&&(KS>450))//5th key "VoI" press                 
        VoI++;
                                if(VoI>2)
                                        VoI=0;
        else if(KS<100)// 6 th key "ON/OFF " press
                                STRP=1;
  }
}
        else //key release
        { //
     Khold=0;               
   }
}

//按鍵處理程式 依據按鍵功能進行處理包刮按鍵後的數值處理和預先設定

void Key_Pros (void)
{
    //---------------------------------------------------------------------------------------            
         if(STRP) {STRP=0;Startflag=!Startflag;}//ON/OFF
   if(VoI==0) //執行電壓值設定
           {  //{VoI=0;VoI_flag=~ VoI_flag;}// Volt or Current---- volt set mode
              if (Kls) // shift left "<"
                                                                        {
                                                                                Kls=0;//                     
                                                                     Vdigt++;
                                                                                        if(Vdigt>2) Vdigt=0;
                                                                                        }
                                                          if(Krs) //shift right ">"
                                                                                        { Krs=0;//-----------------------------
                                      Vdigt--;
                                                                                                        if(Vdigt==255) Vdigt=2;
                                                                                        }                                                                                                                       
                                                         if(Kinc)//+
                    { Kinc=0;//------------------------
                     if(Vdigt==0) Vdata=Vdata++;
                     if(Vdigt==1) Vdata=Vdata+10;
                     if(Vdigt==2) Vdata=Vdata+100;
                     if(Vdata>250) Vdata=250;            
                    }
                                                         if(Kdec)//-
                        { Kdec=0;//---------------------------
                          if(Vdigt==0) Vdata=Vdata--;
                                                                                                        if(Vdigt==1) Vdata=Vdata-10;
                                                                                                        if(Vdigt==2) Vdata=Vdata-100;
                                                                                                        if(Vdata>250) Vdata=0;            
                         }
                                                                                         //
                        // LCD_Clear();//test
                         //                                 
                                }
                        //電流設定
                         if(VoI==1)        
       {
              if (Kls) // shift left "<"
                                                                        {
                                                                                Kls=0;//                     
                                                                     Idigt++;
                                                                                        if(Idigt>2) Idigt=0;
                                                                                        }
                                                          if(Krs) //shift right ">"
                                                                                        { Krs=0;//-----------------------------
                                      Idigt--;
                                                                                                        if(Idigt==255) Idigt=2;
                                                                                        }                                                                                                                       
                                                         if(Kinc)//+
                    { Kinc=0;//------------------------
                     if(Idigt==0) Idata=Idata++;
                     if(Idigt==1) Idata=Idata+10;
                     if(Idigt==2) Idata=Idata+100;
                     if(Idata>250) Idata=250;            
                    }
                                                         if(Kdec)//-
                        { Kdec=0;//---------------------------
                          if(Idigt==0) Idata=Idata--;
                                                                                                        if(Idigt==1) Idata=Idata-10;
                                                                                                        if(Idigt==2) Idata=Idata-100;
                                                                                                        if(Idata>250) Idata=0;            
                         }
                                                                                                                          //
                        // LCD_Clear();//test
                         //
                                 }
                                if(VoI==2) //執行時間值設定
                                {
             if (Kls) // shift left "<"
                                                                        {
                                                                                Kls=0;//                     
                                                                     Tdigt++;
                                                                                        if(Tdigt>2) Tdigt=0;
                                                                                        }
                                                          if(Krs) //shift right ">"
                                                                                        { Krs=0;//-----------------------------
                                      Tdigt--;
                                                                                                        if(Tdigt==255) Tdigt=2;
                                                                                        }                                                                                                                       
                                                         if(Kinc)//+
                    { Kinc=0;//------------------------
                     if(Tdigt==0) Tdata=Tdata++;
                     if(Tdigt==1) Tdata=Tdata+10;
                     if(Tdigt==2) Tdata=Tdata+100;
                     if(Tdata>990) Tdata=990;            
                    }
                                                         if(Kdec)//-
                        { Kdec=0;//---------------------------
                          if(Tdigt==0) Tdata=Tdata--;
                                                                                                        if(Tdigt==1) Tdata=Tdata-10;
                                                                                                        if(Tdigt==2) Tdata=Tdata-100;
                                                                                                        if(Tdata>990) Tdata=0;            
                         }
                                                Dchg_T=Tdata;
                                                                                         //
                        // LCD_Clear();//test
                         //                                 
              }                       

        }


//定時與中斷
//--------------------------------------------------------------------------------------------
void Init_Timer0(void)
{
TMOD |= 0x01;      //mode 1,16bit timer "|"can "OR"operation                    
TH0= (65536-2000)/256; //   0x0D8 2ms if 12Mcristal
TL0= (65536-2000)%256;// 0x0F0
EA=1;         
ET0=1;         
TR0=1;         
}


//--------------------------------------------------------------------------------------------
void Timer0_isr(void) interrupt 1
{
TH0= (65536-2000)/256; //   0x0D8 2ms if 12Mcristal
TL0= (65536-2000)%256;// 0x0F0
    Gcounter++;//counter is Global variable.
          if(Gcounter==100)
                {Tcount++;
                        if(Startflag)
                        {
                                if (Tcount>10)
                        { Tcount=0;
                                Work_T++;
                                Dchg_T--;
                                if(LV==0)//電壓低於設定值
                                {
                                        LVcount++;                                       
                                }
                                else
                                        LVcount=0;
                /*        if(LVcount>3)
                                {Startflag=0;
                                }                                       
                                if(Dchg_T==0)
                                        Startflag=0;*/
                        }
                }
                else//stop output
                        Tdata=Dchg_T;
        }
    if(Gcounter>150)          //140ms update 1 time
     {      
      TimeFlag=1;            //
       Gcounter=0;
                         
        }
}

/*------------------------------------------------
delay us
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
delay ms
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
   DelayUs2x(245);
         DelayUs2x(245);
}
}


//74hc595 D/A轉換的串—並處理
//*******************************************
sbit SER = P3^4;// 74hc595 control
sbit Latch = P3^3;
sbit Clk = P3^2;
void Send595(unsigned char Dat) //output data to D/A converter through the serial mode
{
         unsigned char i;
         for (i=0;i<8;i++)
         {
                 Clk=0;
                 SER=Dat & 0x80;
                 _nop_();
        
                 Dat<<=1;
                 Clk=1;
                 _nop_();
        
         }
         Latch=0;
         _nop_();
        
         _nop_();
         Latch=1;
         _nop_();
         _nop_();
}

void Send2byte(unsigned char Dat1,unsigned char Dat2)
{
         Send595(Dat1);//Idata
         Send595(Dat2);//Vdata
}

//輸出控制
//*******************???******************
void OP(bit K)//output control
{
  if (K)// data op =set
   {
     Send2byte(Idata,Vdata);// volt & current data sent to i/o and latch
    }
else //data output=0
  {
// reset volt & current data sent to i/o and latch
Send2byte(0x00,0x00);
}
}

//主程式
void main(void)
{
P1M0 = 0xff;
P1M1 = 0x00;
P1ASF=0xff;        //all analog in put mode
Init_Timer0();//initial timer0
LCD_Init();
        DelayMs(10);
LCD_Clear();//2M?ì
        DelayMs(10);
Idata=30;//default current 300mA
Vdata=50;//default volt 5.0v
Idigt=1;//default position
Vdigt=1;
VoI=0;
        Dchg_T=900;
while (1)
{
if(TimeFlag==1)//140ms update
  {
  TimeFlag=0;
   Display_pros();//display data
  }
if(LVcount>3)
                                {Startflag=0;
                                        LVcount=0;
                                }                                       
                                if(Dchg_T==0)
                                        Startflag=0;
if(Startflag)
   {
    OP(1); //out put on
   }
         else
         {
                 OP(0); //output set volt & current to 0
          }

        DelayMs(10);
transfer();//do ADC & put  to display
Keyscan();//read key press
                       
Key_Pros ();// scan key and do something
         
}
}


評分

18

查看全部評分

發表於 2013-10-13 21:38:03 | 顯示全部樓層


師傅都電子化、程式化、數位化,三太子:看不懂,給您一個讚!
錢都買酒消耗了,負載就用燈泡化頂著~ 要多少?加多少
DSCI5626.JPG

評分

2

查看全部評分

發表於 2013-10-13 21:47:26 | 顯示全部樓層
作為負載機該有的設定都有了
只差"放電容量"未作出來
此功能需要將"電流*時間"作輸出

阿乾大,倒數第二張圖
那顆黑色長條形物體是?
發表於 2013-10-13 22:22:26 | 顯示全部樓層
popcorn 發表於 2013-10-13 09:38 PM static/image/common/back.gif
師傅都電子化、程式化、數位化,三太子:看不懂,給您一個讚!
錢都買酒消耗了,負載就用燈泡化頂著~ 要多 ...

安捏生,負載Ve穩定啦 ...

評分

1

查看全部評分

 樓主| 發表於 2013-10-13 22:42:36 | 顯示全部樓層
本帖最後由 antlu 於 2013-10-13 10:44 PM 編輯
winrar070 發表於 2013-10-13 09:47 PM static/image/common/back.gif
作為負載機該有的設定都有了
只差"放電容量"未作出來
此功能需要將"電流*時間"作輸出


這是網路同好送的"電晶體模組"!!
要找一個 LCM 2004 來玩會比較"有看頭" 我現在的 1602 ...
發表於 2013-10-13 22:52:36 | 顯示全部樓層
antlu 發表於 2013-10-13 10:42 PM static/image/common/back.gif
這是網路同好送的"電晶體模組"!!
要找一個 LCM 2004 來玩會比較"有看頭" 我現在的 1602 ... ...

這顆"電晶體模組"感覺不便宜喔
1602也可以玩拉,要作切換顯示較麻煩
發表於 2013-10-13 23:28:19 | 顯示全部樓層
popcorn 發表於 2013-10-13 09:38 PM static/image/common/back.gif
師傅都電子化、程式化、數位化,三太子:看不懂,給您一個讚!
錢都買酒消耗了,負載就用燈泡化頂著~ 要多 ...

>安捏生,負載Ve穩定啦 ...
意思就是當燈泡點亮的時候,因為阻值會變化,所以負載是不穩定的,像個好動的小寶貝一樣動個不停 ...

我知道你一定又會說,青菜加蘿蔔,加減用啦 ...
不要像這樣就沒關係啦 ...
當然啦,你高興就好了 ...
發表於 2013-10-14 20:49:23 | 顯示全部樓層
scottwang 發表於 2013-10-13 11:28 PM static/image/common/back.gif
>安捏生,負載Ve穩定啦 ...
意思就是當燈泡點亮的時候,因為阻值會變化,所以負載是不穩定的,像個好動的小 ...

噗~什毀電子產品負載是穩定不變滴,青菜加蘿蔔,我乾杯,哩隋意!
發表於 2013-10-14 20:58:27 | 顯示全部樓層
popcorn 發表於 2013-10-14 08:49 PM static/image/common/back.gif
噗~什毀電子產品負載是穩定不變滴,青菜加蘿蔔,我乾杯,哩隋意!

忽然覺得
你師父應該是"濟公"才對吧n_064|
發表於 2013-10-14 22:42:12 | 顯示全部樓層
看到雄爸的回文,我笑了~

單純測試負載,使用一般燈泡.電阻.風扇等
會使用到電子負載機,不外乎就是需要精準的固定電流
用來測試電池容量等
 樓主| 發表於 2013-10-14 23:44:47 | 顯示全部樓層
winrar070 發表於 2013-10-14 10:42 PM static/image/common/back.gif
看到雄爸的回文,我笑了~

單純測試負載,使用一般燈泡.電阻.風扇等

W大:
   多年前(未學C) 用OP+TR+大散熱片作了一個簡易無源電子負載,然後用 OP +繼電器+計時器 作了一個放電電壓截止電路,作為 12個鎳氫電池的放電電路,為了要了解自動吸塵器電池的"能耐"!! 結果會有誤動作還有為了測一次電路就要接線老半天,後來也就不知道塞到哪裡去了!!  接下來在陳生電子買了一個套件(~700元)但是也沒有用多少次! 因為使用的機會真的不多(不常修理電源供應),這次純粹就是想要證明自已也可以做到類似這樣的"工具(玩具)"當然我的線路比起陳生電子零件多了些,功能少了些,但也算是心滿意足了!!
發表於 2013-10-15 10:05:21 來自手機 | 顯示全部樓層
雖然市售產品有類似功能,但自己努力搞出來的成品
感覺就是不同。
發表於 2013-10-15 10:09:22 | 顯示全部樓層
大大你好
俺只看到 ALIGENT 的電源供應器...
實在太厲害了, 讓業餘人士直流口水
發表於 2013-10-15 14:31:26 | 顯示全部樓層
antlu 大大好

請教一下 程式中 Idata=30;//default current 300mA
                      Vdata=50;//default volt 5.0v

其 R-2R DAC 不是 8bit 嗎 ?   Vo = 5V * 50 / 256 =0.98V

46k分壓5.11k 是 衰減1/10  , 但Vdata 送50 就想不透了

是 10k 可調電阻的調整嗎 ?   煩請大大幫小弟說明一下,謝謝
 樓主| 發表於 2013-10-16 00:39:39 | 顯示全部樓層
a3loris 發表於 2013-10-15 02:31 PM static/image/common/back.gif
antlu 大大好

請教一下 程式中 Idata=30;//default current 300mA

a3大;
   這是歷史的包袱!! 當初我在作數位電源供應的時候那時,希望我的電源一開機有一個起始值,安杰輪的機器開機設定 0V 5A 我覺得不夠方便於是把自己做玩具的使用經驗 5V 300MA 作為 DEFAULT 設定,用在數位電子負載時候 我希望當放電的電池電源電壓降到一定的電壓值時候要"停止放電"以免損壞電池..所以會一個設定值.  還有我的電路為了簡單(焊洞洞板粉辛苦!)所以一切簡化所以我把 D/A 部分設成 1bit 就是0.1v 或是 0.1A 於是我的最高放電電壓等於設在 25.5v 放電電流 25.5A 利用20K可變電阻去調整輸出電壓給 OP作為比較用,你也知道要計算精密電阻值與分壓比較麻煩,我手頭可變電阻一大堆,順手就用上了!! VDATA 送出50就是5V 要和 46K 5.11K 得到相同的比值時候直接調整20KVR 很容易也很有彈性的達到我的目的. 為何不是 10K而是20K呢? 因為 R-2R 內組都是10K 若是VR為10K 輸出會有問題(我的經驗)!!
這樣的解答您滿意嗎? 我是初學者作的是玩具所以一切從簡!! 若你有興趣作我可以送你2個 R/2R電阻!! 不管你是要作 數位電源還是數位負載!!
發表於 2013-10-16 10:24:44 | 顯示全部樓層
antlu 大
不好意思,小弟程度太差了,還是不懂為何 D/A 部份是 1bit 是 0.1 v
查了百度的 "R2R电阻阵列式DAC" , 以 R-2R电阻电压式 , D/A 1 bit 不是 5v/256 約 0.02V 嗎 ?
感謝大大心意 , 小弟久未玩 8051了


 樓主| 發表於 2013-10-16 12:00:56 | 顯示全部樓層
a3loris 發表於 2013-10-16 10:24 AM static/image/common/back.gif
antlu 大
不好意思,小弟程度太差了,還是不懂為何 D/A 部份是 1bit 是 0.1 v
查了百度的 "R2R电阻阵列式 ...

a3大:
   這是設計方便考量,於是我把他用 OP放大到1BIT 0.1V (5倍),如同電流檢出 以0.05歐母的電阻若是流過1A電流會產生 0.05V電壓,若把他放大10倍就是 0.5V再去跟 D/A比較也可以...
發表於 2013-10-16 12:03:33 | 顯示全部樓層
標準的R2R

8BIT均輸出為HI
R2R-V.gif

1BIT為HI
R2R.gif

加上20K 可變電阻後
R2R-MAX.gif

R2R-MIN.gif
可變電阻加上去後,會有負載效應
所以最高輸出電壓不可能會有5V
透過可變電阻調整就可以調出
1BIT=0.1V
發表於 2013-10-16 17:37:25 | 顯示全部樓層
antlu  大
Vdata 放大5倍 和  Idata 放大10倍 , 是否在大大貼的電路圖中未劃出 ? 感謝大大講解

winrar070 大
R-2R 的阻值 應該是 10K / 20K ,小弟查到的資料都是 R 跟 2R ,請教大大電阻值是(全部都是10K) 或是 (10K / 20K) ?
若依 大大圖2 其1BIT 輸出 3.13mv 是怎麼算出的 ? 謝謝
發表於 2013-10-16 21:42:11 | 顯示全部樓層
a3loris 發表於 2013-10-16 05:37 PM static/image/common/back.gif
antlu  大
Vdata 放大5倍 和  Idata 放大10倍 , 是否在大大貼的電路圖中未劃出 ? 感謝大大講解

抱歉,小弟誤會R2R的意思了
小弟看阿乾大的電路,以為全部都是10K
1BIT會出現3mV,是軟體運算而成
可能有誤,會找時間重新模擬
發表於 2013-10-17 00:00:20 | 顯示全部樓層
R2R8BIT.gif

R2R1BIT.gif
重新模擬的結果,請参考
 樓主| 發表於 2013-10-17 01:30:23 | 顯示全部樓層
winrar070 發表於 2013-10-17 12:00 AM static/image/common/back.gif
重新模擬的結果,請参考

WINRAR大:
   你的工具會令人留口水!! 我的是 10K-20K的網路!! 我是因為回收場看到的東西,想到應該粉好用所以就拿回來,於是就用在玩具上面!!
 樓主| 發表於 2013-10-19 22:27:18 | 顯示全部樓層
穿衣服不容易,量身訂做又要考慮成本,要合適不能太緊不能太鬆,...

穿上還要比劃一下有沒有走光漏餡!!
輸出4.8 輸入4.4 中間吃掉了 0.4V
DSC07540.JPG

DSC07541.JPG

幾個角度大家看看,漂亮就拍拍手!
DSC07542.JPG

DSC07543.JPG

DSC07544.JPG

DSC07545.JPG

這個外殼來自回收場(馬達驅動電路)
DSC07546.JPG

DSC07547.JPG

DSC07548.JPG

站著也行
DSC07549.JPG

改程式的窗口
DSC07551.JPG
謝謝指教
 樓主| 發表於 2013-10-22 01:36:18 | 顯示全部樓層
實測報告:
  使用 PC 電源供應 電壓 12V 規格 10A 經過測試發現玩具有幾個問題,電流逐漸提高之後消耗的功率 24W 36W ....96W
導線壓降明顯,所以日後大家有製作的時候需要把導線加粗以免影響到檢出電壓過低問題,
散熱應該是最大的問題,沒有使用強制風扇的狀況下溫度一下子就飆升到65度以上,強制風扇的猛吹之下溫度仍然在50度以上,我本以為散熱片已經夠大了,目前尋找合適的風扇.
電壓的變動很嚴重,使用三用表測量倒是很穩定,可能跟RMS有關!! 以前的經驗當電壓漣波大我的電壓顯示就容易亂跳,幾天使用 HP的電源供應5V 5A 電壓顯示倒是很穩定.
發表於 2013-10-22 05:39:38 | 顯示全部樓層
antlu 發表於 2013-10-19 10:27 PM static/image/common/back.gif
穿衣服不容易,量身訂做又要考慮成本,要合適不能太緊不能太鬆,...

穿上還要比劃一下有沒有走光漏餡!!

說要穿衣服,怎麼沒有看到布或者蕾絲呢? ... :sam10
 樓主| 發表於 2013-10-22 13:32:59 | 顯示全部樓層
scottwang 發表於 2013-10-22 05:39 AM static/image/common/back.gif
說要穿衣服,怎麼沒有看到布或者蕾絲呢? ...

scottwang大:
   科技材質大量使用 塑膠製品...哈哈哈!! 有走光!!
發表於 2013-10-23 00:01:24 | 顯示全部樓層
antlu 發表於 2013-10-22 01:32 PM static/image/common/back.gif
scottwang大:
   科技材質大量使用 塑膠製品...哈哈哈!! 有走光!!

所有的功率都被電晶體模組消耗,當然會發出大量的熱能
可以考慮殺CPU的散熱模組來用

線材壓降,18AWG約可以通過5安培
並連兩條可以通過12安培左右
或者考慮將電壓偵測獨立
發表於 2013-10-23 01:54:09 | 顯示全部樓層
antlu 發表於 2013-10-22 01:36 AM static/image/common/back.gif
實測報告:
  使用 PC 電源供應 電壓 12V 規格 10A 經過測試發現玩具有幾個問題,電流逐漸提高之後消耗的功率 ...

線性電源  高熱是難免的  
電壓偵測只要改位子 改在最靠近輸出端就可以不用換線了又能補償導線壓降
當然導線超過絕緣體的溫度還是要換
電壓可以看看示波器怎麼說  看是均方根值的問題還是又出現跟LM317數位控制一樣的三角波問題


問一下  
有一些 白色 橘色的細線  是OK線嗎??  感覺很好用 很方便
發表於 2013-10-23 11:23:27 | 顯示全部樓層
可以参考atx電源,另外拉一條細線出來偵測電壓
此細線與原本的粗線有電阻相連
所以細線脫落時,只會造成電壓上的誤差

to 專炸元件大
橘色是ok線,白色是單心線
 樓主| 發表於 2013-10-23 19:26:02 | 顯示全部樓層
專炸大:
   白色 橘色都是OK線 橘色是新品 白色是回收場收到公司研發單位倒店貨就把他給拿回來了!!

  昨天去回收場找了一個"較合適"的風扇,歡歡喜喜的裝上去才知道 12V 0.5A 的規格,而我的原先電路只有 12V 50mA,因為都裝好了只好硬幹!! (聲音像是戰車) 用一個開關來切換(最好裝上 45度溫度開關),今天作了一下測試 結果算是滿意啦!!

有圖有真相!!

網路上的仿作 PC電源改裝使用 3.3V~12V
DSC07555.JPG

這次只測試 12V
DSC07556.JPG

溫度很快就上來&持續升溫中
DSC07557.JPG

12V輸出但是光是電線就降了 0.6~0.7V
DSC07558.JPG

46度開始打開風扇,前天還飆到 H (65度以上)
DSC07559.JPG

DSC07560.JPG

溫度SENSOR位置
DSC07561.JPG

這個風扇雙陪林風力非凡!!
DSC07563.JPG

DSC07564.JPG

DSC07565.JPG

DSC07566.JPG

溫度都維持在 40度左右 將近70W 11.4V 5.9A
DSC07567.JPG

30分鐘之後自動停止放電(另外一個功能就是電壓低於設定值)
DSC07568.JPG
DSC07562.JPG
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-17 10:38 PM , Processed in 0.352918 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.