หัวข้อ: ใช้ 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 ก็เพิ่มหรือลด } เอานะครับเพราะผมตัดคำสั่งออกบางตัวตอนท้าย ๆ |