- วัสดุที่จำเป็น
- ADC บน STM8S103F3P6
- แผนภาพวงจรเพื่ออ่านค่า ADC บน STM8S และแสดงบน LCD
- ADC Library สำหรับ STM8S103F3P6
- โปรแกรม STM8S เพื่ออ่านแรงดันอนาล็อกและแสดงผลบน LCD
- การอ่านแรงดันอนาล็อกจากโพเทนชิออมิเตอร์สองตัวโดยใช้ STM8S
หากคุณเป็นผู้อ่านทั่วไปที่ติดตามบทเรียนไมโครคอนโทรลเลอร์ STM8S ของเราคุณจะรู้ว่าในบทช่วยสอนสุดท้ายของเราเราได้เรียนรู้วิธีการเชื่อมต่อ LCD 16x2 กับ STM8s ตอนนี้ดำเนินการต่อในบทช่วยสอนนี้เราจะเรียนรู้วิธีใช้คุณลักษณะ ADC บนไมโครคอนโทรลเลอร์ STM8S103F3P6 ของเรา ADC เป็นอุปกรณ์ต่อพ่วงที่มีประโยชน์อย่างมากบนไมโครคอนโทรลเลอร์ที่โปรแกรมเมอร์ฝังตัวมักใช้ในการวัดหน่วยที่มีการเปลี่ยนแปลงตลอดเวลาเช่นแรงดันไฟฟ้ากระแสไฟฟ้าอุณหภูมิความชื้นเป็นต้น
อย่างที่เราทราบกันดีว่า“ เราอยู่ในโลกอนาล็อกด้วยอุปกรณ์ดิจิทัล” ซึ่งหมายความว่าทุกสิ่งรอบตัวเราเช่นความเร็วลมความเข้มของแสงอุณหภูมิและทุกสิ่งที่เราจัดการเช่นความเร็วความเร็วความดัน ฯลฯ เป็นแบบอะนาล็อก แต่ไมโครคอนโทรลเลอร์และไมโครโปรเซสเซอร์ของเราเป็นอุปกรณ์ดิจิทัลและจะไม่สามารถวัดค่าพารามิเตอร์เหล่านี้ได้หากไม่มีอุปกรณ์ต่อพ่วงที่สำคัญที่เรียกว่า Analog to Digital Converters (ADC) ดังนั้นในบทความนี้เรามาเรียนรู้วิธีใช้ADC บนไมโครคอนโทรลเลอร์ STM8Sกับคอมไพเลอร์ COMIC C
วัสดุที่จำเป็น
ในบทความนี้เราจะอ่านค่าแรงดันอนาล็อกสองตัวจากโพเทนชิโอมิเตอร์สองตัวและแสดงค่า ADC บนจอ LCD 16x2 ในการทำเช่นนี้เราจะต้องมีส่วนประกอบต่อไปนี้
- STM8S103F3P6 บอร์ดพัฒนา
- โปรแกรมเมอร์ ST-Link V2
- 16x2 LCD
- โพเทนชิโอมิเตอร์
- การเชื่อมต่อสายไฟ
- ตัวต้านทาน 1k
ADC บน STM8S103F3P6
ADC มีหลายประเภทและไมโครคอนโทรลเลอร์แต่ละตัวก็มีข้อกำหนดของตัวเอง บน STM8S103F3P6 เรามี ADC ที่มีความละเอียด5 Channel และ 10 บิต ด้วยความละเอียด 10 บิตเราจะสามารถวัดค่าดิจิตอลได้ตั้งแต่ 0 ถึง 1024 และ ADC แบบ 5 ช่องแสดงว่าเรามี 5 พินบนไมโครคอนโทรลเลอร์ซึ่งสามารถรองรับ ADC ได้ซึ่งหมุดทั้ง 5 นี้จะถูกไฮไลต์ในภาพด้านล่าง
อย่างที่คุณเห็นพินทั้งห้านี้ (AIN2, AIN3, AIN4, AIN5 และ AIN6) ถูกมัลติเพล็กซ์กับอุปกรณ์ต่อพ่วงอื่น ๆ ซึ่งหมายถึงนอกเหนือจากการทำหน้าที่เป็นพิน ADC แล้วพินเหล่านี้ยังสามารถใช้เพื่อทำการสื่อสารอื่น ๆ ได้เช่น พิน 2 และ 3 (AIN5 และ AIN 6) ไม่เพียง แต่ใช้กับ ADC เท่านั้น แต่ยังสามารถใช้สำหรับการสื่อสารแบบอนุกรมและฟังก์ชัน GPIO โปรดทราบว่าจะไม่สามารถใช้พินเดียวกันสำหรับทั้งสามวัตถุประสงค์ได้ดังนั้นหากเราใช้พินทั้งสองนี้สำหรับ ADC เราจะไม่สามารถทำการสื่อสารแบบอนุกรมได้คุณลักษณะ ADC ที่สำคัญอื่น ๆสำหรับ STM8S103P36สามารถพบได้ในตารางด้านล่างที่นำมาจากแผ่นข้อมูล
ในตารางด้านบน Vdd แสดงถึงแรงดันไฟฟ้าในการทำงานและ Vss หมายถึงกราวด์ ดังนั้นในกรณีของเราบนบอร์ดพัฒนาของเราเรามีไมโครคอนโทรลเลอร์ที่ทำงานบน 3.3V คุณสามารถตรวจสอบแผนภาพวงจรของบอร์ดพัฒนาได้จากการเริ่มต้นใช้งานการสอน STM8S ด้วย 3.3V เป็นแรงดันไฟฟ้าความถี่สัญญาณนาฬิกา ADC ของเราสามารถตั้งค่าได้ระหว่าง 1 ถึง 4MHz และช่วงแรงดันแปลงของเราอยู่ระหว่าง 0V ถึง 3.3V ซึ่งหมายความว่า ADC 10 บิตของเราจะอ่าน 0 เมื่อมีการจัดเตรียม 0V (Vss) และจะอ่านค่าสูงสุด 1024 เมื่อมีการให้ 3.3V (Vdd) เราสามารถเปลี่ยน 0-5V นี้ได้อย่างง่ายดายโดยเปลี่ยนแรงดันไฟฟ้าของ MCU หากจำเป็น
แผนภาพวงจรเพื่ออ่านค่า ADC บน STM8S และแสดงบน LCD
แผนภาพวงจรที่สมบูรณ์ที่ใช้ในโครงการนี้แสดงไว้ด้านล่างซึ่งคล้ายกับบทช่วยสอน LCD STM8S ที่เราพูดถึงก่อนหน้านี้มาก
ในขณะที่คุณสามารถดูที่ส่วนประกอบเท่านั้นเพิ่มเติมนอกเหนือจากจอแอลซีดีที่มีสองมิเตอร์ POT_1 และPOT_2 หม้อเหล่านี้เชื่อมต่อกับพอร์ต PC4 และ PD6 ซึ่งเป็นพิน ANI2 และ ANI6 ตามที่กล่าวไว้ในภาพ pinout ก่อนหน้านี้
โพเทนชิโอมิเตอร์เชื่อมต่อกันในลักษณะที่เมื่อเราแปรผันเราจะได้ 0-5 V บนพินอะนาล็อกของเรา เราจะเขียนโปรแกรมคอนโทรลเลอร์ของเราให้อ่านแรงดันไฟฟ้าแบบอะนาล็อกนี้ในค่าดิจิตอล (0 ถึง 1024) และแสดงบนหน้าจอ LCD จากนั้นเราจะคำนวณค่าแรงดันไฟฟ้าที่เท่ากันและแสดงบน LCD โปรดจำไว้ว่าคอนโทรลเลอร์ของเราใช้พลังงานจาก 3.3V ดังนั้นแม้ว่าเราจะให้ 5V กับขา ADC แต่ก็จะสามารถอ่านได้ตั้งแต่ 0V ถึง 3.3V เท่านั้น.
เมื่อการเชื่อมต่อเสร็จสิ้นฮาร์ดแวร์ของฉันจะมีลักษณะดังนี้ดังที่แสดงด้านล่าง คุณสามารถเห็นโพเทนชิโอมิเตอร์สองตัวทางด้านขวาและโปรแกรมเมอร์ ST-link ทางด้านซ้าย
ADC Library สำหรับ STM8S103F3P6
ในการตั้งโปรแกรมสำหรับฟังก์ชัน ADC บน STM8S เราจะใช้คอมไพเลอร์ Cosmic C ร่วมกับไลบรารี SPL แต่เพื่อให้กระบวนการง่ายขึ้นฉันได้สร้างไฟล์ส่วนหัวอื่นที่สามารถพบได้ใน GitHub พร้อมกับลิงก์ด้านล่าง
ADC ไลบรารีสำหรับ STM8S103F3P6
หากคุณรู้ว่ากำลังทำอะไรอยู่คุณสามารถสร้างไฟล์ส่วนหัวโดยใช้โค้ดด้านบนและเพิ่มลงในไดเร็กทอรี“ รวมไฟล์” ในหน้าโปรเจ็กต์ของคุณ อื่น ๆ ทำตามการเริ่มต้นใช้งานบทช่วยสอน STM8S เพื่อทราบวิธีตั้งค่าสภาพแวดล้อมการเขียนโปรแกรมและคอมไพเลอร์ของคุณ เมื่อการตั้งค่าของคุณพร้อมแล้ว IDE ของคุณควรมีไฟล์ส่วนหัวต่อไปนี้อย่างน้อยไฟล์ที่ล้อมรอบด้วยสีแดง
ส่วนหัวของแฟ้มดังกล่าวข้างต้นประกอบด้วยฟังก์ชั่นที่เรียกว่า ADC_Read () ฟังก์ชันนี้สามารถเรียกใช้ในโปรแกรมหลักของคุณเพื่อรับค่า ADC ที่พินใดก็ได้ ตัวอย่างเช่น ADC_Read (AN2) จะส่งคืนค่า ADC บนพิน AN2 เป็นผลลัพธ์ ฟังก์ชั่นดังแสดงด้านล่าง
ADC_Read int ที่ไม่ได้ลงชื่อ (ADC_CHANNEL_TypeDef ADC_Channel_Number) {ผลลัพธ์ int ที่ไม่ได้ลงชื่อ = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (เปิดใช้งาน); ADC1_StartConversion (); ในขณะที่ (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); ผลลัพธ์ = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
อย่างที่คุณเห็นเราสามารถส่งพารามิเตอร์แปดตัวไปยังฟังก์ชันนี้และสิ่งนี้จะกำหนดวิธีกำหนดค่า ADC ในรหัสไลบรารีของเราด้านบนเราได้ตั้งค่าโหมดการแปลงเป็นแบบต่อเนื่องจากนั้นรับหมายเลขช่องที่ส่งผ่านพารามิเตอร์ จากนั้นเราต้องตั้งค่าความถี่ CPU ของคอนโทรลเลอร์ของเราตามค่าเริ่มต้น (หากคุณไม่ได้เชื่อมต่อคริสตัลภายนอก) STM8S ของคุณจะทำงานร่วมกับออสซิลเลเตอร์ภายใน 16Mhz ดังนั้นเราจึงได้กล่าวถึง“ ADC1_PRESSEL_FCPU_D18 ” เป็นค่า pre-scaler ภายในฟังก์ชันนี้เรากำลังใช้วิธีการอื่นที่กำหนดโดยไฟล์ส่วนหัวSPL stm8s_adc1.h เราเริ่มต้นด้วยการยกเลิกการเริ่มต้นหมุด ADC จากนั้น ADC1_Init () เพื่อเริ่มต้นอุปกรณ์ต่อพ่วง ADC คำจำกัดความของฟังก์ชันนี้จากคู่มือผู้ใช้ SPL แสดงอยู่ด้านล่าง
ต่อไปเราจะตั้งค่าทริกเกอร์ภายนอกโดยใช้ตัวจับเวลาและปิดใช้ทริกเกอร์ภายนอกเนื่องจากเราจะไม่ใช้ที่นี่ จากนั้นเราจะตั้งค่าการจัดตำแหน่งทางด้านขวาและพารามิเตอร์สองตัวสุดท้ายถูกใช้เพื่อตั้งค่า Schmitt trigger แต่เราจะปิดการใช้งานสำหรับบทช่วยสอนนี้ ดังนั้นเพื่อให้สั้นเราจะให้ ADC ของเราทำงานในโหมดการแปลงแบบต่อเนื่องบนขา ADC ที่ต้องการพร้อมทริกเกอร์ภายนอกและปิดใช้ทริกเกอร์ Schmitt คุณสามารถตรวจสอบแผ่นข้อมูลหากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ทริกเกอร์ภายนอกหรือตัวเลือกทริกเกอร์ Schmitt เราจะไม่พูดถึงเรื่องนี้ในบทช่วยสอนนี้
โปรแกรม STM8S เพื่ออ่านแรงดันอนาล็อกและแสดงผลบน LCD
รหัสทั้งหมดที่ใช้ในไฟล์ main.c สามารถพบได้ที่ด้านล่างของหน้านี้ หลังจากเพิ่มไฟล์ส่วนหัวและไฟล์ต้นฉบับที่ต้องการแล้วคุณจะสามารถคอมไพล์ไฟล์หลักได้โดยตรง คำอธิบายของโค้ดในไฟล์หลักมีดังนี้ ฉันจะไม่อธิบายโปรแกรม STM8S LCD เนื่องจากเราได้พูดคุยกันแล้วในบทช่วยสอนก่อนหน้านี้
วัตถุประสงค์ของรหัสคือเพื่ออ่านค่า ADC จากสองพินและแปลงเป็นค่าแรงดันไฟฟ้า เราจะแสดงทั้งค่า ADC และค่าแรงดันไฟฟ้าบนจอ LCD ดังนั้นฉันจึงใช้ฟังก์ชันที่เรียกว่า LCD_Print Var ซึ่งรับตัวแปรในรูปแบบจำนวนเต็มและแปลงเป็นอักขระเพื่อแสดงบน LCD เราได้ใช้ตัวดำเนินการโมดูลัสอย่างง่าย (%) และหาร (/) เพื่อรับแต่ละหลักจากตัวแปรและใส่ตัวแปรเช่น d1, d2, d3 และ d4 ดังที่แสดงด้านล่าง จากนั้นเราสามารถใช้ฟังก์ชัน LCD_Print_Char เพื่อแสดงอักขระเหล่านี้บน LCD
โมฆะ LCD_Print_Var (int var) {ถ่าน d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
ถัดไปภายใต้ฟังก์ชันหลักเรามีการประกาศตัวแปรสี่ตัว สองตัวนี้ใช้เพื่อบันทึกค่า ADC (0 ถึง 1024) และอีกสองตัวใช้เพื่อรับค่าแรงดันไฟฟ้าที่แท้จริง
int ADC_value_1 ที่ไม่ได้ลงนาม = 0; int ที่ไม่ได้ลงนาม ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
ต่อไปเราต้องเตรียมหมุด GPIO และการกำหนดค่านาฬิกาเพื่ออ่านแรงดันไฟฟ้าแบบอะนาล็อก ที่นี่เราจะอ่านแรงดันอนาล็อกจากพิน AIN2 และ AIN6 ซึ่งเป็นพิน PC4 และ PD6 ตามลำดับ เราต้องกำหนดพินเหล่านี้ให้อยู่ในสถานะลอยตามภาพด้านล่าง เราจะเปิดใช้งานอุปกรณ์ต่อพ่วงนาฬิกาสำหรับ ADC ด้วย
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, เปิดใช้งาน); // เปิดใช้งาน Peripheral Clock สำหรับ ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
เมื่อพินพร้อมแล้วเราต้องเข้าสู่อนันต์ในขณะที่วนรอบเพื่ออ่านแรงดันไฟฟ้าอะนาล็อก เนื่องจากเรามีไฟล์ส่วนหัวของเราเราจึงสามารถอ่านแรงดันไฟฟ้าอะนาล็อกจากพิน AIN2 และ AIN 6 ได้อย่างง่ายดายโดยใช้บรรทัดด้านล่าง
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
ขั้นตอนต่อไปคือการแปลงการอ่าน ADC นี้ (0 ถึง 1023) เป็นแรงดันไฟฟ้าอนาล็อก ด้วยวิธีนี้เราสามารถแสดงค่าแรงดันไฟฟ้าที่แน่นอนที่กำหนดให้กับพิน AIN2 และ AIN6 สูตรในการคำนวณแรงดันอนาล็อกสามารถกำหนดได้โดย -
แรงดันอนาล็อก = การอ่าน ADC * (3300/1023)
ในกรณีของเราบนตัวควบคุม STM8S103F3 เรามี ADC ที่มีความละเอียด 10 บิตเพื่อให้เราได้ใช้ 1023 (2 ^ 10) นอกจากนี้ในการพัฒนาของเรายังเพิ่มพลังให้กับคอนโทรลเลอร์ด้วย 3.3V ซึ่งเป็น 3300 ดังนั้นเราจึงหาร 3300 ด้วย 1,023 ในสูตรข้างต้น ประมาณ 3300/1023 จะให้ 3.226 ดังนั้นในโปรแกรมของเราเรามีบรรทัดต่อไปนี้เพื่อวัดแรงดันไฟฟ้า ADC จริงโดยใช้แรงดันไฟฟ้า ADC
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) แปลงค่า ADC 1 ถึง 0 ถึง 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // แปลงค่า ADC 1 ถึง 0 ถึง 3300mV
ส่วนที่เหลือของรหัสจะใช้เพื่อแสดงค่าทั้งสี่นี้บนหน้าจอ LCD เท่านั้น นอกจากนี้เรายังมีความล่าช้า 500ms เพื่อให้ LCD ได้รับการอัปเดตทุกๆ 500mS คุณสามารถลดได้อีกหากต้องการการอัปเดตที่เร็วขึ้น
การอ่านแรงดันอนาล็อกจากโพเทนชิออมิเตอร์สองตัวโดยใช้ STM8S
รวบรวมรหัสและอัปโหลดไปยังบอร์ดพัฒนาของคุณ หากคุณได้รับข้อผิดพลาดในการคอมไพล์ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มไฟล์ส่วนหัวและไฟล์ต้นฉบับทั้งหมดตามที่กล่าวไว้ก่อนหน้านี้ เมื่ออัปโหลดรหัสแล้วคุณจะเห็นข้อความต้อนรับเล็ก ๆ ว่า“ ADC บน STM8S” จากนั้นคุณจะเห็นหน้าจอด้านล่าง
ค่า D1 และ D2 ระบุค่า ADC จากพิน Ain2 และ AIN6 ตามลำดับ ทางด้านขวาเราจะแสดงค่าแรงดันไฟฟ้าที่เทียบเท่ากันด้วย ค่านี้ควรเท่ากับแรงดันไฟฟ้าที่ปรากฏบนพิน AIN2 และ AIN6 ตามลำดับ เราสามารถตรวจสอบสิ่งเดียวกันโดยใช้มัลติมิเตอร์เรายังสามารถเปลี่ยนโพเทนชิโอมิเตอร์เพื่อตรวจสอบว่าค่าแรงดันไฟฟ้าเปลี่ยนไปด้วยหรือไม่
สามารถดูการทำงานที่สมบูรณ์ได้ในวิดีโอด้านล่าง หวังว่าคุณจะสนุกกับบทช่วยสอนและเรียนรู้สิ่งที่เป็นประโยชน์หากคุณมีคำถามใด ๆ ทิ้งไว้ในส่วนความคิดเห็นด้านล่าง คุณยังสามารถใช้ฟอรัมของเราเพื่อเริ่มการสนทนาหรือโพสต์คำถามทางเทคนิคอื่น ๆ