ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ
LSVคลังสมองออนไลน์ "ปีที่14"
พฤศจิกายน 25, 2024, 05:53:52 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
 
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ใช้ PIC16f877 สั่ง งาน DAC MPC4922 2 ตัว น้า Kiano ช่วยดูให้หน่อยครับ  (อ่าน 6411 ครั้ง)
yanyongs
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 40


« เมื่อ: มกราคม 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;
}
}


บันทึกการเข้า

yanyongs
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 40


« ตอบ #1 เมื่อ: กุมภาพันธ์ 17, 2012, 08:45:31 am »

เข้ามานั่งรอครับบบบ lv!
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #2 เมื่อ: กุมภาพันธ์ 17, 2012, 07:21:16 pm »

ผมก็ซื้อมา ว่าจะลองใช้งานดู เพื่อนให้ทำกล่องดันรางให้ แต่มันยังวางอยู่ในกล่องไปรษณีย์จนบัดเดี๋ยวนี้ ได้ลองเมื่อไหร่แล้วจะกลับมาดูให้ครับ
บันทึกการเข้า
yanyongs
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 40


« ตอบ #3 เมื่อ: มีนาคม 06, 2012, 09:10:41 am »

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

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 40


« ตอบ #4 เมื่อ: พฤษภาคม 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 ก็เพิ่มหรือลด }  เอานะครับเพราะผมตัดคำสั่งออกบางตัวตอนท้าย ๆ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1 RC2 | SMF © 2001-2006, Lewis Media

lsv2555Please follow the new website at https://www.pohchae.com

Valid CSS!