พิมพ์หน้านี้ - ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ

LSVคลังสมองออนไลน์ "ปีที่21"

► อิเล็กทรอนิกส์ ► => ใช้งานPICด้วยภาษาASM => ข้อความที่เริ่มโดย: yanyongs ที่ มกราคม 31, 2012, 01:31:49 PM



หัวข้อ: ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ
เริ่มหัวข้อโดย: yanyongs ที่ มกราคม 31, 2012, 01:31:49 PM
ผมต้องการใช้ งาน Mcp4922 (DAC IC ) แบบ SPI ตอนนี้ใช้ได้ตัว 1 /2 ch
แต่อยากได้แบบ สั่ง DAC ได้ 2 ตัว ขึ้นไป แต่ไม่รู้ว่า ต้องเขียนอย่างไรครับ
รบกวน อาจารย์ ทั้งหลายช่วยที่ครับ
/// CODE
////////////////   UPDATE 7/1/2012   ///////////////
////////////////  PIC18F4620          ///////////////
#include <built_in.h>
#define beep1 PORTC.F2 //BC548    BUZZER  5V
int vout1,vout2,rail_in, map_in,map_ref;
     // MCP4922 Configuration Constants '
    //***********************************'
 const char rail_conf = 0x50; //Channel A Buffered x2Gain
 const char map_conf = 0xD0; //Channel B Buffered x2Gain
 const char SHDN = 0x00;
void DAC_OUT(char config,int output)
{
     PORTC.F0=0;
     SPI_Write(config+Hi(output));
     SPI_Write(Lo(output));
     PORTC.F0=1;
}
void  rail_up()
{
       int rail_ref;
  rail_in=Adc_read(0);
  rail_ref=Adc_read(0)*2;
if(rail_in>=306&&rail_in<327){vout1=(rail_ref-20);}
else if(rail_in>=327&&rail_in<700){vout1=(rail_ref-37);}
else if(rail_in>=700){vout1=(rail_ref-18);}
else{vout1=rail_ref;}
}
void  map_up()
{
  map_in=Adc_read(1);
  map_ref=(Adc_read(1)*2);
 if(map_in>=204&&map_in<300){vout2=(map_ref+20);}
else if(map_in>=300&&map_in<600){vout2=(map_ref+40);}
else if(map_in>=600){vout2=1588;}
else{vout2=map_ref;}
}

void main()
{
     TRISA=0XFF;
     TRISC=0X00;
     PORTC=0x00;
     TRISC.F0=0; 
     Spi_Init();
     PORTC.F0=1;
     DAC_OUT(SHDN,0);
     beep1=1;
while(1)
{
    rail_up();
    map_up();
    DAC_OUT(rail_conf,vout1); // Output on channel A
    DAC_OUT(map_conf,vout2); // Output on channel B
    beep1=0;
}
}


หัวข้อ: Re: ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ
เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 17, 2012, 08:45:31 AM
เข้ามานั่งรอครับบบบ lv! undecided2


หัวข้อ: Re: ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ
เริ่มหัวข้อโดย: kiano♥ ที่ กุมภาพันธ์ 17, 2012, 07:21:16 PM
ผมก็ซื้อมา ว่าจะลองใช้งานดู เพื่อนให้ทำกล่องดันรางให้ แต่มันยังวางอยู่ในกล่องไปรษณีย์จนบัดเดี๋ยวนี้ ได้ลองเมื่อไหร่แล้วจะกลับมาดูให้ครับ


หัวข้อ: Re: ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ
เริ่มหัวข้อโดย: yanyongs ที่ มีนาคม 06, 2012, 09:10:41 AM
ผมก็ซื้อมา ว่าจะลองใช้งานดู เพื่อนให้ทำกล่องดันรางให้ แต่มันยังวางอยู่ในกล่องไปรษณีย์จนบัดเดี๋ยวนี้ ได้ลองเมื่อไหร่แล้วจะกลับมาดูให้ครับ
ตอนนี้ผมทำกล่องดันรางใช้งานอยู่ กับ TRITON ครับและใช้งานได้ดี
แต่ก่อนหน้านี้ ผมใช้ IC LM324 ออกแบบแบ่งแรงดันใช้งานมาก่อน
การเริ่มตอนนั้น ทำให้กล่อง ECU เพี้ยนจนถึงวันนี้ แต่ก็ใช้งานได้ จะผิดปรกติตรงที่
เวลา สตาร์ทเครื่องแล้วถ้าไม่เบิ้ลเครื่องยนต์ มันจะดับและขึ้นระหัส สัญญาญแรงดันผิดปรกติ
แต่ถ้าเบิ้ล (แค่ครั้งเดียวตอนสตาร์ท)จะทำงานำได้ปรกติทุกอย่าง
อยากทราบว่า มันเกิดอะไรขึ้น สัญญาญ ก็ไม่ขาดหาย ถ้ากระแสไฟไม่พอจาก Sensor ไป ECU รถ
จะต้องปรับแต่งส่วนใหนเพิ่มเติม
ผมคิดว่า ความรู้ขนาด น้า Kiano ถ้าลองเล่นกับรถยนต์ น่าจะอนาคตสดใสนะครับ
เพราะกล่องแต่ละกล่องราคา 5000-10000 บาท (MCU ทั้งนั้น )
ราคากล่อง VR ก็ 1000 กว่าบาท ju_ju!!


หัวข้อ: Re: ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ
เริ่มหัวข้อโดย: yanyongs ที่ พฤษภาคม 07, 2012, 08:41:35 AM
ตอนนี้เขียนได้แล้วครับ
หลังจากที่ได้คำแนะนำจาก พี่ ๆ  ETT น่ารักมากครับ
เวลาที่ลูกค้าไปปรึกษานี่..  จะโทรเรียก ทีมส์งาน ENG ให้ทันทีเลยครับ
และก็ตอบคำถามแบบจริงจังจริงใจดีมากครับ ขอชื่นชมครับ
ไม่เหมือน ร้าน Elec โชว์ห่วย แถวหน้า ม.มหานคร ไปซื้อของที เหมือนเราเป็นขอทาน
ไม่ชอบอาชีพนี้ก็ไม่เลิกให้คนอื่นเขา มาขาย จะได้ช่วยพัฒนาสังคมประเทศชาติกันต่อไป
 help!!!
////////////
และนี่เป็นที่ผมใช้ทำดันราง และจูน แรงดันอากาศ MAP และ ปลดล็อค บู๊ช Turbo ใช้รถผมเองครับ
ไม่ได้ทำขายแต่ทำใช้เองครับผม
////////////////       PIC18F4620          ///////////////
  ////////////////   UPDATE 08-03-2012    /////////////
  /*                 LOAD TO TRITON               */
  ////////////////   UPDATE 15-03-2012    /////////////
  ////////////////   UPDATE 6-05-2012    /////////////
#include <built_in.h>
#define beep1 PORTC.F2    //BC548    BUZZER  5V
#define temp_relay PORTB.F1
/* **********         CHANGE MODE SW PORTB.F0         **********   */
unsigned long int vout1,vout2,vout3,vout4,rail_in, map_in,
rail_ref,map_ref,pedal1,pedal2,pedal3,pedal_in,pedal,pedal_ref;
char y=0,valible=0,i4=0,y1=0;
                              // MCP4922 Configuration Constants '
                //***********************************'
 const char rail_conf = 0x50; //Channel A Buffered x2Gain
 const char map_conf = 0xD0; //Channel B Buffered x2Gain
 const char pedal1_conf = 0x50; //Channel A Buffered x2Gain
 const char pedal2_conf = 0xD0; //Channel B Buffered x2Gain
 const char SHDN = 0x00; //Channel A & B Output = High Impedance

void DAC_OUT1(char config,int output)
{
//     PORTC.F0=0; // Enable Chip Select
     PORTC=0x02;
     SPI_Write(config+Hi(output));
     SPI_Write(Lo(output));
     PORTC=0x03;
}
void DAC_OUT2(char config,int output2)
{
     PORTC=0x01;
     SPI_Write(config+Hi(output2));
     SPI_Write(Lo(output2));
     PORTC=0x03;
}
void beep2()
{
beep1=1; delay_ms(10);beep1=0;delay_ms(90);
}
void beep3()
{
beep1=1; delay_ms(150);beep1=0;delay_ms(150);
}
void  rail_up()
{
{
if(rail_in<317){vout1=rail_ref-valible;}// < 1.55 V
else if((rail_in>=317)&&(rail_in<337)){vout1=rail_ref-(12+valible);}//1.613-1.657
else if((rail_in>=337)&&(rail_in<358)){vout1=rail_ref-(21+valible);}//1.687-1.75
else if((rail_in>=358)&&(rail_in<378)){vout1=rail_ref-(29+valible);}//1.8-1.89
else if((rail_in>=378)&&(rail_in<399)){vout1=rail_ref-(37+valible);}//1.995-2.029
else if((rail_in>=399)&&(rail_in<419)){vout1=rail_ref-(44+valible);}//2.102
else if((rail_in>=419)&&(rail_in<440)){vout1=rail_ref-(36+valible);}//2.102
else if((rail_in>=440)&&(rail_in<460)){vout1=rail_ref-(28+valible);}//2.102
else if((rail_in>=460)&&(rail_in<481)){vout1=rail_ref-(20+valible);}//2.102
else if((rail_in>=481)&&(rail_in<650)){vout1=rail_ref-(12+valible);}//2.102
else{vout1=rail_ref-(8+valible);}
}
}
void  map_up()
{
if(map_in>245&&map_in<333){vout2=(map_ref+40);}
else if(map_in>=333&&map_in<419){vout2=(map_ref+50);}
else if(map_in>=419&&map_in<505){vout2=(map_ref+60);}
else if(map_in>=505&&map_in<591){vout2=(map_ref+90);}//569
else if(map_in>=591&&map_in<677){vout2=(map_ref+100);}//640
else if(map_in>=677&&map_in<777){vout2=(map_ref+110);}//711
else{vout2=map_ref;}
}
void  pedal_up()
{
if(pedal_in>225&&pedal_in<286){vout3=(pedal_ref+30);}       //1.1-1.4 v
else if(pedal_in>=286&&pedal_in<368){vout3=(pedal_ref+50);} //1.4-1.8 v
else if(pedal_in>=368&&pedal_in<450){vout3=(pedal_ref+70);} //1.8-2.2 V
else if(pedal_in>=450&&pedal_in<532){vout3=(pedal_ref+90);} //2.2-2.6 V
else if(pedal_in>=532&&pedal_in<859){vout3=(pedal_ref+110);} //2.6-3.0 V
//else if(pedal_in>=613&&pedal_in<695){vout3=(pedal_ref+75);} //3.0-3.4 V
//else if(pedal_in>=695&&pedal_in<777){vout3=(pedal_ref+80);} //3.4-3.8 V
//else if(pedal_in>=777&&pedal_in<859){vout3=(pedal_ref+85);} //3.8-4.2 V
else if(pedal_in>=859){vout3=(pedal_ref+100);}               //4.2-5.0 V
else{vout3=pedal_ref;}
}
void input_sensor()
{
    if(PORTB.F0==0){i4++; beep3();delay_ms(250);}// NORMAL ON 4.5V
    if(i4>4){i4=0;}
    if(i4==1){vout1=rail_ref;}
    if(i4==2){valible=15;rail_up();}
    if(i4==3){valible=40;rail_up();}
    if(i4==4){valible=80;rail_up();}
    if(i4==0){valible=0;beep3();i4++;}
     rail_in=Adc_read(0);
     map_in=Adc_read(1);
     pedal_in=Adc_read(2);
     rail_ref=rail_in*2;
     map_ref=map_in*2;
     pedal_ref=pedal_in*2;
     map_up();
     pedal_up();
}
void dac_output()
{
  if(PORTC==0x01){vout1=(vout1+30);vout2=(vout1-10);}
  if(map_in>=777||vout2>1555){vout2=1555;}
  DAC_OUT1(rail_conf,vout1); // Output on channel A
  DAC_OUT1(map_conf,vout2); // Output on channel B
  delay_ms(150);
    vout4=vout3/2;
    if(vout4>=1022){vout4=1022;}
  DAC_OUT2(pedal1_conf,vout3); // Output on channel A
  DAC_OUT2(pedal2_conf,vout4); // Output on channel B
}
void counter_t()
{
     y++;
     if(y<25){pedal1=Adc_Read(2);}
     if(y==25){pedal2=Adc_Read(2);}
     if(y>25){y=0;}
     delay_ms(10);
}
void main()
{
     TRISA=0XFF;
     TRISC=0X00;
     TRISB=0X01;
     PORTB=0x00;
     Spi_Init();
     PORTC=0x03;
     DAC_OUT1(SHDN,0);
     DAC_OUT2(SHDN,0);
     beep3();beep2();beep3();
while(1)
{
    counter_t();
    input_sensor(); 
    dac_output();
}
}
/////  ถ้า Error ก็เพิ่มหรือลด }  เอานะครับเพราะผมตัดคำสั่งออกบางตัวตอนท้าย ๆ