เขียน Mikro กับ PIC16F877 สั่งงาน MCP4922 >> 2 ตัว ทำอย่างไรครับ
LSVคลังสมองออนไลน์ "ปีที่14"
พฤศจิกายน 24, 2024, 01:13:28 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
 
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: เขียน Mikro กับ PIC16F877 สั่งงาน MCP4922 >> 2 ตัว ทำอย่างไรครับ  (อ่าน 3813 ครั้ง)
yanyongs
member
*

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

กระทู้: 40


« เมื่อ: มกราคม 19, 2012, 02:06:44 pm »

ตามตัวอย่าง ต้องสั่ง เพิ่มเติมอย่างไรครับ เพื่อที่จะใช้งาน MCP4922 ตัวที่2 Sad
/////////////////////////////////
#include <built_in.h>
char i;
int vout;
//***********************************'
// MCP4922 Configuration Constants '
//***********************************'
const char A_B1_G1 = 0x70; //Channel A Buffered x1Gain
const char A_B1_G2 = 0x50; //Channel A Buffered x2Gain
const char A_B0_G1 = 0x30; //Channel A nonBuffered x1Gain
const char A_B0_G2 = 0x10; //Channel A nonBuffered x2Gain
const char B_B1_G1 = 0xF0; //Channel B Buffered x1Gain
const char B_B1_G2 = 0xD0; //Channel B Buffered x2Gain
const char B_B0_G1 = 0xB0; //Channel B nonBuffered x1Gain
const char B_B0_G2 = 0x90; //Channel B nonBuffered x2Gain
const char SHDN = 0x00; //Channel A & B Output = High Impedance
void DAC_OUT(char config,int output)
{
PORTC.F0=0; 
SPI_Write(config+Hi(output));
SPI_Write(Lo(output));
PORTC.F0=1;
}
void main()
{
PORTC=0x00;
TRISC.F0=0; 
Spi_Init();
PORTC.F0=1;
DAC_OUT(SHDN,0);
while(1)
{
vout=adc_read(0)*(20/100);
DAC_OUT(A_B0_G1,vout); // Output on channel A
DAC_OUT(B_B0_G1,vout); // Output on channel B
Delay_ms(100); }
}
}


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

yanyongs
member
*

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

กระทู้: 40


« ตอบ #1 เมื่อ: ตุลาคม 19, 2012, 07:33:40 am »

ได้แล้วครับ
ไม่มีใครตอบเลย
ดังนั้น ครั้นได้ดังหมาย เราก็เผยแพร่ได้เพราะเป็นสิทธิของเรา
เพื่อ การพัฒนา ของ สังคมเราครับ
pic16f877+MCP4922  2 ตัว
วงจร ออกแบบเองเด้อ  เพราะถ้าออกแบบไม่เป็น Code ข้างล่างจะไม่มีประโยชน์ครับ
ถ้าตอนที่ผมขอนะ  ได้มาแบบนี้ ต่อยอด  สบายครับ

 ////////////////   UPDATE 05-03-2012    /////////////                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   /1/2012   ///////////////
////////////////       PIC16F877A        ///////////////
  ////////////////   UPDATE 08-03-2012    /////////////
  /*                 LOAD TO TRITON               */
  ////////////////   UPDATE 15-03-2012    /////////////
  ////////////////   UPDATE 18-03-2012    /////////////
////     ONLY UP RAIL  AND MAP  NOT TO UP PEDAL  ////
#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
  ///****       Kick down control Rail & Map        ****///
        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<327)){vout1=rail_ref-(7+valible);}//1.55-1.613
else if((rail_in>=317)&&(rail_in<337)){vout1=rail_ref-(12+valible);}//1.613-1.657
//else if((rail_in>=337)&&(rail_in<348)){vout1=rail_ref-(17+valible);}//1.657-1.687
else if((rail_in>=337)&&(rail_in<358)){vout1=rail_ref-(21+valible);}//1.687-1.75
//else if((rail_in>=358)&&(rail_in<368)){vout1=rail_ref-(25+valible);}//1.75-1.8
else if((rail_in>=358)&&(rail_in<378)){vout1=rail_ref-(29+valible);}//1.8-1.89
//else if((rail_in>=378)&&(rail_in<389)){vout1=rail_ref-(33+valible);}//1.89-1.995
else if((rail_in>=378)&&(rail_in<399)){vout1=rail_ref-(37+valible);}//1.995-2.029
//else if((rail_in>=399)&&(rail_in<409)){vout1=rail_ref-(41+valible);}//2.029-2.102
else if((rail_in>=399)&&(rail_in<419)){vout1=rail_ref-(44+valible);}//2.102
//else if((rail_in>=419)&&(rail_in<429)){vout1=rail_ref-(40+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<450)){vout1=rail_ref-(32+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<470)){vout1=rail_ref-(24+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 if((rail_in>=481)&&(rail_in<800)){vout1=rail_ref-(6+valible);}//2.102
else{vout1=rail_ref-(2+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<777){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<859){vout3=(pedal_ref+100);} //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>3){i4=0;}
    if(i4==1){vout1=rail_ref;}
    if(i4==2){valible=50;rail_up();}
    if(i4==3){valible=120;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();
       {
    if(pedal2>pedal1+23)
           {
           loop3:
           temp_relay=1;
           y1++;
           i4=4;
           input_sensor();  dac_output();
           pedal3=Adc_Read(2);
           if(y1>60){beep2();y1=0;}
           else{beep1=0;}
           while(pedal3>=pedal2){goto loop3;}
           }
   else    {
           input_sensor();
           if(i4==1){ vout2=map_ref;temp_relay=0;} //only for safe petrol
           if(i4==2){ vout2=map_ref-125;temp_relay=0;} //only for safe petrol
           else{temp_relay=1;}
           dac_output();
           }
        }
}
}
บันทึกการเข้า
yanyongs
member
*

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

กระทู้: 40


« ตอบ #2 เมื่อ: ตุลาคม 19, 2012, 07:42:01 am »

มันคือ Program ที่ใช้ จูน แรงดันราง คอมมอนเรว  และ จูน คันเร่งไฟฟ้า ที่ใช้ในรถรุ่นใหม่ ๆ ครับ
แต่ต้องใช้กับ MCU ที่เร็ว ๆ หน่อยเพราะมันต้องคำนวนค่อนข้าง มากกกกก และตอบสนองเร็ว
ให้ทัน CPU 32 Bit ของรถยนต์ครับ THANK!!
Code ที่ให้เป็น แนวทางครับ แต่ใช้งานได้ชัว  ผ่านการทดลองมาแล้ว ไม่ไช่เขียนให้ เท่ห์ ๆ (ปัญญาอ่อน ) เท่านั้น
แต่ถ้าต้องการความละเอียดของสัญญาน ต้องเขียน Code มากขึ้น แค่ผมทำไม่ได้เนื่องจาก ใช้ Program Demo เลยทำได้เท่านี้ ping!
บันทึกการเข้า
หน้า: [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!