Home Parallel Port Serial Port USB Webboard API I/O Today Project Directory .NET VB VC++


 

โครงงาน พื้นฐานการควบคุมสเต็ปมอเตอร์ด้วย PC

 
บทนำ

    เนื่องจากเวปไซด์ไทยไอโอมุ่งเน้นในเรื่องการเขียนโปรแกรมควบคุมการทำงานกับพอร์ตคอมพิวเตอร์ แต่ยังไม่ได้ทำเป็นโครงงานเพื่อให้เข้าถึงจุดหมายของการเรียนรู้ด้านการใช้คอมพิวเตอร์ติดต่อฮาร์ดแวร์ จึงเป็นที่มาของโครงงานแรก ที่ง่ายๆไม่ยากครับ พื้นฐานการควบคุมสเต็ปมอเตอร์ โดยใช้สเต็ปมอเตอร์  2 เฟส ดังรูปที่1 และใช้วงจร สวิทช์ด้วยโซลิสสเตทรีเลย์กับทรานซิสเตอร์เป็น ชุดไดรเวอร์โดยมีแหล่ง จ่ายไฟกระแสตรง 9.6 V กระแส 0.4 A  โดยผมนำรูปเพื่อความเข้าใจ รูปที่2

    จากที่เคยได้นำเสนอหลักการทำงานของ Step Motor (คลิกเพื่อดูทบทวน)  มาแล้วนั้นเพื่อให้เห็น ภาพยิ่งขึ้นประกอบกับพื้นฐานการเขียนโปรแกรมติดต่อพอร์ตที่ได้นำเสนอมาแล้ว เราจึงเลือกโครงงานนี้ อีกทั้งอุปกรณ์ก็หาซื้อง่าย ในโครงงานนี้ไม่จำเป็นต้องใช้ Card I/O 8255 ตามที่เราทดลองก็ได้ มาไปใช้ Printer Port แทนก็ใช้งานได้เหมือนกัน

 

รูปที่1 แสดงเนมเพจของสเต็ปมอเตอร์

รูปที่ 2 แสดงภาพโดยรวมของ PC Interface Hardware

จากรูปที่3 และ รูปที่ 4 เราได้นำสายสัญญาณ Input/Output ของCard I/O 8255 โดยใช้สายแพรและไปเข้าที่ Input ของวงจรทรานซิเตอร์ไดร์เวอร์ เพื่อจะนำสัญญาณไปทริกขาของ โซลิสเตทรีเลย์ให้ทำงานจากนั้นโซลิสเตท จึงจะจ่ายกระแสไปทริกขาของทราน ซิสเตอร์อีกที ที่ต้องทำเช่นนี้เพราะว่า ขดลวดของสเต็ปมอเตอร์จะสร้าง สัญญาณรบกวนกับมาที่วงจรและอาจส่ง ผลต่อพอร์ตของ PC ที่ทำวิธีนี้เรียกว่า การแยกกราวด์ของวงจรนั้นเอง จากนั้นเรานำจุดต่อของขาทรานซิสเตอร์ที่จะคอยสวิทช์และจ่ายไฟ 9.6 V 0.4 A ของแหล่งจาก ไปให้กับขั้วของสเต็ปมอเตอร์ในแต่ละขั้วซึ่งจะทำงานเรียงตามลำดับหรือในที่นี้เราเขียนโดยใช้ หลักการแบบเวฟซึ่งก็เขียนโปรแกรมสั่งใช้ Parallel Port สั่งค่าออกไปที่พอร์ตตั้งแต่ บิต 1 - 4 จะใช้เรียงจาก4บิตล่างหรือ 4บิตก็ได้ทั้งนี้ขึ้นอยู่ที่เราเขียนโปรแกรมควบคุมนั้นเอง

รูปที่ 3 แสดงการต่อสายเข้ากับสเต็ปมอเตอร์

รูปที่ 4 แสดงตำแหน่งของการต่อสายในส่วนต่างๆ

รูปที่ 5 การจัดวางอุปกรณ์

จากรูปที่ 5 เราสามารถสรุป จากตำแหน่งของอุปกรณ์,ชื่อ,หน้าที่,จำนวนที่ใช้ เป็นตารางได้ดังนี้

หมายเลข ชื่ออุปกรณ์ หน้าที่ จำนวน
1 โซลิสสเตทรีเลย์ 4N28K616 สวิทช์โดยรับสัญญาณมาจากพอร์ต ของ Card 8255 4 บิต 4
2 ไอซีเรกกูเล็ท 7812  จำกัดขนาดของแรงดันที่ใช้ในวงจร เพื่อจะใช้กับสเต็ปมอเตอร์ 1
3 บิทเรทติไฟท์ แปลงไฟฟ้ากระแสสลับไปเป็นกระแสตรง 1
4 เทอร์มินัลของหม้อแปลง รับไฟกระแสสลับ 9-12 V. เพื่อเข้าวงจร 2
5 หลอดไฟ LED  สำหรับแสดงผลการทำงานของไฟที่จ่ายไปให้ขั้วของสเต็ปมอเตอร์ 4
6 ทรานซิสเตอร์ E3055T705 เป็นเสมือนสวิทช์คอยจ่ายไฟให้ที่ขั้วขอลวดของมอเตอร์ 4
7 เทอร์มินัลของขั้วบวกแหล่งจ่ายไฟ จ่ายไฟให้กับขดลวดของสเต็ปมอเตอร์ 4
8 เทอร์มินัลของกราวด์แหล่งจ่ายไฟ เป็นจุดกราวด์ของแหล่งจ่ายไฟให้กับขดลวดของสเต็ปมอเตอร์ 1
9 ทรานซิสเตอร์ 2N3904 คอยทรกขาสัญญาณของ ทรานซิสเตอร์ E3055T705 ให้ทำงาน 4
10 เทอร์มินัลของกราวด์ด้าน Input เป็นจุดกราวด์ของสัญญาณ Input ที่มาจากพอร์ต Crad I/O 8255 1
11 เทอร์มินัลของขั้วบวกด้าน Input เป็นจุดขั้วบวกของสัญญาณ Input ที่มาจากพอร์ต Crad I/O 8255 4
12 ทรานซิสเตอร์ 1 k โอท์ม เป็นค่าความต้านทานที่ต่อเข้ากับขา B ของ ทรานซิสเตอร์ 2N3904 4
13 ไดโอด ป้องกันการกลับทิศทางของกระแส 1

 

ส่วนด้านหลังของแผงวงจรสามารถดูได้จากรูปที่ 6 ซึ่งแสดงลายวงจรการต่อของอุปกรณ์ โดยจริงๆแล้ว มาจากวงจรพื้นฐานที่เคยกล่าวมาแล้ว คลิกเพื่อทบทวนของวงจรทรานซิสเตอร์สวิทช์ โดยนำมาต่อร่วมกัน 4 ชุด ผนวกเข้ากับแหล่งจ่ายไฟ

รูปที่ 6 ลายวงจรด้านหลังแผนวงจรไดร์เวอร์สเต็ปมอเตอร์

เราใช้ซอฟแวร์ MS Visual Basic 6 ในการเขียนโปรแกรม ควบคุมการทำงานของสเต็ปมอเตอร์ โดยหน้าที่ของโปรแกรมจะคอยส่งค่าให้พอร์ตส่งสัญญาณไฟ 5 V. ไปควบคุมการทริกของ ขาโซลิสสเตท โดยเราเขียนโปแกรมให้มีฟังก์ชั่นการทำงานดังนี้

- ให้สเต็ปมอเตอร์หมุนทางซ้าย

- ให้สเต็ปมอเตอร์หมุนทางขวา

- ให้สเต็ปมอเตอร์หมุนตามจำนวนสเต็ปที่เราใส่ค่ากำหนด

- ให้สเต็ปมอเตอร์หมุนแบบต่อเนื่องจนกว่าจะกดปุ่ม"หยุดหมุน"

- สามารถกำหนดความเร็วในการหมุนให้สเต็ปมอเตอร์

ในโปแกรมนี้เรายกตัวอย่างมาใหเดูกันแค่นี้ ทั้งนี้คุณสามารถจะเพิ่มเติมฟังก์การทำงานอื่นๆได้อีก ที่สำคัญทำเป็นฟังก์ชั่น เราได้นำซอร์ดโค๊ดมาให้ดูอยู่ด้านล่าง

 

โค๊ดโปรแกรมทั้งหมดครับ ใช้พื้นฐานการเขียนโปรแกรมVisual Basic

 

Dim ValExit As Boolean ' ตัวแปรสำหรับหยุดการหมุนของมอเตอร์
Dim valStep, BitStep, valCount As Long
' ตัวแปรของค่าสเต็ป,ส่งไปควบคุมบิต,นับจำนวนสเต็ป
Dim valSpeed As Single
' หน่วงเวลาการแต่ละสเต็ป
Dim PortAddress As Long
' กำหนดตำแหน่งพอร์ตที่เราใช้ต่อควบคุมสเต๊ปมอเตอร์

Private Sub Combo1_Click()
   Select Case Combo1.Text
      Case Is = "Print Port": PortAddress = &H378
' กำหนดค่าของตำแหน่งพอร์ต Printer
      Case Is = "I/O 8255 Port A": PortAddress = &H300
' กำหนดค่าของตำแหน่งพอร์ต A I/O 8255
      Case Is = "I/O 8255 Port B": PortAddress = &H301
' กำหนดค่าของตำแหน่งพอร์ต B I/O 8255
      Case Is = "I/O 8255 Port C": PortAddress = &H302
' กำหนดค่าของตำแหน่งพอร์ต C I/O 8255
   End Select
End Sub

Private Sub Command1_Click()
' เมื่อมีการกดปุ่มให้มอเตอร์หมุนซ้าย
ValExit = False
valSpeed = Val(Text1.Text)
'กำหนดความเร็วในแต่ละสเต็ป
valStep = Val(Text2.Text)
' กำหนดจำนวนสเต็ป
valCount = 0
    If Option1.Value = True Then
' ถ้าเลือกการหมุนแบบตามจำนวนสเต็ปที่กำหนด
         BitStep = 1
         Do
                  DoEvents
' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
                  valCount = valCount + 1
' นับจำนวนสแต็ป
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวดเริ่มต้นที่บิตแรก
                  Out PortAddress, BitStep
                  DelayTime (valSpeed)
'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
                  BitStep = BitStep + BitStep
' เพิ่มค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
                  If BitStep > 8 Then BitStep = 1
' เมื่อถึงบิตที่ 4 ให้รีเซทค่าไปที่บิต 1 ใหม่
                  Label1.Caption = valCount
' แสดงค่าจำนวนสเต็ปที่ Label 1
         Loop Until valCount = valStep ' จบการทำงานเมื่อค่านี้เท่ากับค่าจำนวนสเต็ปที่ตั้งไว้

    End If
    If Option2.Value = True Then
' ถ้าเลือกการหมุนแบบสเต็ปต่อเนื่อง
         BitStep = 1
         Do
                  DoEvents
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวด
                  Out PortAddress, BitStep
                  Call DelayTime(valSpeed)
'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
                  BitStep = BitStep + BitStep
' เพิ่มค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
                  If BitStep > 8 Then: BitStep = 1
' เมื่อถึงบิตที่ 4 ให้รีเซทค่าไปที่บิต 1 ใหม่
                  Label1.Caption = valCount
' แสดงค่าจำนวนสเต็ปที่ Label 1
         Loop Until ValExit = True 'จบการทำงานเมื่อกดปุ่มหยุดหมุนโดยจะรับค่า ValExit=True
    End If
End Sub


Private Sub Command2_Click()
         ValExit = True
'สั่งให้มอเตอร์หยุดหมุนโดยจะส่งค่า ValExit=True
End Sub

Public Sub DelayTime(DelayTime) ' รูทีนการหน่วงเวลาหน่วยวินาที
Dim LoopTime As Long
'กำหนดจำนวนรอบเวลา
Const SecInDay = 86400
' จำนวนวินาทีใน1วัน
LoopTime = Timer + DelayTime
'กำหนดจำนวนรอบเวลาบวกกับค่าที่เราต้องการตั้ง
     If LoopTime > SecInDay Then
' เมื่อไรที่ค่าจำนวนรอบเวลายังน้อยกว่าจำนวนวินาทีใน1วัน
         LoopTime = LoopTime - SecInDay
'ให้นำจำนวนวินาทีใน1วันลบค่าจำนวนรอบเวลา
         Do While Timer > LoopTime
' เมื่อไรที่ค่าเวลาของเครื่องยังมากกว่าค่าจำนวนรอบเวลา
                  DoEvents
' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
         Loop
' กลับไปตรวจสอบเงื่อนไขใหม่
     End If
         Do While Timer < LoopTime
' เมื่อไรที่ค่าเวลาของเครื่องยังน้อยกว่าค่าจำนวนรอบเวลา
                  DoEvents
' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
         Loop
' กลับไปตรวจสอบเงื่อนไขใหม่ ถ้าตรงเงื่อนไขก็เป็นอันว่าจบการตั้งเวลาออกจากรูทีน
End Sub


Private Sub Command3_Click()
' เมื่อมีการกดปุ่มให้มอเตอร์หมุนซ้าย
ValExit = False
valSpeed = Val(Text1.Text)
'กำหนดความเร็วในแต่ละสเต็ป
valStep = Val(Text2.Text)
' กำหนดจำนวนสเต็ป
valCount = 0
     If Option1.Value = True Then
' ถ้าเลือกการหมุนแบบตามจำนวนสเต็ปที่กำหนด
         BitStep = 8
         Do
                  DoEvents
' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
                  valCount = valCount + 1
' นับจำนวนสแต็ป
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวดเริ่มต้นที่บิตสุดท้าย
                  Out PortAddress, BitStep
                  DelayTime (valSpeed)
'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
                  BitStep = BitStep / 2
' ลดค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
                  If BitStep < 1 Then BitStep = 8
' เมื่อถึงบิตที่ 1 ให้รีเซทค่าไปที่บิต 4 ใหม่
                  Label1.Caption = valCount
' แสดงค่าจำนวนสเต็ปที่ Label 1
         Loop Until valCount = valStep ' จบการทำงานเมื่อค่านี้เท่ากับค่าจำนวนสเต็ปที่ตั้งไว้
     End If
     If Option2.Value = True Then
' ถ้าเลือกการหมุนแบบสเต็ปต่อเนื่อง
         BitStep = 8
         Do
                  DoEvents
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวด
                  Out PortAddress, BitStep
                  Call DelayTime(valSpeed)
'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
                  BitStep = BitStep / 2
' ลดค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
                  If BitStep < 1 Then BitStep = 8
' เมื่อถึงบิตที่ 1 ให้รีเซทค่าไปที่บิต 4 ใหม่
                  Label1.Caption = valCount
' แสดงค่าจำนวนสเต็ปที่ Label 1
         Loop Until ValExit = True 'จบการทำงานเมื่อกดปุ่มหยุดหมุนโดยจะรับค่า ValExit=True
    End If
End Sub


Private Sub Form_Load()
         Out &H303, &H80
' ตั้งค่าดีฟอต์นที่พอร์ตควบคุม ของCard I/O 8255
End Sub

 

รูปที่ 7 โปรมแกรมควบคุมการหมุนของสเต็ปมอเตอร์

รูปที่ 8 สามารถเลือกพอร์ตที่ติดต่อควบคุมกับสเต็ปมอเตอร์

รูปที่ 9 ทดสอบโปรแกรมควบคุมสเต็ปมอเตอร์

Copyright (c)2000-2002 ThaiIO.com All rights reserved.
Contact webmaster :thaiio@mail.com