การวาดรูปทรงเรขาคณิตบนจอแสดงผล TFT โดยใช้ตัวอย่างของ SSD1289 เครื่องปรับกำลังไฟฟ้าสำหรับหัวแร้งบน AtMega48 และ AtMega8 - เทคโนโลยีการวัด - เครื่องมือ อัลกอริธึม Bresenham สำหรับการควบคุมพลังงาน

เครื่องปรับกำลังไฟฟ้าสำหรับหัวแร้ง

ตัวควบคุมนี้ช่วยให้คุณสามารถควบคุมกำลังไฟที่โหลดได้สองวิธี

  1. เฟสพัลส์ - เปลี่ยนมุมเปิดของไตรแอค
  2. โดยพลาดครึ่งรอบตามจำนวนที่ต้องการ

สำหรับวิธีที่สอง การกระจายพัลส์จะพบโดยใช้อัลกอริทึม Bresenham ซึ่งเป็นซอร์สโค้ด การตัดสินใจครั้งนี้ฉันเอามาจากบทความและโพสต์ในฟอรัมของผู้เป็นที่เคารพอย่างสมบูรณ์ ริดิโก เลโอนิด อิวาโนวิช, ขอบคุณมาก!

ตัวควบคุมถูกควบคุมโดยปุ่มสามปุ่ม:

  1. SET – เมื่อค้างไว้นานกว่า 2 วินาที ให้เข้า โหมดการตั้งค่าเมื่อกดสั้นๆ ให้เลื่อนดูการตั้งค่าพลังงานด่วนสามรายการ
  2. ลบ.
  3. บวก.

ตัวควบคุมช่วยให้คุณจัดเก็บการตั้งค่าพลังงานด่วน 3 แบบ

มีฟังก์ชั่นปิดเครื่องอัตโนมัติหากไม่มีการกดปุ่มใด ๆ เป็นเวลา 30 นาที ไฟแสดงสถานะจะเริ่มกระพริบ จากนั้นหลังจากผ่านไป 10 นาที โหลดจะปิดลง

บล็อกไดอะแกรมของการควบคุมในโหมดการตั้งค่า

  • เมื่อคุณกด SET ค้างไว้นานกว่า 2 วินาที REG จะแสดงบนหน้าจอ จากนั้นใช้ปุ่มบวก/ลบเพื่อเลือกอัลกอริธึมที่ต้องการ
  • PAU - อัลกอริธึม Bresenham
FI – เฟสแรงกระตุ้น
หากเลือกอัลกอริทึม FI
NUM – ​​​​ปรับปรุงจาก 0..145 นั่นคือครึ่งรอบแบ่งออกเป็น 145 ค่า
ประเทศสาธารณรัฐประชาชนจีน - การควบคุมจาก 0 ถึง 100% นั่นคือมาตราส่วน 145 จะถูกแปลงเป็นเปอร์เซ็นต์โดยอัตโนมัติ ถัดไปคือการตั้งค่าพลังงานด่วนสามรายการ "-1-" "-2-" "-3-"

INC - ขั้นตอนที่จะเพิ่ม/ลดกำลังโดยใช้ปุ่มบวก/ลบ

_t_ - การควบคุมฟังก์ชั่นปิดเครื่องอัตโนมัติเปิดใช้งาน, ปิดการใช้งานปิด ดังที่เห็นได้จากแผนภาพบล็อก การตั้งค่าพลังงานอย่างรวดเร็วสำหรับโหมด PAU และ FI(PRC) จะเหมือนกัน เนื่องจากมีช่วงอยู่ที่ 0..100 FI(NUM) มีการตั้งค่าของตัวเอง เนื่องจากมีช่วงอยู่ที่ 0..145

สามารถเปิดใช้งานตัวควบคุมได้อย่างรวดเร็ว

  • noC - ไม่มีพัลส์นาฬิกา และห้ามจ่ายพัลส์ควบคุมไปยัง triac
  • EEP - ข้อผิดพลาดของข้อมูลใน EEPROM สามารถแก้ไขได้โดยการเข้าสู่โหมดการตั้งค่า หลังจากแก้ไขพารามิเตอร์ คำจารึกจะหายไป

ในเหล็ก



บทนำ ในการผลิต (ในระบบควบคุมอัตโนมัติ) และในชีวิตประจำวัน มักจำเป็นต้องควบคุมพลังงานที่จ่ายให้กับโหลด ตามกฎแล้วโหลดจะดำเนินการจากเครือข่าย เครื่องปรับอากาศ- ดังนั้นงานจึงค่อนข้างซับซ้อนกว่าเมื่อเปรียบเทียบกับการปรับกำลังของโหลดที่ทำงานที่แรงดันไฟฟ้าคงที่ เมื่อโหลดทำงานที่แรงดันไฟฟ้าคงที่ จะใช้พัลส์ไวด์มอดูเลชั่น (PWM) และโดยการเปลี่ยนรอบการทำงาน กำลังที่จ่ายให้กับโหลดก็จะเปลี่ยนไปตามไปด้วย หากคุณใช้การควบคุม PWM เพื่อควบคุมพลังงานในเครือข่าย AC สวิตช์ที่คุณควบคุมสัญญาณ (เช่น ไทรแอก) จะเปิดและส่งผ่านส่วนของไซน์ซอยด์ที่มีพลังงานต่างกันเข้าไปในโหลด ฐานองค์ประกอบและการประกอบตัวควบคุม รูปที่ 1 ไฟฟ้า แผนภาพวงจรเครื่องควบคุม ในการดำเนินโครงการนี้มีการใช้สิ่งต่อไปนี้: Pinboard บนไมโครคอนโทรลเลอร์ AVR ATmega16, Philips BT138 12A triac, สะพานไดโอด DB105, ออปโตซิมิสเตอร์ MOC3022, ออปโตคัปเปลอร์ PC817, ความต้านทาน 220 โอห์ม - 10 kOhm, โพเทนชิออมิเตอร์ 5 kOhm การเชื่อมต่อขององค์ประกอบจะแสดงในรูปที่ 1 หลักการทำงานของอุปกรณ์ ตัวควบคุมนี้ออกแบบมาเพื่อทำงานกับโหลดที่ใช้งานซึ่งเชื่อมต่อกับเครือข่าย 220 V ออปโตคัปเปลอร์ใช้เพื่อกำหนดจุดเริ่มต้นของแต่ละครึ่งคลื่น ดังนั้นที่เอาต์พุตของเครื่องตรวจจับศูนย์เราจะได้รับพัลส์บวกสั้น ๆ ในขณะที่แรงดันไฟฟ้าในเครือข่ายผ่าน 0 สัญญาณจากเครื่องตรวจจับศูนย์เชื่อมต่อกับอินพุตขัดจังหวะภายนอกของ MK เพื่อกำหนดจุดเริ่มต้นของใหม่ ครึ่งคลื่นและเปิด triac ตามเวลาที่ต้องการหรือครึ่งรอบจำนวนหนึ่ง ในการปลดล็อคไทรแอก แรงดันไฟฟ้าจะถูกจ่ายไปที่อิเล็กโทรดควบคุมผ่านออปโตซิมิเตอร์ที่สัมพันธ์กับแคโทดทั่วไป วิธีเฟส ด้วยวิธีเฟสซึ่งเปลี่ยนค่าการหน่วงเวลาของตัวจับเวลาโดยใช้ไมโครคอนโทรลเลอร์ ADC (ในกรณีของเราคือโพเทนชิออมิเตอร์) เราจะเปลี่ยนการหน่วงเวลาการเปิดของ triac ตามลำดับหลังจากเริ่มครึ่งคลื่น ยิ่งความล่าช้านานขึ้น ส่วนที่เล็กกว่าของครึ่งคลื่นจะถูกส่งผ่านไปยังโหลด ดังนั้นเราจึงได้รับพลังงานน้อยลง และในทางกลับกัน เมื่อทราบความถี่สัญญาณนาฬิกาของไมโครคอนโทรลเลอร์แล้วจะคำนวณความล่าช้า ที่ความถี่ แรงดันไฟหลักเวลาครึ่งรอบ 50 Hz จะเป็น 0.01 วินาที นั่นคือหาก triac เปิดหลังจาก 0.003 วินาที จะพลาดประมาณ 2/3 ของครึ่งคลื่น และกำลังจะเป็น 70% หากเปิดไทรแอกโดยไม่ชักช้า ครึ่งคลื่นทั้งหมดจะถูกส่งผ่าน และกำลังขับจะเป็น 100% โปรแกรมถูกนำไปใช้งานโดยใช้วิธีการควบคุมโหลดเฟส การเขียนโปรแกรมดำเนินการด้วย C++ ในสภาพแวดล้อม CodeVisionAVR ค่าที่อ่านได้จากออสซิลโลสโคปบนโหลดจะแสดงในรูปที่ 2 รูปที่ 2 การปรับกำลังโดยใช้วิธีเฟส การคำนวณความล่าช้าในการเปิดไทรแอก เนื่องจากฟังก์ชันแรงดันไฟฟ้าไม่เป็นเชิงเส้น กล่าวคือ พื้นที่ใต้ไซนูซอยด์ในช่วงเวลาเดียวกันจะแตกต่างกัน และกำลังจะแตกต่างกันตามไปด้วย ดังนั้นความล่าช้าจึงคำนวณโดยคำนึงถึงความไม่เชิงเส้นของแรงดันไฟฟ้า รูปที่ 3 แสดงคลื่นไซน์ของเครือข่ายและช่วงเวลาล่าช้าที่คำนวณในตารางที่ 1 แสดงค่าความล่าช้าห้าค่าแรกของหนึ่งร้อยเปอร์เซ็นต์ รูปที่ 3 การปรับโดยวิธีเฟส ตารางที่ 1 การคำนวณความล่าช้าในการเปิดไตรแอค จำนวนจุดครึ่งคลื่น เวลาเป็นไมโครวินาที ไซน์ของจุด 0 0 0 1 638 0.199 2 903 0.279 3 1108 0.341 4 1282 0.391 5 1436 0.435 วิธีเบรเซนแฮม มี ยังเป็นวิธีการควบคุมกำลังตามหลักการจ่ายสำหรับโหลดแรงดันไฟฟ้าหลักหลายครึ่งรอบตามด้วยการหยุดชั่วคราว (รูปที่ 4) ช่วงเวลาการสลับของ triac เกิดขึ้นพร้อมกับช่วงเวลาที่แรงดันไฟหลักข้ามศูนย์ ดังนั้นระดับการรบกวนทางวิทยุจึงลดลงอย่างรวดเร็ว การใช้ไมโครคอนโทรลเลอร์ทำให้สามารถใช้อัลกอริธึม Bresenham เพื่อการกระจายพัลส์ที่สม่ำเสมอ อย่างไรก็ตาม มีความถี่ในการสวิตชิ่งกระแสในโหลดลดลงเมื่อเปรียบเทียบกับการควบคุมเฟส ที่ต้องการสำหรับการควบคุมโหลด พลังงานสูง(จาก 1 กิโลวัตต์) โปรแกรมถูกนำไปใช้ และเช่นเดียวกับในวิธีเฟส จำนวนครึ่งรอบที่พลาดถูกเปลี่ยนแปลงโดยใช้ ADC ช่วงการส่งสัญญาณถูกเลือกจากทุกๆ ครึ่งคลื่น ไปจนถึงการส่งสัญญาณจากครึ่งคลื่นหนึ่งถึงสิบ รูปที่ 4 แสดงภาพออสซิลโลสโคปของการใช้งานคอนโทรลเลอร์โดยใช้วิธี Bresenham รูปที่ 4. การควบคุมกำลังโดยใช้วิธี Bresenham สรุป ตัวควบคุมเป็นแบบสากลซึ่งทำให้สามารถใช้งานได้ทั้งในชีวิตประจำวันและในอุตสาหกรรม การมีการควบคุมไมโครคอนโทรลเลอร์ช่วยให้คุณสามารถกำหนดค่าระบบใหม่ได้อย่างรวดเร็วซึ่งทำให้อุปกรณ์มีความยืดหยุ่น อัลกอริธึมการควบคุมสองชุดจะช่วยให้สามารถใช้คอนโทรลเลอร์ในช่วงพลังงานที่กว้างได้

อัลกอริธึมของ Bresenham เป็นหนึ่งในอัลกอริธึมที่เก่าแก่ที่สุดในคอมพิวเตอร์กราฟิก ดูเหมือนว่าเราจะใช้อัลกอริธึมในการสร้างเส้นแรสเตอร์เมื่อสร้างเตาบัดกรีที่บ้านได้อย่างไร ปรากฎว่ามันเป็นไปได้และด้วยผลลัพธ์ที่ดีมาก เมื่อมองไปข้างหน้า ฉันจะบอกว่าอัลกอริธึมนี้ป้อนเข้าสู่ไมโครคอนโทรลเลอร์ 8 บิตที่ใช้พลังงานต่ำได้เป็นอย่างดี แต่สิ่งแรกก่อน

อัลกอริธึมของเบรเซนแฮมเป็นอัลกอริธึมที่กำหนดว่าจุดใดบนแรสเตอร์สองมิติจำเป็นต้องแรเงาเพื่อให้ได้ค่าประมาณอย่างใกล้ชิดของเส้นตรงระหว่างจุดที่กำหนดสองจุด สาระสำคัญของอัลกอริทึมคือสำหรับแต่ละคอลัมน์ เอ็กซ์(ดูภาพ) กำหนดว่าเส้นไหน ใกล้กับเส้นมากที่สุดแล้วลากจุด

ตอนนี้เรามาดูกันว่าอัลกอริทึมดังกล่าวจะช่วยเราในการควบคุมองค์ประกอบความร้อนในเตาไฟฟ้าได้อย่างไร

องค์ประกอบความร้อนใช้พลังงานจากแรงดันไฟหลัก 220V/50Hz ลองมาดูกราฟกัน



เมื่อใช้แรงดันไฟฟ้าดังกล่าวกับอินพุตของเครื่องทำความร้อนไฟฟ้าในรูปแบบบริสุทธิ์ เราจะได้รับพลังงานความร้อน 100% ที่เอาต์พุต มันง่ายมาก



จะเกิดอะไรขึ้นหากคุณใช้แรงดันไฟหลักเพียงครึ่งคลื่นบวกกับอินพุตขององค์ประกอบความร้อน ถูกต้อง เราได้เอาท์พุตความร้อน 50%



หากเราใช้ทุกๆ ครึ่งคลื่นที่สาม เราจะได้พลัง 33%

ตามตัวอย่าง ลองพิจารณาการไล่ระดับ 10% ของกำลังเอาท์พุตและช่วงเวลา 100 มิลลิวินาที ซึ่งเทียบเท่ากับ 10 ครึ่งคลื่นของแรงดันไฟหลัก ลองวาดตารางขนาด 10x10 แล้วจินตนาการว่าแกนนั้น นี่คือแกนของค่ากำลังไฟฟ้าเอาท์พุต ลองวาดเส้นตรงจาก 0 ถึงค่ากำลังที่ต้องการ


คุณกำลังติดตามการเสพติดของคุณหรือไม่?
เมื่อเพิ่มช่วงเวลาเป็น 1 วินาที คุณสามารถได้รับการไล่ระดับของกำลังเอาต์พุต 1% ผลลัพธ์จะเป็นตารางขนาด 100x100 พร้อมผลลัพธ์ที่ตามมาทั้งหมด

และตอนนี้สำหรับสิ่งดีๆ:
อัลกอริธึม Bresenham สามารถสร้างเป็นวงในลักษณะที่แต่ละขั้นตอนตามแนวแกน เอ็กซ์เพียงติดตามค่าความผิดพลาด ซึ่งหมายถึง - ระยะห่างแนวตั้งระหว่างค่าปัจจุบัน และค่าที่แน่นอน สำหรับปัจจุบัน x- เมื่อใดก็ตามที่เราเพิ่มขึ้น xเราเพิ่มค่าความผิดพลาดตามจำนวนความชัน หากข้อผิดพลาดเกิน 0.5 เส้นจะเข้าใกล้จุดถัดไปมากขึ้น ดังนั้นเราจึงเพิ่มขึ้น ทีละหนึ่ง (อ่าน - เราข้ามแรงดันไฟฟ้าครึ่งคลื่น) ในขณะเดียวกันก็ลดค่าข้อผิดพลาดลง 1 พร้อมกัน

วิธีนี้สามารถลดลงเป็นวัฏจักรได้อย่างง่ายดาย การบวกจำนวนเต็ม(เพิ่มเติมในภายหลังเมื่ออธิบายอัลกอริธึมการทำงานของ MK ในบทความถัดไป) ซึ่งเป็นข้อดีที่ชัดเจนสำหรับไมโครคอนโทรลเลอร์

ฉันไม่ได้ตั้งใจทำให้คุณเป็นภาระกับสูตร อัลกอริธึมเป็นพื้นฐานและง่ายต่อการใช้ Google ฉันแค่อยากจะแสดงความเป็นไปได้ของการประยุกต์ในการออกแบบวงจร เพื่อควบคุมโหลดจะถูกใช้ แผนภาพทั่วไปการเชื่อมต่อออปโตคัปเปลอร์ triac MOC3063 กับเครื่องตรวจจับศูนย์


มีข้อดีหลายประการสำหรับแนวทางนี้

  • การรบกวนน้อยที่สุดในเครือข่ายเนื่องจากการสลับโหลดขนาดใหญ่บ่อยครั้ง การเปิด/ปิดจะเกิดขึ้นในช่วงเวลาที่แรงดันไฟฟ้าข้ามศูนย์
  • อัลกอริธึมที่ง่ายมาก - การคำนวณทั้งหมดจะลดลงเป็นการทำงานกับจำนวนเต็มซึ่งดีสำหรับไมโครคอนโทรลเลอร์
  • ไม่จำเป็นต้องล้อมรั้วเครื่องตรวจจับแรงดันไฟฟ้าเป็นศูนย์ (สวัสดี MOC3063) แม้ว่า MK จะกระตุกเท้าบนตัวจับเวลาโดยเปิดออปโตคัปเปลอร์ แต่ข้อผิดพลาดก็ไม่สำคัญ

ที่จะดำเนินต่อไป

ตัวควบคุมนี้ช่วยให้คุณสามารถควบคุมกำลังไฟที่โหลดได้สองวิธี

  1. เฟสพัลส์ - เปลี่ยนมุมเปิดของไตรแอค
  2. โดยพลาดครึ่งรอบตามจำนวนที่ต้องการ

สำหรับวิธีที่สอง พบการกระจายแรงกระตุ้นโดยใช้อัลกอริธึม Bresenham ฉันใช้ซอร์สโค้ดของโซลูชันนี้ทั้งหมดจากบทความและโพสต์ในฟอรัมของผู้ที่เคารพนับถือ ริดิโก เลโอนิด อิวาโนวิช, ขอบคุณมาก!

ตัวควบคุมถูกควบคุมโดยปุ่มสามปุ่ม:

  1. SET – เมื่อกดค้างไว้นานกว่า 2 วินาที จะเข้าสู่โหมดการตั้งค่า เมื่อกดสั้นๆ ให้เลื่อนดูการตั้งค่าพลังงานด่วนสามรายการ
  2. ลบ.
  3. บวก.

ตัวควบคุมช่วยให้คุณจัดเก็บการตั้งค่าพลังงานด่วน 3 แบบ มีฟังก์ชั่นปิดเครื่องอัตโนมัติหากไม่มีการกดปุ่มใด ๆ เป็นเวลา 30 นาที ไฟแสดงสถานะจะเริ่มกระพริบ จากนั้นหลังจากผ่านไป 10 นาที โหลดจะปิดลง

มีฟังก์ชั่นปิดเครื่องอัตโนมัติหากไม่มีการกดปุ่มใด ๆ เป็นเวลา 30 นาที ไฟแสดงสถานะจะเริ่มกระพริบ จากนั้นหลังจากผ่านไป 10 นาที โหลดจะปิดลง

เมื่อคุณกด SET ค้างไว้นานกว่า 2 วินาที REG จะแสดงบนหน้าจอ จากนั้นใช้ปุ่มบวก/ลบเพื่อเลือกอัลกอริธึมที่ต้องการ

  • เมื่อคุณกด SET ค้างไว้นานกว่า 2 วินาที REG จะแสดงบนหน้าจอ จากนั้นใช้ปุ่มบวก/ลบเพื่อเลือกอัลกอริธึมที่ต้องการ
  • PAU - อัลกอริธึม Bresenham
หากเลือกอัลกอริทึม FI
NUM – ​​ปรับจาก 0..145 นั่นคือครึ่งรอบแบ่งออกเป็น 145 ค่า PRC - การควบคุมตั้งแต่ 0 ถึง 100% นั่นคือมาตราส่วน 145 จะถูกแปลงเป็นเปอร์เซ็นต์โดยอัตโนมัติ ถัดไปคือการตั้งค่าพลังงานด่วนสามรายการ "-1-" "-2-" "-3-"
INC - ขั้นตอนที่จะเพิ่ม/ลดกำลังโดยใช้ปุ่มบวก/ลบ
_t_ - การควบคุมฟังก์ชั่นปิดเครื่องอัตโนมัติเปิดใช้งาน, ปิดการใช้งานปิด

ดังที่เห็นได้จากบล็อกไดอะแกรม การตั้งค่าพลังงานอย่างรวดเร็วสำหรับโหมด PAU และ FI(PRC) จะเหมือนกัน เนื่องจากมีช่วงอยู่ที่ 0..100 FI(NUM) มีการตั้งค่าของตัวเอง เนื่องจากมีช่วงอยู่ที่ 0..145

คุณสามารถเปิดตัวควบคุมที่กำลังไฟเต็มได้อย่างรวดเร็วโดยการกดปุ่ม SET+PLUS สองปุ่ม (ควรกดปุ่ม SET เร็วขึ้นเล็กน้อย) และข้อความ "เปิด" จะปรากฏขึ้นบนหน้าจอ ปิดเครื่องอย่างรวดเร็วโดยการกด SET+MINUS จากนั้น "OFF" จะแสดงบนหน้าจอ

สามารถเปิดใช้งานตัวควบคุมได้อย่างรวดเร็ว

  • noC - ไม่มีพัลส์นาฬิกา และห้ามจ่ายพัลส์ควบคุมไปยัง triac
  • EEP - ข้อผิดพลาดของข้อมูลใน EEPROM สามารถแก้ไขได้โดยการเข้าสู่โหมดการตั้งค่า หลังจากแก้ไขพารามิเตอร์ คำจารึกจะหายไป


ในเหล็ก



แผงวงจรพิมพ์. โปรดทราบว่าไม่มีตัวต้านทานติดตั้งอยู่บนตัวบ่งชี้นั้น ฉันติดตั้งไว้บนตัวบ่งชี้แล้ว

เราได้เรียนรู้วิธีการแสดงสัญลักษณ์และเส้นบนจอแสดงผล TFT และในบทช่วยสอนนี้ เราจะได้เรียนรู้การวาดรูปทรงเรขาคณิต มีรูปทรงเรขาคณิตไม่มากนักที่จะมีประโยชน์เมื่อสร้างส่วนต่อประสานกราฟิก รูปทรงหลักคือสี่เหลี่ยมและวงกลม เหล่านี้คือรูปทรงที่เราจะเรียนรู้ในการวาดในสองเวอร์ชันแบบแรเงาและแบบไม่แรเงา ฉันจะบอกทันทีว่าบทความนี้จะอธิบายรายละเอียดเกี่ยวกับอัลกอริทึมสำหรับการวาดเพียงบางส่วนเท่านั้น รูปทรงเรขาคณิตซึ่งก็น่าจะพอจะเข้าใจได้ หลักการทั่วไปการสร้างภาพแรสเตอร์ เริ่มจากรูปร่างที่ง่ายที่สุด - สี่เหลี่ยมผืนผ้าที่เต็มไป
จากบทความก่อนหน้านี้เราจำได้ว่าหากคุณระบุพิกัดของจุดแล้วส่งสี SSD1289 จะทาสีจุดตามอัลกอริทึมที่เลือกระหว่างการเริ่มต้น แต่ในกรณีนี้มีคุณลักษณะหนึ่งคือตัวควบคุม ย้ายไปยังบรรทัดถัดไปเมื่อถึงจุดสิ้นสุดของบรรทัดปัจจุบันเท่านั้น
การลงทะเบียนต่อไปนี้จะช่วยเราวาดรูปสี่เหลี่ยมผืนผ้าที่เต็มไป

เมื่อใช้รีจิสเตอร์เหล่านี้ เราสามารถกำหนดจุดเริ่มต้นและจุดสิ้นสุดของพื้นที่ที่เราจะเขียน จากนั้นจึงวนซ้ำ ปริมาณที่ต้องการครั้งหนึ่ง เราส่งสี และคอนโทรลเลอร์จะทำทุกอย่างเองตามอัลกอริธึมที่ระบุระหว่างการเริ่มต้น แต่ตอนนี้เขาจะ เลื่อนไปยังบรรทัดถัดไปเมื่อถึงจุดสิ้นสุดของพื้นที่ที่เรากำหนด
ในการบันทึกขอบเขตของพื้นที่ตาม X นั้นมีจุดประสงค์หนึ่งการลงทะเบียน R44 และเพื่อเขียนขอบเขตตาม Y - สองการลงทะเบียน R45 และ R46 เรามาใส่สิ่งที่อธิบายไว้ข้างต้นในรูปแบบของฟังก์ชัน เพื่อความสะดวก เราจะย้ายโค้ดที่รับผิดชอบในการเลือกพื้นที่ทำงานไปไว้ในฟังก์ชันแยกต่างหาก Set_Work_Area()
เป็นโมฆะ Set_Work_Area (uint16_t y1, uint16_t x1, uint16_t x2, uint16_t y2) ( Lcd_Write_Reg (0x0044, ((x2<< 8) | x1)); Lcd_Write_Reg(0x0045,y1); Lcd_Write_Reg(0x0046,y2); Set_Cursor(x1, y1); } /////////////////////////////////////// void Draw_Area(uint16_t left, uint16_t top, uint16_t right, uint16_t bottom, uint16_t color) { register uint16_t x,y; Set_Work_Area(left, top, right, bottom); for(y=top; y<=bottom; y++) { for(x=left; x<=right; x++) { Lcd_Write_Data(color); } } Set_Work_Area(0, 0, 319, 239); }


ตอนนี้เราได้เรียนรู้วิธีวาดรูปสี่เหลี่ยมผืนผ้าที่เติมสีแล้ว เรามาลองวาดรูปสี่เหลี่ยมผืนผ้าที่ยังไม่เติมสีกันดีกว่า แต่การทำเช่นนี้ เราต้องเรียนรู้วิธีการวาดเส้นก่อน ด้วยความรู้ที่เรามีอยู่แล้ว เราสามารถวาดเส้นแนวนอนหรือแนวตั้งได้อย่างง่ายดาย แต่ไม่ใช่เส้นที่ทำมุมถึงขอบฟ้า ในการสร้างเส้นที่อยู่ในมุมหนึ่งถึงขอบฟ้า เราจะใช้อัลกอริธึมแรสเตอร์ Bresenham หรือมากกว่านั้นคือการปรับเปลี่ยน ความจริงก็คือในตอนแรกอัลกอริทึมประกอบด้วยการดำเนินการหารและจุดลอยตัวซึ่งเราต้องการหลีกเลี่ยงเมื่อเขียนเฟิร์มแวร์สำหรับไมโครคอนโทรลเลอร์ คุณสามารถอ่านวิธีการดำเนินการนี้ได้ใน Wikipedia

กล่าวโดยย่อหลักการทำงานของอัลกอริธึม Bresenham มีดังนี้: เราใช้เซ็กเมนต์ที่มีพิกัดเริ่มต้น x และ y ในวงเราเพิ่มหนึ่งเข้ากับ x ในทิศทางของจุดสิ้นสุดของเซ็กเมนต์ และในแต่ละขั้นตอนเราจะคำนวณข้อผิดพลาด - ระยะห่างระหว่างพิกัดจริงในสถานที่นี้กับเซลล์กริดที่ใกล้ที่สุด หากข้อผิดพลาดไม่เกินครึ่งหนึ่งของเซลล์ให้ทาสีทับ



ในภาพด้านบน สีเหลืองแสดงเส้นก่อนการแรสเตอร์ สีเขียวและสีแดงแสดงระยะห่างถึงศูนย์กลางของเซลล์ที่ใกล้ที่สุด
และนี่คือโค้ดสำหรับวาดเส้น
โมฆะ Draw_Line (ขนาด uint8_t, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, สี uint16_t) ( int deltaX = abs(x2 - x1); int deltaY = abs(y2 - y1); int signX = x1< x2 ? 1: -1; int signY = y1 < y2 ? 1: -1; int error = deltaX - deltaY; for (;;) { Draw_Point(size,x1,y1,color); if(x1 == x2 && y1 == y2) break; int error2 = error * 2; if(error2 >-deltaY) ( ข้อผิดพลาด -= deltaY; x1 += signX; ) ถ้า(error2< deltaX) { error += deltaX; y1 += signY; } } }
ในการวาดรูปสี่เหลี่ยมผืนผ้า เราจำเป็นต้องมีเส้น 4 เส้น เพื่อความสะดวก เราจะแยกการวาดเส้นแนวนอนและแนวตั้งออกเป็นฟังก์ชันที่แยกจากกัน
ถือเป็นโมฆะ Draw_Horizont_Line (ขนาด uint8_t, uint16_t x1, uint16_t y1, uint16_t y2, สี uint16_t) ( Draw_Line (ขนาด, x1, y1, x1, y2, สี); ) /////////////// ///////////////// เป็นโมฆะ Draw_Vertical_Line (ขนาด uint8_t, uint16_t x1, uint16_t x2, uint16_t y1, สี uint16_t) ( Draw_Line (ขนาด, x1, y1, x2, y1, สี); ) ////////////////////////////// เป็นโมฆะ Draw_Reactangle (ขนาด uint8_t, uint16_t ซ้าย, uint16_t ด้านบน, uint16_t ขวา, uint16_t ด้านล่าง, uint16_t สี) ( Draw_Horizont_Line(ขนาด บน ซ้าย ขวา สี); Draw_Horizont_Line(ขนาด ล่าง ซ้าย ขวา สี); Draw_Vertical_Line(ขนาด บน ล่าง ซ้าย สี); Draw_Vertical_Line(ขนาด บน ล่าง , ขวา, สี )


และเพื่อที่จะวาดรูปสามเหลี่ยมคุณต้องมี 3 เส้นเท่านั้น)))
เป็นโมฆะ Draw_Triangle (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, ขนาด uint8_t, สี uint16_t) ( Draw_Line (ขนาด, x1, y1, x2, y2, สี); Draw_Line (ขนาด, x2, y2, สี); , x3, y3, สี); Draw_Line(ขนาด, x3, y3, x1, y1, สี);


การใช้อัลกอริธึม Bresenham คุณสามารถสร้างวงกลมได้ ในแต่ละขั้นตอนของอัลกอริธึมจะพิจารณาสามจุดและพบจุดที่เหมาะสมกว่าโดยการเปรียบเทียบระยะห่างจากศูนย์กลางของวงกลมไปยังจุดที่เลือกกับรัศมีของวงกลม
เป็นโมฆะ Draw_Circle (ขนาด uint8_t, uint16_t x0, uint16_t y0, รัศมี uint16_t, สี uint16_t) ( int x = 0; int y = รัศมี; int delta = 2 - 2 * รัศมี; ข้อผิดพลาด int = 0; ในขณะที่ (y >= 0) ( Draw_Point(ขนาด,x0 + x, y0 + y,สี); Draw_Point(ขนาด,x0 + x, y0 - y,สี); Draw_Point(ขนาด,x0 - x, y0 + y,สี); Draw_Point(ขนาด, x0 - x, y0 - y,สี); ข้อผิดพลาด = 2 * (เดลต้า + y) - 1;< 0 && error <= 0) { ++x; delta += 2 * x + 1; continue; } error = 2 * (delta - x) - 1; if(delta >0 && ข้อผิดพลาด > 0) ( --y; delta += 1 - 2 * y; Continue; ) ++x;


เดลต้า += 2 * (x - y);
--y;<= b_) { if(fill == 1) { Draw_Area(y-a_,x-b_,y+a_,x+b_,color); Draw_Area(y-b_,x-a_,y+b_,x+a_,color); } else { Draw_Point(size, a_+x, b_+y, color); Draw_Point(size, b_+x, a_+y, color); Draw_Point(size, x-a_, b_+y, color); Draw_Point(size, x-b_, a_+y, color); Draw_Point(size, b_+x, y-a_, color); Draw_Point(size, a_+x, y-b_, color); Draw_Point(size, x-a_, y-b_, color); Draw_Point(size, x-b_, y-a_, color); } if (P < 0) { P = (P + 3) + (2* a_); a_ ++; } else { P = (P + 5) + (2* (a_ - b_)); a_ ++; b_ --; } } } ////////////////////////////////////


-
ในช่วงท้ายของการเขียนบทความ ฉันพบฟังก์ชันที่วาดวงกลมที่เต็มแล้วและที่ยังไม่เติม อาร์กิวเมนต์การเติมมีหน้าที่รับผิดชอบในเรื่องนี้
เป็นโมฆะ Draw_Circle1 (int x ที่ไม่ได้ลงนาม, int y ที่ไม่ได้ลงนาม, รัศมีถ่าน, การเติมถ่าน, ขนาดถ่าน, สี int ที่ไม่ได้ลงนาม) ( int a_,b_,P; a_ = 0; b_ = รัศมี; P = 1 - รัศมี; ในขณะที่ (a_ บางทีนี่คือทั้งหมดที่ฉันต้องการบอกคุณเกี่ยวกับการวาดรูปทรงเรขาคณิต และในบทความนี้เราจะได้เรียนรู้วิธีการทำงานของหน้าจอสัมผัสแบบต้านทานลิงก์ไปยังโค้ดที่เขียนสำหรับบทความเกี่ยวกับ SSD1289, . โครงการเพื่อ
ต่อมลูกหมากอักเสบ - อาการและอาการแสดงในผู้ชาย สาเหตุ การวินิจฉัยและการรักษา ต่อมลูกหมากอักเสบเฉียบพลันในผู้ชาย