Tuesday, September 14, 2010

DC Motor



ส่วนของ วงจรไดร์ฟมอเตอร์ขับคอนโทลวาว์ล
อุปกรณ์ที่ไช้ในส่วนนี้ก็มี IC เบอร์ L293D : 1 ตัว ,Opto เบอร์ TLP521-1 : 3 ตัว นะครับ
เกริ่นนำ  Motor นั้นมีหลากหลายประเภท แต่ที่จะใช้ควบคุม valve เป็น DC motor หรือมอเตอร์ไฟกระแสตรง เช่น มอเตอร์รถแข่งทามิย่า รถกระป่อง ล้วนมีมอเตอร์ประเภทนี้
            ที่เราต้องศึกษาเกี่ยวกับมอเตอร์ในการควบคุม Valve คือวงจร ไดร์ฟมอเตอร์ เพื่อทำให้กระแสและแรงดันพอที่จะสามารถปรับทิศทางการหมุนของมอเตอร์ได้ตามต้องการ โดยการควบคุมจาก Microcontroller    แต่ถ้ามองตัวมอเตอร์ในเรื่องการเลือกใช้นะครับ ให้มองว่าเราต้องการอะไรจากมัน แรงบิด(Torque) หรือ ความเร็ว( Speed) ซึ่งทั้งสองอย่างจะแปรผกผันกันนะครับ  คือ แรงบิดมาก จะทำให้ ความเร็วต่ำ  ทีนี้เราสามารถเพิ่มหรือลดค่านี้ได้ด้วยการใช้ ชุดเฟืองทด หรือ Gearbox ครับ ( มอเตอร์ที่เราใช้เป็นแบบ Gearbox ขนาด 12V. ความเร็ว 20 รอบต่อนาที ) เวลาเราจะไปซื้อมอเตอร์เกียร์ จะมีค่าความเร็วรอบต่อนาทีบอกนะครับ เช่นที่เราไช้
20 rpm ( round per minute ) หรือ 20 รอบ ต่อ นาที ครับ

มาที่ส่วนขับมอเตอร์ หรือ DRIVER นะครับ

เราจะใช้IC เบอร์ L293D ขับมอเตอร์เพราะสะดวกกับการใช้งาน เราสามารถต่อขาของ IC Micro Controller เข้าที่ ขา IC L293D ได้เลย  โดยเราจะใช้อินพุทควบคุมการขับมอเตอร์ต่อเข้าที่ขา 1A, 2A ควบคุมเอาต์พุต 1Y และ 2Y  โดยที่ 1Y และ  2Y  ก็ต่อเข้ากับขั้วของมอเตอร์ได้เลย การควบคุมการทำงานของมอเตอร์ ให้ หมุนไปทางซ้าย หรือ หมุนไปทางขวา ทำได้โดยการป้อนอินพุตจาก Microcontroller เข้าไปที่ขา 1A และ 2A    โดย Microcontroller จะจ่าย แรงดัน 0 หรือ 5 โวลต์ เพื่อควบคุมการทำงานของ Opto isolate  แต่แรงดัน 5 โวลต์ไม่มากพอที่จะขับ มอเตอร์ไห้หมุนตามที่ต้องการได้ เราเลยต่อขา 4 ของ Opto isolate กับแหล่งจ่าย 12 V.เพื่อเปลี่ยนจากแรงดัน 5 V.ไห้เป็น 12 V. เมื่อ Microcontroller จ่าย 5 โวลต์ที่ขาหนึ่งจะทำไห้ LED ของ opto ก็จะสว่าง แล้วไป trick ให้แรงดัน12โวลต์ ไหลไปที่ขา 3 ทำไห้แรงดัน 12 V. ไปขับมอเตอร์ และอีกอย่างที่ต่อ Opto isolate เข้าไปก็เพื่อแยก Ground ของ มอเตอร์ กับ Ground ของ Microcontroller เพื่อป้องกันการกระซากกระแสของมอเตอร์
******  ขา 1 และขา 4 ของ opto ต่อกับ ตัวต้านทานขนาด 330 เพื่อจำกัดกระแสที่จะไหลเข้าสู่ opto ไม่ไห้สูงเกินไป เพื่อป้องกัน opto พัง โดยคำนวนกระแสจาก V = IR ,V = 12 , R = 330 กระแสที่ได้ก็จะเท่ากับ 36 mA ไม่ทำไห้ opto เสียหายได้ ขา 2 ของ poto ต่อกับ Ground ฝั่ง microcontroller ส่วนขา 4 ต่อกับ ขาของ L293D
หลังจาก คิดวงจรเสร็จ, ทดลองวาดในโปรแกรม, ทดลองต่อใน poto board  สำเสร็จทำงานได้ตามที่ต้องการ หลังจากนั้น ก็วาดลาย PCB
หลังจากวาดลาย PCB ก็ทำการกัดแผ่นปริ้น แล้วก็บัดกรีใส่ IC เข้าไปในบอร์ด หลังจากนั้นก็รอต่อกับ ส่วนอื่นๆ


Level Sensor

อุปกรณ์ส่วนของ Level sensor



R1  คือตัวต้านทานแบบปรับค่าได้ขนาด 20 k ( ปรับค่าไห้อยู่ที่ 17.5 k )
R2  คือตัวต้านทานแบบปรับค่าได้ขนาด 10 k ( R2 นี้เป็นตัวต้านทานแบบปรับค่าได้ชนิด Slide bar , เราจะใช้ ความต้านทานตัวนี้เป็นตัว sensor วัดระดับน้ำ)
R3  คือตัวต้านทานแบบปรับค่าได้ขนาด 5 k ( ปรับค่าไห้อยู่ที่ 2.5 k )
R4, R5, R6, R7  คือตัวต้านทานขนาด 100 k ,1/4W
R8  คือตัวต้านทานขนาด 250 ,1/4W
U1, U2  คือ IC OP-AMP เบอร์ LM741 


หลักการทำงานของ level sensor



 
ส่วนที่ 1 เป็นส่วนที่เราใช้เป็น sensor ในการวัดระดับน้ำ หลักการของส่วนนี้ก็คือการใช้ตัวต้านทางมาแบ่งแรงดัน โดยเราจะให้ R2 เป็นตัวหลักที่จะเปลี่ยนค่าไปตามระดับความสูงของน้ำโดย output ของส่วนนี้จะอยู่ที่ 1-5 V โดยสามารถคำนวณ ความต้านทานที่ใช้ได้ดังนี้

จาก Output ที่เราต้องการทำไห้เรารู้แรงดันตกคร่อม R2 = 4V.
นอกจากนั้นยังทำไห้เรารู้แรงดันตกคร่อม R3 อีกด้วย เพราะเมื่อ R2 เท่ากับ 0 แรงดันที่ออกจาก R2 ก็จะเท่ากับ 1 V. R3 เลยมีแรงดันตกคร่อมเท่ากับ 1 V. เมื่อเรารู้แรงดันตกคร่อม R2, R3 เราสามารถหาแรงดันตกคร่อม R1 ได้จาก 12V - 1V - 4V  = R1      R1 = 7V.

 
เมื่อเรารู้แรงดันตกคร่อม R1, R2, R3 แล้วเราก็จะสามารถหาความต้านทานของ R1, R2, R3 ได้โดยเรารู้ค่าของ R2 อยู่แล้วว่ามีค่าเท่ากับ 10 k เราก็เอาแรงดันตกคร่อม R2 มาหาร
10 k  จาก I = V/Rเพื่อหากระแสม,ได้ 4/10000 = 0.4 mA. จากนั้นเราก็จะรู้ว่า ความต้านทาน 1 = 0.4 mA.เมื่อเรารู้กระแสรู้แรงดันเราก็สามารถหาความต้านทานได้   แรงดันคร่อมR1เท่ากับ 7 V. ก็จะได้ความต้านทานเท่ากับ 7V / 0.4mA = R1, R1 = 17.5 k  แรงดันคร่อม R3 เท่ากับ 1 V. ก็จะได้ความต้านทานเท่ากับ 1V / 0.4mA = R3, R3 = 2.5 k

ส่วนที่ 2 เป็นส่วนของจงจร Buffer โดยมีอัตราการขยาย 1 เท่า ในส่วนนี้มีไว้เพื่อป้องกันการเกิด loading effect


ส่วนที่ 3 เป็นส่วนของวงจรเปลี่ยนแรงดันเป็นกระแสไฟฟ้าแบบโหลดต่อกราวด์  วงจรขยายความแตกต่างจะใช้ในวงจรแบบโหลดต่อกราวด์เพื่อจ่ายกระแสไฟฟ้าไห้โหลด ตัวต้านทาน R4, R5, R6 และ R7 จะมีค่าเท่ากัน จะทำไห้อัตราการขยายเท่ากับ 1 ตัวต้านทาน R8 ต่อระหว่างเอาต์พุตกับโหลด ส่วน R7 จะไม่ต่อลงกราวด์แต่จะต่อด้านบนของโหลด
               
                                                             ILRs  = ein – e1
                                                ที่ ein = 1 V. IL = 4 mA.
                                                       ( 4 mA )Rs = 1V – e1      ************(1)
                                                ที่ ein = 5 V. IL = 20 mA

                                                      ( 20 mA )Rs = 5V – e2   *************(2)
                แทนสมการ 1 : ( 4 mA )Rs = 1V – e1     ในสมการ 2 : ( 20 mA )Rs = 5V – e2  
                                                ( 20 mA )Rs    =    4V + ( 4 mA )Rs
                                                ( 16 mA )Rs    =    4V
                                                Rs =  = 250

                        คำนวณหาค่า RL ที่จะทำไห้ OP – AMP ทำงานถึงจุดอิ่มตัว
 VSAT = 13V.
                                                                                               RL < 
                                                RL <
                                                RL <  350

Control System & Instrumentation Engineering



  
        website นี้ได้จัดทำขึ้นเนื่องด้วยเป็นส่วนหนึ่งในวิชา Instrumentation and Control system Praticeของนักศึกษาชั้นปีที่ 3 ภาควิชาระบบควบคุมและเครื่องมือวัด คณะวิศวกรรมศาสตร์,มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าธนบุุรี และหวังว่าจะเป็นข้อมูลส่วนหนึ่งให้ผู้ที่สนใจได้ศึกษาเพิ่มเติมไม่มากก็น้อย

  ขอบคุณที่มาเยี่ยมชมครับ

Mechanic

Machanic

การออกแบบโครงสร้างในการทำงานต้องคำนึงถึงหลายๆอย่างและความเหมาะสมสมเหตุสมผลต่องานต่อแต่ชิ้น โดยกระบวนการนี้ได้มีการออกแบบดังภาพข้างล่าง (โดยโปรแกรม Autocad )





อุปกรณ์
1. แผ่นอะคลิลิก
2. coppling (ข้อต่อ)  2 ชิ้น
3. ท่อยาง ขนาด 1/4 นิ้ว
4. ขวดสำหรับใส่น้ำขนาด 1.5 ลิตร 2 ขวด และ ขวด 0.5 ลิตร 1 ขวด
5. วาล์วทองเหลือง 2 ชิ้น
6. น็อต
7. ประแจ 6 เหลี่ยม
8. สว่านเจาะและสว่านตัด + ดอกสว่าน
9. เลื่อย

วัสดุที่ใช้ทำตัวโต๊ะคือ แผ่นอะคลิลิก เนื่องจากเป็นกระบวนการของเครื่องผสมน้ำ เราจึงหลีกเลี่ยงการใช้เหล็กเพื่อไม่ให้เกิดสนิมและเหล็กมีน้ำหนักมากเกินไปไม่สะดวกในการเคลื่อนย้าย แผ่นอะคลิิลิกที่ใช้มีความหนาประมาณ 0.7cm. ซึ่งมีความแข็งแรงเพียงพอในการใช้งาน ส่วนบนของโต๊ะจะมีขวดน้ำขนาด 1.5 ลิตรวางอยู่ ซึ่งมีน้ำอุณหภูมิปกติ และน้ำผสมน้ำแข็งอยู่อย่างละขวดดังตามโจทย์กำหนด

Power Supply


ในการทำpower supply เพื่อแปลงแรงดัน 220VAC เพื่อแปลงเป็นแรงดัน 5VDC โดยใช้ ICเบอร์ 7805 เพื่อเลี้ยงวงจรของ microcontroller, เลี้ยงวงจรขับstepping motor และ วงจรของalarm  , 12VDC โดยใช้ ICเบอร์7812 เพื่อขับstepping motor และ DC motor และ -12V โดยใช้ ICเบอร์ 7912เพื่อเลี้ยงวงจรthermocouple sensor และ level sensor
ในการทำวงจร power supplyนั้นเราต้องคำนึงกระแสที่ต้องเลี้ยงวงจร ดังนั้นเราจึงต้องพิจารณาว่าtransformer ที่เราเลือกนั้น กระแสพอหรือเปล่า เราจึงต้องมาพิจารณาว่าวงจรอะไรต้องการกระแสเท่าไหร่ เช่น DC motor ต้องใช้กระแสในการdrive 200mA , stepping motor ต้องใช้กระแสในการdrive 1.5A และ วงจรmicrocontroller แต่ละตัวต้องใช้กระแส 300mA ดังนั้นเราจึงสรุปได้ว่าควรใช้transformerขนาด 3A 

อุปกรณ์
1.       MC 7805
2.       MC 7812
3.       MC 7912
4.       Transformer 220V 3A
5.       Bridge rectifier
6.       Capacitor  3300uF 25V
7.       Capacitor 10uF 25V
8.       Terminal
9.       Heat sink



ในส่วนPCBของวงจรpower supply

เอกสารเพิ่มเติม

Datasheet

http://www.mediafire.com/file/p0133b9g8gcwu7b/DC.c
http://www.mediafire.com/file/6okcti1bc2ix5bf/PIC18F2520.pdf
http://www.mediafire.com/file/1cex6atc977gb58/MC7812.pdf
http://www.mediafire.com/file/1cex6atc977gb58/MC7812.pdf



Stepping Motor


Stepping Motor

มีหลักการทำงานโดย รับ pulse จาก microcontroller ในแต่ละ input ซึ่ง input ของ stepping motor นั้นมี4input  โดยstepping motor รับ pulse จากmicrocontroller  1pulse ทำให้ stepping motor หมุนไป1.8°  

ในการทำcontrol valve  ทำได้โดย นำแกนของstepping motorนำไปcoupling เข้ากับ valve   โดยvalveนั้นสามารถหมุนได้90° ดังนั้นเราจึงกำหนดให้microcontrollerจ่ายpulseให้กับstepping motor ทั้งหมด 50 pulses และ กำหนดจุดเริ่มต้นให้กับmicrocontroller โดยการใช้ limit switch เป็นตัวกำหนดการเริ่มต้นเปิดvalveและ ปิดvalve โดยตั้งห่างกัน 90°  stepping motor รับคำสั่งจากmicrocontrollerจ่ายpulseในการเปิดvalveจำนวน 50pulses และ microcontrollerจ่ายpulseในการปิดvalveจำนวน 50pulse
จากนั้นเราต่อวงจรตามรูป

 
อุปกรณ์
1.       Capacitor 470uF
2.       Resistor  330Ω 1/4w 25V
3.       Resistor  0.5Ω  5w
4.       Terminal
5.       SIP connector  สำหรับต่อกับmicrocontroller และ ต่อเข้ากับ stepping motor
6.       Heat sink

ในส่วนของPCBของวงจร drive stepping motor โดยใช้L298 เป็นตัวdrive stepping motor


Microcontroller III

                                เอกสารประกอบและวงจรของไมโครคอนโทรลเลอร์


 

Master

 

                                                             SLAVE


                                                             MOTOR


Datasheet Microcontroller


http://www.mediafire.com/file/6okcti1bc2ix5bf/PIC18F2520.pdf

Example Program controller

http://www.mediafire.com/?6okcti1bc2ix5bf

http://www.mediafire.com/file/wovbaq5kvykyg91/S1.c

http://www.mediafire.com/?qu8fi7e5i4v7hfg

Microcontroller II


โปรแกรมรอง จะเป็นโปรแกรมที่ทำการอ่านค่าของระดับน้ำและ อุณหภูมิและ แสดงค่าออกทางส่วนแสดงผล
การอ่านค่าจากเซนเซอร์นั้นมีการกำหนดให้อ่านค่าทุกๆ 200 ms ดังนั้นจึงต้องมีการเขียน Software timer เพื่อนำมาใช้งาน
           
                Software timer เป็นการเขียนโปรแกรมขึ้นมาเพื่อทำการจำลองการทำงานของ hardware timer ซึ่งมีจำนวนจำกัด การเขียน software timer นั้นจะต้องสร้างฐานเวลาขึ้นมาให้มีการinterrupt ทุกๆ 1 หน่วยเวลาที่คงที่ จากนั้นให้มีการนับจนถึงค่าที่ตั้งไว้แล้วให้ ตัวแปรมีค่าเพิ่มขึ้นเพื่อ ใช้เช็คว่านับถึงค่าแล้วสำหรับเป็นเงื่อนไขในการเข้าไปทำงาน
Software timer code

                struct softwaretimerstruct
{
   int TmrEn;
   int16 TmrCnt;
   int16 TmrInt;
   int TmrRdy;
   int TmrErr;
   int TmrMod;
};
struct softwaretimerstruct stmr[6];  
void softwaretimer()
{
   int n;
   for(n=0;n<6;n++)
   {
      if(stmr[n].TmrEn==1)
      {
         stmr[n].TmrCnt--;
         if(stmr[n].TmrCnt==0)
         {
            if(stmr[n].TmrRdy==0)
            {
               stmr[n].TmrErr=1;
            }
            stmr[n].TmrRdy++;
            stmr[n].TmrCnt=stmr[n].TmrInt;
            if(stmr[n].TmrErr==0)
            {
               stmr[n].TmrEn=0;
            }
         }
       }
   }
}


การจะอ่านค่าจากเซนเซอร์นั้นจะต้องใช้งานฟังก์ชั่น Analog to Digital CCS C complier นั้นมี built in function สำหรับใช้งานอยู่แล้ว
                setup_adc_ports();        เป็นฟังก์ชั่นที่ใช้ในการตั้งค่าว่าจะให้ port ไหนบ้างทำหน้าที่เป็น ADC port และ ใช้อะไรเป็น voltage reference
            setup_adc();                เป็นฟังก์ชั่นที่ใช้ในการตั้งค่า ADC clock
            set_ADC_channel();    ใช้ในการเลือกช่องที่ใช้ในการทำงานเป็น ADC ณ ขณะนั้น
                Read_ADC()                ใช้ในการอ่านค่าของ ADC แล้วนำค่าไปเก็บไว้ที่ตัวแปร



การสื่อสารระหว่าง โปรแกรมหลัก และ โปรแกรมรอง นั้นจะใช้ I2C Bus ใน CCS C complier นั้น มี built in function อยู่แล้วโดยฟังก์ชั่นในการใช้งาน
                ในโปรแกรมหลัก จะ ใช้คำสั่ง
                I2C_Start ();                ใช้เพื่อเริ่มการสื่อสารของ I2C Bus
            I2C_Stop ();                ใช้เพื่อหยุดการสื่อสารของ I2C Bus
            i2c_write ();                 ใช้เพื่อส่งค่าไปยังMCU ตัวอื่นๆบนบัสสื่อสาร
                i2c_read ();                  ใช้เพื่อรับค่าจาก MCU ตัวอื่นๆบนบัสสื่อสาร

ในโปรแกรมหลักนั้นจะต้องมีการประกาศให้เป็น Master on bus และ ตั้งค่าขา SDA และSCL ด้วยคำสั่ง
#use i2c(master, scl = ,sda =)

            ในโปรแกรมรองจะใช้คำสั่ง
                i2c_write ();                 ใช้เพื่อส่งค่าไปยังMCU ตัวอื่นๆบนบัสสื่อสาร
                i2c_read ();                  ใช้เพื่อรับค่าจาก MCU ตัวอื่นๆบนบัสสื่อสาร
                i2c_isr_state ();         ใช้เพื่อตรวจสอบว่า โปรแกรมหลักต้องการ ส่งค่ามาให้หรือ ต้องการให้ส่งค่ากลับไป
ในโปรแกรมรองนั้นจะต้องมีการประกาศให้เป็น  Slave on bus และ ตั้งค่า address ,ขา SDA และSCL ด้วยคำสั่ง
#use i2c(slave,scl = ,sda = ,address = )                                                           

การเขียนโปรแกรมนั้นจะต้องเขียนไว้ ใน ssp interrupt เนื่องจากว่า โปรแกรมรองนั้น ไม่สามารถที่จะส่งหรือรับค่าอย่างอิสระบน บัสได้ต้องให้ โปรแกรมหลักนั้นส่งคำสั่งมาแล้วเกิดการ interrupt ขึ้นแล้วทำการรับหรือส่งค่ากลับไป
เช่น
#int_ssp
void ssp_interrupt()
{
   BYTE incoming, state,n=0;
   state = i2c_isr_state();
   if(state < 0x80)     // Master is sending data
   {
      if(state==0)
      {
        incoming = i2c_read();
      }
   }
  if(state==0x80)
   {
      if(n==0)
      {
         i2c_write(wlv.wlv8[0]);
         n=1;
      }
      if(n==1)
      {
         i2c_write(wlv.wlv8[1]);
         n=2;
      }
      if(n==2)
      {
         i2c_write(tmp.tmp8[0]);
         n=3;
      }
      if(n==3)
      {
         i2c_write(tmp.tmp8[1]);
         n=0;
      }
   }
}
                การสื่อสารบน I2C นั้นจะสามารถส่งค่าได้เพียงครั้งละ 1 Byte ดังนั้นหากเราต้องการให้ส่ง รับข้อมูลที่มีขนาดใหญ่เกินกว่า 1 Byte เราจำเป็นต้องใช้การประกาศให้เป็นตัวแปร แบบ union ก็จะสามารถทำให้ส่งรับค่าได้เพราะการประกาศตัวแปรแบบ union นั้นจะทำให้ตัวแปรสองตัวเก็บค่าไว้ที่หน่วยความจำตำแหน่งเดียวกัน
union waterlevel
{
     int16 wlv16;
     int   wlv8[2];
};
union waterlevel wlv;  


โปรแกรมที่ใช้ควบคุม DC motor
            โปรแกรมจะรับค่า 1-5 V จากโปรแกรมหลักแล้วทำการหมุน มอเตอร์ ให้ได้ตำแหน่งโดยตรวจสอบจาก สัญญาณที่ป้อนกลับเข้ามา

Microcontroller



Microcontroller

ใช้ไมโครคอนโทรลเลอร์ของบริษัท Microchip รุ่น PIC18F4520
โปรแกรมที่ใช้ในการพัฒนา โปรแกรมไมโครคอนโทรลเลอร์
โปรแกรม Proteus ในการจำลองการทำงานของไมโครคอนโทรเลอร์
โปรแกรม CCS C complier ในการเขียน source code ของโปรแกรม
โปรแกรม MPLAB IDE ใช้เพื่อทำการ debug source code ของโปรแกรม
           
       การทำงานของโปรแกรมจะประกอบด้วยสามส่วนคือ โปรแกรมหลักโปรแกรมรอง และโปรแกรมที่ใช้ในการควบคุม DC Motor
      ส่วนที่เป็นโปรแกรมหลักนั้นจะทำงานเป็นขั้นตอนไปเรื่อยๆ โดยเริ่มจาก ส่งค่าให้โปรแกรมควบคุมDC motor เติมน้ำให้ได้ 3 cm เมื่อได้ระดับแล้วจะสั่งปิด Control valve แล้วแสดงไฟสิ้นสุดการทำงาน
หลังจากมีการกดปุ่มแล้วจะสั่งให้Control valve เพื่อเพิ่มน้ำอีก 1 Cm เมื่อได้ระดับแล้วสั่งปิด Control valve แสดงไฟสิ้นสุดการทำงานแล้ว รอให้มีการกดปุ่มเพื่อทำงานขั้นต่อไป
 
เมื่อน้ำได้ระดับ 4 cm แล้ว ทำการตั้งค่าอุณหภูมิโดยใช้การกดสวิตช์เมื่อกด
สวิตช์ 1 จะทำการเพิ่มค่าขึ้น 1
สวิตช์ 2 จะทำการเพิ่มค่าขึ้น 10
สวิตช์ 3 จะทำการเพิ่มค่าขึ้น 100
สวิตช์ 4 จะทำการเคลียร์ค่าให้เป็น 0

 ทำการอ่านค่าอุณหภูมิจาก โปรแกรมรอง ผ่าน I2C Bus แล้วทำการเปิด ปิด Control valve ทั้งสองข้างเพื่อปรับอุณหภูมิใน Tank 1