- เซอร์โวมอเตอร์
- การควบคุมเซอร์โวมอเตอร์โดยใช้ LPC2148 PWM & ADC
- หมุด PWM และ ADC ใน ARM7-LPC2148
- ส่วนประกอบที่จำเป็น
- แผนภาพวงจรและการเชื่อมต่อ
- การเขียนโปรแกรม ARM7-LPC2148 สำหรับการควบคุมเซอร์โวมอเตอร์
ในบทช่วยสอนก่อนหน้านี้เราได้เชื่อมต่อสเต็ปเปอร์มอเตอร์กับ ARM7-LPC2148 ในการกวดวิชานี้เราจะควบคุมServo Motor กับ ARM7 เซอร์โวมอเตอร์มีข้อได้เปรียบในการใช้พลังงานต่ำกว่าสเต็ปเปอร์มอเตอร์ เซอร์โวมอเตอร์หยุดการใช้พลังงานเมื่อถึงตำแหน่งที่ต้องการ แต่สเต็ปมอเตอร์จะกินไฟอย่างต่อเนื่องเพื่อล็อคเพลาให้อยู่ในตำแหน่งที่ต้องการ เซอร์โวมอเตอร์ส่วนใหญ่จะใช้ในโครงการหุ่นยนต์เนื่องจากมีความแม่นยำและใช้งานง่าย
ในการกวดวิชานี้เราจะได้เรียนรู้เกี่ยวกับ Servo Motor และ วิธีการติดต่อกับ Servo ARM7 โพเทนชิออมิเตอร์ยังเชื่อมต่อเพื่อเปลี่ยนตำแหน่งของเพลาของเซอร์โวมอเตอร์และ LCD เพื่อแสดงค่ามุม
เซอร์โวมอเตอร์
เซอร์โวมอเตอร์เป็นการผสมผสานระหว่างมอเตอร์กระแสตรงระบบควบคุมตำแหน่งและเกียร์ การหมุนของเซอร์โวมอเตอร์ถูกควบคุมโดยใช้สัญญาณ PWM กับมันความกว้างของสัญญาณ PWM จะกำหนดมุมการหมุนและทิศทางของมอเตอร์ ที่นี่เราจะใช้ SG90 Servo Motor ในบทช่วยสอนนี้ซึ่งเป็นหนึ่งในผลิตภัณฑ์ยอดนิยมและราคาถูกที่สุด SG90 เป็นเซอร์โว 180 องศา ดังนั้นด้วยเซอร์โวนี้เราสามารถวางตำแหน่งแกนได้ตั้งแต่ 0-180 องศา:
- แรงดันไฟฟ้า: + 5V
- ประเภทเกียร์: พลาสติก
- มุมการหมุน: 0 ถึง 180 องศา
- น้ำหนัก: 9gm
- แรงบิด: 2.5 กก. / ซม
ก่อนที่เราจะเริ่มการเขียนโปรแกรมสำหรับเซอร์โวมอเตอร์เราควรทราบว่าจะส่งสัญญาณประเภทใดเพื่อควบคุมเซอร์โวมอเตอร์ เราควรตั้งโปรแกรมให้ MCU ส่งสัญญาณ PWM ไปยังสายสัญญาณของเซอร์โวมอเตอร์ มีวงจรควบคุมภายในเซอร์โวมอเตอร์ซึ่งอ่านรอบการทำงานของสัญญาณ PWM และวางตำแหน่งเพลาของเซอร์โวมอเตอร์ในตำแหน่งที่เกี่ยวข้องดังแสดงในภาพด้านล่าง
ทุก ๆ 20 มิลลิวินาทีเซอร์โวมอเตอร์จะตรวจสอบพัลส์ ดังนั้นปรับความกว้างพัลส์ของสัญญาณเพื่อหมุนเพลาของมอเตอร์
- ความกว้างพัลส์ 1 ms (1 มิลลิวินาที) สำหรับการหมุนเซอร์โวถึง0 องศา
- ความกว้างพัลส์ 1.5ms สำหรับการหมุนถึง90 องศา (ตำแหน่งกลาง)
- 2 มิลลิวินาทีชีพจรกว้างสำหรับการหมุนของเซอร์โวไป180 องศา
ก่อนที่จะ เชื่อมต่อ Servo กับ ARM7-LPC2148คุณสามารถทดสอบเซอร์โวของคุณด้วยความช่วยเหลือของวงจรทดสอบเซอร์โวมอเตอร์นี้ ตรวจสอบด้วยว่าเซอร์โวมอเตอร์สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์อื่น ๆ ได้อย่างไร:
- การควบคุมเซอร์โวมอเตอร์โดยใช้ Arduino
- เซอร์โวมอเตอร์เชื่อมต่อกับไมโครคอนโทรลเลอร์ 8051
- การควบคุมเซอร์โวมอเตอร์โดยใช้ MATLAB
- การควบคุมเซอร์โวมอเตอร์ด้วย Raspberry Pi
- การเชื่อมต่อเซอร์โวมอเตอร์กับ MSP430G2
- การเชื่อมต่อเซอร์โวมอเตอร์กับ STM32F103C8
การควบคุมเซอร์โวมอเตอร์โดยใช้ LPC2148 PWM & ADC
สามารถควบคุมเซอร์โวมอเตอร์โดย LPC2148 โดยใช้ PWM ด้วยการให้สัญญาณ PWM ไปยังพิน PWM ของ SERVO ด้วยระยะเวลา 20ms และความถี่ 50Hz เราสามารถวางตำแหน่งเพลาของเซอร์โวมอเตอร์ได้ประมาณ 180 องศา (-90 ถึง +90)
โพเทนชิออมิเตอร์ใช้เพื่อเปลี่ยนรอบการทำงานของสัญญาณ PWM และหมุนเพลาของเซอร์โวมอเตอร์วิธีนี้ดำเนินการโดยใช้โมดูล ADC ใน LPC2148 ดังนั้นเราจึงต้องใช้ทั้งแนวคิด PWM และ ADC ในบทช่วยสอนนี้ ดังนั้นโปรดดูบทช่วยสอนก่อนหน้านี้เพื่อเรียนรู้ PWM และ ADC ใน ARM7-LPC2148
- วิธีใช้ PWM ใน ARM7-LPC2148
- วิธีใช้ ADC ใน ARM-LPLC2148
หมุด PWM และ ADC ใน ARM7-LPC2148
ภาพด้านล่างแสดงพิน PWM และ ADC ใน LPC2148 กล่องสีเหลืองระบุหมุด (6) PWM และกล่องสีดำหมายถึงหมุด ADC (14)
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์
- ARM7-LPC2148
- โมดูลการแสดงผล LCD (16x2)
- เซอร์โวมอเตอร์ (SG-90)
- ตัวควบคุมแรงดันไฟฟ้า 3.3V
- โพเทนชิออมิเตอร์ 10k (2 Nos)
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
ซอฟต์แวร์
- Keil uVision 5
- Flash Magic Tool
แผนภาพวงจรและการเชื่อมต่อ
ตารางด้านล่างแสดงการเชื่อมต่อระหว่าง Servo Motor และ ARM7-LPC2148:
PINS SERVO |
ARM7-LPC2148 |
สีแดง (+ 5V) |
+ 5V |
สีน้ำตาล (GND) |
GND |
ส้ม (PWM) |
P0.1 |
พิน P0.1 คือเอาต์พุต PWM ของ LPC2148
ตารางด้านล่างแสดงให้เห็นว่าการเชื่อมต่อวงจรระหว่างจอแอลซีดีและ ARM7
ARM7-LPC2148 |
จอแอลซีดี (16x2) |
P0.4 |
RS (ลงทะเบียนเลือก) |
P0.6 |
E (เปิดใช้งาน) |
P0.12 |
D4 (พินข้อมูล 4) |
P0.13 |
D5 (พินข้อมูล 5) |
P0.14 |
D6 (พินข้อมูล 6) |
P0.15 |
D7 (พินข้อมูล 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, อ |
ตารางด้านล่างแสดงให้เห็นการเชื่อมต่อระหว่าง ARM7 LPC2148 & มิเตอร์กับควบคุมแรงดันไฟฟ้า
IC ควบคุมแรงดันไฟฟ้า 3.3V |
ฟังก์ชัน Pin |
ARM-7 LPC2148 พิน |
1. ขาซ้าย |
- จาก GND |
พิน GND |
2. หมุดกลาง |
เอาต์พุตควบคุม + 3.3V |
ไปยังอินพุตโพเทนชิออมิเตอร์และเอาต์พุตของโพเทนชิออมิเตอร์เป็นP0.28 ของ LPC2148 |
3. หมุดขวา |
+ จาก 5V อินพุต |
+ 5V |
จุดที่ต้องสังเกต
1. ที่นี่ใช้ตัวควบคุมแรงดันไฟฟ้า 3.3V เพื่อระบุค่าอินพุตแบบอะนาล็อกให้กับขา ADC (P0.28) ของ LPC2148 ในขณะที่เราใช้ไฟ 5V เราจำเป็นต้องควบคุมแรงดันไฟฟ้าด้วยตัวควบคุมแรงดันไฟฟ้า 3.3V
2. โพเทนชิออมิเตอร์ใช้เพื่อเปลี่ยนแรงดันไฟฟ้าระหว่าง (0V ถึง 3.3V) เพื่อให้อินพุตอะนาล็อก (ADC) ไปยัง LPC2148 พิน P0.28
3. พิน P0.1 ของ LPC2148 ให้เอาต์พุต PWM ไปยังเซอร์โวมอเตอร์เพื่อควบคุมตำแหน่งของมอเตอร์
4. ตามค่าอินพุตอะนาล็อก (ADC) ตำแหน่งของเซอร์โวมอเตอร์เปลี่ยนจาก (0 ถึง 180 องศา) ผ่านขาเอาต์พุต PWM ที่ P0.1 ของ LPC2148
การเขียนโปรแกรม ARM7-LPC2148 สำหรับการควบคุมเซอร์โวมอเตอร์
ในการเขียนโปรแกรม ARM7-LPC2148 เราต้องใช้เครื่องมือ keil uVision & Flash Magic เราใช้สาย USB เพื่อตั้งโปรแกรม ARM7 Stick ผ่านพอร์ต micro USB เราเขียนโค้ดโดยใช้ Keil และสร้างไฟล์ hex จากนั้นไฟล์ HEX จะถูกแฟลชไปที่แท่ง ARM7 โดยใช้ Flash Magic หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้ง keil uVision และ Flash Magic และวิธีการใช้งานให้ไปที่ลิงค์เริ่มต้นใช้งานไมโครคอนโทรลเลอร์ ARM7 LPC2148 และตั้งโปรแกรมโดยใช้ Keil uVision
ขั้นตอนที่เกี่ยวข้องในการกำหนดค่า LPC2148 สำหรับ PWM & ADC เพื่อควบคุมเซอร์โวมอเตอร์
ขั้นตอนที่ 1: -รวมไฟล์ส่วนหัวที่จำเป็นสำหรับการเข้ารหัส LPC2148
# รวม
ขั้นตอนที่ 2: -สิ่งต่อไปคือการกำหนดค่า PLLสำหรับการสร้างนาฬิกาเนื่องจากตั้งค่านาฬิการะบบและนาฬิกาอุปกรณ์ต่อพ่วงของ LPC2148 ตามที่โปรแกรมเมอร์ต้องการ ความถี่สัญญาณนาฬิกาสูงสุดสำหรับ LPC2148 คือ 60Mhz บรรทัดต่อไปนี้ใช้เพื่อกำหนดค่าการสร้างนาฬิกา PLL
เป็นโมฆะเริ่มต้น PLL (โมฆะ) // ฟังก์ชันใช้ PLL สำหรับการสร้างนาฬิกา { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; ในขณะที่ (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
ขั้นตอนที่ 3: -สิ่งต่อไปที่ต้องทำคือเลือกพิน PWM และฟังก์ชัน PWM ของ LPC2148 โดยใช้การลงทะเบียน PINSEL เราใช้ PINSEL0 เมื่อเราใช้ P0.1 สำหรับเอาต์พุต PWM ของ LPC2148
PINSEL0 - = 0x00000008; // การตั้งค่าพิน P0.1 ของ LPC2148 เป็น PWM3
ขั้นตอนที่ 4: -ต่อไปเราต้องรีเซ็ตตัวจับเวลาโดยใช้ PWMTCR (Timer Control Register)
PWMTCR = 0x02; // รีเซ็ตและปิดใช้งานตัวนับสำหรับ PWM
จากนั้นให้ตั้งค่า prescale ซึ่งจะกำหนดความละเอียดของ PWM ที่ตั้งไว้
PWMPR = 0x1D; // ค่า Prescale Register
ขั้นตอนที่ 5: -จากนั้นตั้งค่า PWMMCR (PWM match control register) เมื่อตั้งค่าการทำงานเช่นรีเซ็ตขัดจังหวะสำหรับ PWMMR0 และ PWMMR3
PWMMCR = 0x00000203; // รีเซ็ตและขัดจังหวะการแข่งขัน MR0 ขัดจังหวะการแข่งขัน MR3
ขั้นตอนที่ 6: -ระยะเวลาสูงสุดของช่องสัญญาณ PWM ถูกตั้งค่าโดยใช้ PWMMR0 และตันของรอบการทำงาน PWM เริ่มต้นเป็น 0.65msec
PWMMR0 = 20000; // ช่วงเวลาของคลื่น PWM, 20msec PWMMR3 = 650; // ตันของคลื่น PWM 0.65 มิลลิวินาที
ขั้นตอนที่ 7: -ต่อไปเราต้องตั้งค่า Latch Enable ให้กับการลงทะเบียนการแข่งขันที่เกี่ยวข้องโดยใช้ PWMLER
PWMLER = 0x09; // เปิดใช้งาน Latch สำหรับ PWM3 และ PWM0
(เราใช้ PWMMR0 & PWMMR3) ดังนั้นเปิดใช้งานบิตที่เกี่ยวข้องโดยตั้งค่า 1 ใน PWMLER
ขั้นตอนที่ 8: -ในการเปิดใช้งานเอาต์พุต PWM ไปยังพินเราจำเป็นต้องใช้ PWMTCR เพื่อเปิดใช้งานตัวนับตัวจับเวลา PWM และโหมด PWM
PWMPCR = 0x0800; // เปิดใช้งาน PWM3 และ PWM 0, PWM ที่ควบคุมด้วยขอบเดียว PWMTCR = 0x09; // เปิดใช้งาน PWM และตัวนับ
ขั้นตอนที่ 9: -ตอนนี้เราต้องได้รับค่าโพเทนชิออมิเตอร์สำหรับการตั้งค่ารอบการทำงานของ PWM จากพิน ADC P0.28 ดังนั้นเราจึงใช้โมดูล ADC ใน LPC2148 สำหรับการแปลงอินพุตอะนาล็อกโพเทนชิโอมิเตอร์ (0 ถึง 3.3V) เป็นค่า ADC (0 ถึง 1023)
ขั้นตอนที่ 10: -สำหรับ การเลือกพิน ADC P0.28 ใน LPC2148 เราใช้
PINSEL1 = 0x01000000; // การตั้งค่า P0.28 เป็น ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // การตั้งค่านาฬิกาและ PDN สำหรับการแปลง A / D
บรรทัดต่อไปนี้ จับอินพุตอนาล็อก (0 ถึง 3.3V) และแปลงเป็นค่าดิจิตอล (0 ถึง 1023) จากนั้นค่าดิจิตอลนี้จะหารด้วย 4 เพื่อแปลงเป็น (0 ถึง 255) และสุดท้ายป้อนเป็น เอาต์พุต PWM ใน P0.1 พิน ของ LPC2148 ที่นี่เราจะ แปลงค่า 0-1023 เพื่อ 0-255 โดยการหารด้วย 4 PWM ของ LPC2148 มีความละเอียด 8 บิต (28)
AD0CR - = (1 << 1); // เลือกช่อง AD0.1 ใน ADC register delaytime (10); AD0CR - = (1 << 24); // เริ่มการแปลง A / D ในขณะที่ ((AD0DR1 & (1 << 31)) == 0); // ตรวจสอบบิต DONE ใน ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // รับผลลัพธ์จากการลงทะเบียนข้อมูล ADC dutycycle = adcvalue / 4; // สูตรรับค่า dutycycle จาก (0 ถึง 255) PWMMR1 = dutycycle; // ตั้งค่า dutycycle เป็น PWM match register PWMLER - = (1 << 1); // เปิดใช้งานเอาต์พุต PWM ด้วยค่า dutycycle
ขั้นตอนที่ 11: -ต่อไปเราจะแสดงค่าเหล่านั้นในโมดูลการแสดงผล LCD (16X2) ดังนั้นเราจึงเพิ่มบรรทัดต่อไปนี้เพื่อเริ่มต้นโมดูลจอแสดงผล LCD
Void LCD_INITILIZE (โมฆะ) // ฟังก์ชั่นเพื่อเตรียม LCD { IO0DIR = 0x0000FFF0; // ตั้งค่าพิน P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 เป็น เวลาหน่วงเอาท์ พุท (20); LCD_SEND (0x02); // เริ่มต้น LCD ในโหมดการทำงาน 4 บิต LCD_SEND (0x28); // 2 บรรทัด (16X2) LCD_SEND (0x0C); // แสดงเคอร์เซอร์ปิด LCD_SEND (0x06); // เคอร์เซอร์เพิ่มอัตโนมัติ LCD_SEND (0x01); // แสดง LCD_SEND ที่ ชัดเจน(0x80); // บรรทัดแรกตำแหน่งแรก}
ในขณะที่เราเชื่อมต่อ LCD ในโหมด 4 บิตกับ LPC2148 เราจำเป็นต้องส่งค่าที่จะแสดงเป็นการแทะโดยการแทะ (Upper Nibble & Lower Nibble) ดังนั้นจึงใช้บรรทัดต่อไปนี้
โมฆะ LCD_DISPLAY (ถ่าน * msg) // ฟังก์ชันพิมพ์อักขระที่ส่งทีละตัว { uint8_t i = 0; ในขณะที่ (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // ส่ง IO0SET บนแทะ= 0x00000050; // RS HIGH & ENABLE HIGH เพื่อพิมพ์ข้อมูลIO0CLR = 0x00000020; // RW LOW โหมดการเขียน ล่าช้า (2); IO0CLR = 0x00000040; // EN = 0, RS และ RW ไม่เปลี่ยนแปลง (เช่น RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((ข้อความ & 0x0F) << 12)); // ส่ง IO0SET ล่างแทะ= 0x00000050; // RS & EN สูงIO0CLR = 0x00000020; เวลาล่าช้า (2); IO0CLR = 0x00000040; เวลาล่าช้า (5); ผม ++; } }
ในการแสดงเหล่านั้น ADC & PWM ค่าที่เราใช้บรรทัดต่อไปนี้ใน หลัก int () ฟังก์ชั่น
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // แสดงค่า ADC (0 ถึง 1023) มุม = (adcvalue / 5.7); // สูตรการแปลงค่า ADC เป็นมุม (o ถึง 180 องศา) LCD_SEND (0xC0); sprintf (มุม, "ANGLE =%. 2f deg", มุม); LCD_DISPLAY (มุมมอง);
คำอธิบายโค้ดและวิดีโอที่สมบูรณ์ของบทช่วยสอนมีอยู่ด้านล่าง