เทคโนโลยีเซนเซอร์วัดอุณหภูมิ

หัววัดเซนเซอร์อุณหภูมิ (การออกแบบวงจรฟังก์ชันของ DS18B20 และ PT100)

การกำหนดค่าแผนผัง DS18B20 และ Cubemax

เปรียบเทียบระหว่าง เซ็นเซอร์อุณหภูมิ PT100 สอบสวนและ โมดูล DS18B20
1) หลักการพื้นฐานของการรับสัญญาณ
①ความต้านทานของ PT100 เปลี่ยนแปลงตามสัดส่วนกับอุณหภูมิ (อุณหภูมิสูงขึ้น, ยิ่งความต้านทานมากขึ้น), แต่การเปลี่ยนแปลงความต้านทานมีขนาดเล็กมาก, เกี่ยวกับ 0.385 โอ้ / ระดับ;
2. ช่วงการวัดอุณหภูมิของ PT100 คือ -200°C -200°C, และที่ 0°C, ความต้านทานก็เท่ากับทุกประการ 100 โอ้;
3. กระแสไฟฟ้าในการทำงานของ PT100 ควรน้อยกว่า 5 มิลลิแอมป์;
④ แม้ว่าความต้านทานของ PT100 จะเปลี่ยนไปตามอุณหภูมิก็ตาม, อัตราการเปลี่ยนแปลง (นั่นคือ, ค่า K ค่า K ค่า K) จะแตกต่างกันในช่วงอุณหภูมิที่ต่างกัน.

2) ตารางการเปลี่ยนแปลงความต้านทานอุณหภูมิ PT100

ตารางการเปลี่ยนแปลงความต้านทานอุณหภูมิ PT100

3. วงจรขับ PT100

วงจรขับ PT100

วงจรขับ PT100

1) โดยวิธีแบ่งแรงดันไฟฟ้า, AD รวบรวมแรงดันไฟฟ้า PT100 เพื่อให้ได้ค่าความต้านทานเพื่อคำนวณอุณหภูมิ
ค่าความต้านทาน PT100 ในน้ำที่อุณหภูมิห้อง (25℃25℃25℃) เป็นเรื่องเกี่ยวกับ 109.89 โอ้.
ไมโครคอนโทรลเลอร์ส่งออกแรงดันไฟฟ้า 3.3V, และแรงดันไฟฟ้าหารด้วย PT100 มีค่าประมาณ:
109.89 ∗ 0.005 - 0.54945 วี

ค่า AD ที่แปลงตามสูตรการแปลง AD มีค่าประมาณ:
0.54945 / 3.3 ∗ 4096 - 681.98 data 682

เมื่ออุณหภูมิสูงขึ้นหนึ่งองศา, สมมติว่าแนวต้านของ PT100 เพิ่งเพิ่มขึ้นมา 0.385 โอ้, ค่าการเปลี่ยนแปลงของแรงดันไฟฟ้าที่หารจะเท่ากับประมาณ:
0.385 ∗ 0.005 - 0.001925 วี

ค่า AD ที่แปลงตามสูตรการแปลง AD มีค่าประมาณ:
0.001925 / 3.3 ∗ 4096 - 2.39 data 2

ในการทดลอง, พบว่าเนื่องจากแรงดันไฟฟ้า 3.3V ของแหล่งจ่ายไฟ stm32 ไม่เสถียร, ADC ได้รวบรวมความผันผวนของแรงดันไฟฟ้า PT100 และข้อผิดพลาดในการแบ่งแรงดันไฟฟ้ามีขนาดใหญ่. โซลูชันการปรับให้เหมาะสมคือการออกแบบวงจรแหล่งจ่ายกระแสคงที่. โดยรวบรวมแรงดันของ PT100 และกระแสของแหล่งกำเนิดกระแสคงที่, สามารถรับความต้านทานของ PT100 ได้, แล้วจะได้ค่าอุณหภูมิได้.

2) วงจรแหล่งจ่ายกระแสคงที่ตามตัวควบคุม LDO (MD5333)
มีวงจรขับสำหรับทดสอบ PT100 บนอินเทอร์เน็ตมากมาย, เช่นวงจรดีซีบริดจ์, วงจรแหล่งจ่ายกระแสคงที่ขึ้นอยู่กับแอมพลิฟายเออร์ในการดำเนินงาน, ฯลฯ. ผู้เขียนยังใช้เวลามากในการเลือกวงจรการขับขี่, โดยคำนึงถึงความยากในการทำบอร์ดและจำนวนส่วนประกอบ, และสุดท้ายก็เลือกวงจรต้นทางกระแสคงที่ตามตัวควบคุม LDO (MD5333). แผนภาพวงจรมีดังนี้:

วงจรแหล่งจ่ายกระแสคงที่ของตัวควบคุม LDO (MD5333)

วงจรแหล่งจ่ายกระแสคงที่ของตัวควบคุม LDO (MD5333)

ณ จุดนี้, การเลือกฮาร์ดแวร์เสร็จสมบูรณ์โดยพื้นฐานแล้ว. บอร์ดพัฒนาที่ใช้คือ Zhengdian Atom F10ZET6 Elite Board

โมดูล DS18B20
เพื่อทดสอบอุณหภูมิแบบเรียลไทม์และการเปรียบเทียบอุณหภูมิ PT100, มีการเพิ่มโมดูล DS18B20 สำหรับการทดสอบเปรียบเทียบการสอบเทียบ

1) ข้อมูลเบื้องต้นเกี่ยวกับ DS18B20
DS18B20 เป็นเซ็นเซอร์อุณหภูมิบัสเดี่ยวที่มีช่วงอุณหภูมิทดสอบ -55~+125°C และความแม่นยำ ±0.5°C. อุณหภูมิของสนามจะถูกส่งโดยตรงในลักษณะดิจิทัลบัสเดียว, ซึ่งช่วยเพิ่มความสามารถในการต่อต้านการแทรกแซงของระบบอย่างมาก. สามารถอ่านอุณหภูมิที่วัดได้โดยตรง, และสามารถรับรู้วิธีการอ่านค่าดิจิตอล 9 ~ 12 บิตผ่านการเขียนโปรแกรมอย่างง่ายตามความต้องการที่แท้จริง. ช่วงแรงดันไฟฟ้าในการทำงานคือ 3 ~ 5.5V, และใช้รูปแบบบรรจุภัณฑ์ที่หลากหลาย, ทำให้การตั้งค่าระบบมีความยืดหยุ่นและสะดวกสบาย. ความละเอียดที่ตั้งไว้และอุณหภูมิการเตือนที่ผู้ใช้กำหนดจะถูกจัดเก็บไว้ใน EEPROM และจะยังคงบันทึกไว้หลังจากไฟฟ้าดับ.

การออกแบบวงจร DS18B20

การออกแบบวงจร DS18B20

2) รู้เบื้องต้นเกี่ยวกับระยะเวลาการทำงานของ DS18B20
อุปกรณ์บัสเดี่ยวทั้งหมดต้องมีจังหวะสัญญาณที่เข้มงวดเพื่อให้มั่นใจในความสมบูรณ์ของข้อมูล. DS18B20 มี 6 ประเภทสัญญาณ: รีเซ็ตชีพจร, ชีพจรตอบสนอง, เขียน 0, เขียน 1, อ่าน 0 และอ่าน 1. สัญญาณทั้งหมดนี้, ยกเว้นชีพจรตอบสนอง, เป็นสัญญาณซิงโครนัสที่โฮสต์ส่ง. และคำสั่งและข้อมูลทั้งหมดจะถูกส่งด้วยไบต์ที่ต่ำก่อน.

DS18B20 รีเซ็ตพัลส์และพัลส์ตอบสนอง

DS18B20 รีเซ็ตพัลส์และพัลส์ตอบสนอง

1 รีเซ็ตพัลส์และพัลส์ตอบสนอง
การสื่อสารทั้งหมดบนบัสเดียวเริ่มต้นด้วยลำดับการเริ่มต้น. โฮสต์ส่งออกระดับต่ำและคงระดับต่ำไว้อย่างน้อย 480us เพื่อสร้างพัลส์รีเซ็ต. จากนั้นเจ้าบ้านก็ปล่อยรถบัส, และตัวต้านทานแบบดึงขึ้น 4.7K จะดึงบัสตัวเดียวให้สูง, ด้วยเวลาหน่วงเวลา 15 ~ 60us, และเข้าสู่โหมดการรับ (รับ). จากนั้น DS18B20 จะดึงบัสต่ำเป็นเวลา 60~240us เพื่อสร้างพัลส์ตอบสนองระดับต่ำ.

ไทม์มิ่งการเขียน DS18B20

ไทม์มิ่งการเขียน DS18B20

② เขียนจังหวะเวลา
ระยะเวลาการเขียนรวมถึงการเขียนด้วย 0 เวลาและการเขียน 1 เวลา. การกำหนดเวลาการเขียนทั้งหมดต้องมีอย่างน้อย 60us, และต้องใช้เวลากู้คืนอย่างน้อย 1us ระหว่างการกำหนดเวลาการเขียนอิสระสองครั้ง. การกำหนดเวลาการเขียนทั้งสองเริ่มต้นด้วยการที่โฮสต์ดึงบัสลง. เขียน 1 เวลา: โฮสต์ส่งออกระดับต่ำ, ความล่าช้าสำหรับ 2us, แล้วจึงปล่อยรถบัส, ล่าช้า 60us. เขียน 0 เวลา: โฮสต์ส่งออกระดับต่ำ, ความล่าช้าสำหรับ 60us, แล้วปล่อยรถบัสด้วยดีเลย์ 2us.

DS18B20 อ่านไทม์มิ่ง

DS18B20 อ่านไทม์มิ่ง

3 จับเวลาการอ่าน
อุปกรณ์บัสเดี่ยวจะส่งข้อมูลไปยังโฮสต์เมื่อโฮสต์กำหนดเวลาการอ่านเท่านั้น. ดังนั้น, หลังจากที่โฮสต์ออกคำสั่งอ่านข้อมูล, ต้องสร้างจังหวะการอ่านทันทีเพื่อให้ทาสสามารถส่งข้อมูลได้. การกำหนดเวลาการอ่านทั้งหมดต้องมีอย่างน้อย 60us, และต้องใช้เวลาในการกู้คืนอย่างน้อย 1us ระหว่างการกำหนดเวลาการอ่านอิสระสองครั้ง. เวลาในการอ่านแต่ละครั้งจะเริ่มต้นโดยโฮสต์, ซึ่งดึงรถบัสลงอย่างน้อย 1us. โฮสต์จะต้องปล่อยบัสในช่วงเวลาที่อ่าน และสุ่มตัวอย่างสถานะบัสภายใน 15us หลังจากเริ่มกำหนดเวลา. กระบวนการกำหนดเวลาการอ่านโดยทั่วไปคือ: โฮสต์ส่งสัญญาณการหน่วงเวลาระดับต่ำที่ 2us, จากนั้นโฮสต์จะสลับไปที่โหมดอินพุตล่าช้าที่ 12us, จากนั้นอ่านระดับปัจจุบันของบัสเดี่ยว, แล้วล่าช้า 50us.

DS18B20 เปิดพอร์ตอนุกรมเพื่อพิมพ์ข้อมูลอุณหภูมิ

DS18B20 เปิดพอร์ตอนุกรมเพื่อพิมพ์ข้อมูลอุณหภูมิ

หลังจากที่เข้าใจจังหวะบัสเดี่ยวแล้ว, มาดูกระบวนการอ่านอุณหภูมิโดยทั่วไปของ DS18B20 กัน. กระบวนการอ่านอุณหภูมิโดยทั่วไปของ DS18B20 คือ: รีเซ็ต → ส่ง SKIPROM (0xCC) → ส่งคำสั่งเริ่มการแปลง (0x44) → ล่าช้า → รีเซ็ต → ส่งคำสั่ง SKIPROM (0xCC) → ส่งคำสั่งหน่วยความจำ (0เอ็กซ์บีอี) → อ่านข้อมูลสองไบต์ (เช่น. อุณหภูมิ) อย่างต่อเนื่อง → สิ้นสุด.

3) แผนผังและการกำหนดค่า CUBEMAX
จากแผนผัง, จะเห็นได้ว่า DS18B20 เปิดใช้งานด้วยพอร์ต PG11 เพื่อเปิดพอร์ตอนุกรมเพื่อพิมพ์ข้อมูลอุณหภูมิ

การกำหนดค่าแผนผัง DS18B20 และ Cubemax

การกำหนดค่าแผนผัง DS18B20 และ Cubemax

DS18B20 อินเทอร์เฟซเซ็นเซอร์อุณหภูมิและความชื้น

DS18B20 อินเทอร์เฟซเซ็นเซอร์อุณหภูมิและความชื้น

4) ส่วนรหัส
ส่วนของโค้ดจะปลูกถ่ายไลบรารี ds18b20 ของ Zhengdian Atom และทำการแก้ไขเล็กน้อย

#ถ้าndef __DS18B20_H
#กำหนด __DS18B20_H

#รวม “tim.h”
/***********************************************************************************/
/* คำจำกัดความของพิน DS18B20 */

#กำหนด DS18B20_DQ_GPIO_PORT GPIOG
#กำหนด DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#กำหนด DS18B20_DQ_GPIO_CLK_ENABLE() ทำ{ __HAL_RCC_GPIOG_CLK_ENABLE(); }ในขณะที่(0) /* เปิดใช้งานนาฬิกาพอร์ต PG */

/**********************************************************************************************/

/* ฟังก์ชั่นการทำงานของ IO */
#กำหนด DS18B20_DQ_OUT(x) ทำ{ x ? \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_รีเซ็ต); \
}ในขณะที่(0) /* เอาต์พุตพอร์ตข้อมูล */
#กำหนด DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* อินพุตพอร์ตข้อมูล */

uint8_t ds18b20_init(เป็นโมฆะ); /* เริ่มต้น DS18B20 */
uint8_t ds18b20_check(เป็นโมฆะ); /* ตรวจสอบว่ามี DS18B20 อยู่หรือไม่ */
สั้น ds18b20_get_temperature(เป็นโมฆะ);/* รับอุณหภูมิ */

#สิ้นสุด

5. โมดูลควบคุมระยะไกลอินฟราเรด
1) โปรโตคอลการเข้ารหัสโมดูลไร้สาย

วิธีการเข้ารหัสที่ใช้กันอย่างแพร่หลายสำหรับการควบคุมระยะไกลแบบอินฟราเรด ได้แก่: โปรโตคอล NEC ของ PWM (การมอดูเลตความกว้างพัลส์) และโปรโตคอล RC-5 ของ Philips PPM (การปรับตำแหน่งชีพจร). รีโมทคอนโทรลที่มาพร้อมกับบอร์ดพัฒนาใช้โปรโตคอล NEC, ซึ่งมีคุณสมบัติดังต่อไปนี้:

1. 8-ที่อยู่บิตและความยาวคำสั่ง 8 บิต;

2. ที่อยู่และคำสั่งจะถูกส่งสองครั้ง (เพื่อให้มั่นใจในความน่าเชื่อถือ);

3. การมอดูเลตตำแหน่งพัลส์ PWM, โดยมีรอบการทำงานของตัวพาอินฟราเรดที่ส่งเป็นตัวแทน “0” และ “1”;

4. ความถี่ของผู้ให้บริการคือ 38Khz;

5. เวลาบิตคือ 1.125ms หรือ 2.25ms;

ในระเบียบการของ NEC, วิธีการตั้งค่าข้อมูลในโปรโตคอลเป็น ‘0’ หรือ '1'? ที่นี่, ตัวรับอินฟราเรดและตัวส่งสัญญาณอินฟราเรดจะถูกแยกออกจากกัน.

เครื่องส่งสัญญาณอินฟราเรด: ส่งข้อมูลโปรโตคอล '0' = 560us ของการส่งสัญญาณของผู้ให้บริการ + 560เราไม่มีการส่งสัญญาณของผู้ให้บริการ

ส่งข้อมูลโปรโตคอล '1' = 560us ของการส่งสัญญาณของผู้ให้บริการ + 1680เราไม่มีการส่งสัญญาณของผู้ให้บริการ

คำจำกัดความบิตของเครื่องส่งสัญญาณอินฟราเรดแสดงในรูปด้านล่าง

เครื่องรับอินฟราเรด: รับข้อมูลโปรโตคอล '0' = 560us ระดับต่ำ + 560เราระดับสูง

รับข้อมูลโปรโตคอล '1' = 560us ระดับต่ำ + 1680เราระดับสูง

รูปแบบข้อมูลของคำสั่งรีโมทคอนโทรล NEC คือ: เทอร์มินัลการซิงโครไนซ์, รหัสที่อยู่, รหัสผกผันที่อยู่, รหัสควบคุม, ควบคุมรหัสผกผัน. รหัสการซิงโครไนซ์ประกอบด้วยระดับต่ำ 9ms และระดับสูง 4.5ms. รหัสที่อยู่, รหัสผกผันที่อยู่, รหัสควบคุม, และโค้ดควบคุมผกผันเป็นรูปแบบข้อมูล 8 บิตทั้งหมด. โดยจะถูกส่งไปตามลำดับบิตแรกและบิตสูงสุดท้าย. รหัสผกผันใช้เพื่อเพิ่มความน่าเชื่อถือในการส่งข้อมูล.

ดังนั้น, การจับอินพุตสามารถใช้เพื่อวัดความกว้างพัลส์ของระดับสูงเพื่อให้เกิดการถอดรหัสการควบคุมระยะไกล.
2) แผนผังและการกำหนดค่า CUBEMAX

จากแผนผัง, เราจะเห็นว่าโมดูลไร้สายเปิดใช้งานผ่านพิน PB9 และรวบรวมผ่าน 4 ช่องทางของ TIM4:

พินเริ่มต้นของ TIM4_CH4 ไม่ใช่ PB9, ดังนั้นจึงจำเป็นต้องตั้งค่าด้วยตนเอง, และการตั้งค่าการขัดจังหวะจะเปิดขึ้นพร้อมกัน

3) ส่วนรหัส
จับภาพขอบที่เพิ่มขึ้นผ่านฟังก์ชันการโทรกลับของทิม

ในเวลานี้, สามารถรับสัญญาณถอดรหัสได้:

ในเวลานี้, ข้อมูลมีความซับซ้อนมากขึ้นและสามารถประมวลผลได้เล็กน้อย:

เอฟเฟกต์มีดังนี้:
ตัวเลขสองตัวสุดท้ายคือตัวถอดรหัสและรหัสผกผัน. ในเวลานี้, สามารถกำหนดเป็นมาโครเพื่อปรับเกณฑ์อุณหภูมิได้:

เอฟเฟกต์มีดังนี้:

รหัสชิ้นส่วนอินฟราเรด:

/* รหัสผู้ใช้ BEGIN ส่วนหัว */
/**
******************************************************************************
* @ไฟล์ : main.c
* @รวบรัด : เนื้อหาของโปรแกรมหลัก
******************************************************************************
* @ความสนใจ
*
* <h2><ศูนย์>&สำเนา; ลิขสิทธิ์ (C) 2024 เอสทีไมโครอิเล็กทรอนิกส์.
* สงวนลิขสิทธิ์.</ศูนย์></h2>
*
* ส่วนประกอบซอฟต์แวร์นี้ได้รับอนุญาตจาก ST ภายใต้ใบอนุญาต BSD 3-Clause,
* ที่ “ใบอนุญาต”; คุณไม่สามารถใช้ไฟล์นี้ได้เว้นแต่จะเป็นไปตามข้อกำหนดของ
* ใบอนุญาต. คุณสามารถขอรับสำเนาใบอนุญาตได้ที่:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* ส่วนหัวของรหัสผู้ใช้ */
/* รวมถึง ——————————————————————*/
#รวม “main.h”
#รวม “tim.h”
#รวม “usart.h”
#รวม “จีพีโอ.เอช”

/* ส่วนตัวได้แก่ ———————————————————-*/
/* รหัสผู้ใช้เริ่มต้นรวมถึง */
#รวม “stdio.h”
#รวม “สตริง.h”
#กำหนด MAXUP 157
#กำหนด MAXDOWN 87
#กำหนดขั้นต่ำ 221
#กำหนดมินดาวน์ 61
/* สิ้นสุดรหัสผู้ใช้รวมถึง */

/* typedef ส่วนตัว ———————————————————–*/
/* รหัสผู้ใช้เริ่มต้น PTD */

/* รหัสผู้ใช้ สิ้นสุด PTD */

/* ส่วนตัวกำหนด ————————————————————*/
/* รหัสผู้ใช้ BEGIN PD */
/* รหัสผู้ใช้ สิ้นสุด PD */

/* มาโครส่วนตัว ————————————————————-*/
/* USER CODE เริ่ม PM */

/* USER CODE สิ้นสุด PM */

/* ตัวแปรส่วนตัว ———————————————————*/

/* รหัสผู้ใช้เริ่มต้น PV */
uint32_t upCount=0;
uint16_t ค่าเพิ่ม=0;
uint16_t ค่าลง=0;
uint8_t isUpCapt=1;
ความกว้าง uint16_t=0;
บัฟเฟอร์ uint16_t[128]-{0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* PV สิ้นสุดรหัสผู้ใช้ */

/* ต้นแบบฟังก์ชันส่วนตัว ———————————————–*/
เป็นโมฆะ SystemClock_Config(เป็นโมฆะ);
/* รหัสผู้ใช้เริ่มต้น PFP */

/* รหัสผู้ใช้สิ้นสุด PFP */

/* รหัสผู้ใช้ส่วนตัว ———————————————————*/
/* รหัสผู้ใช้เริ่มต้น 0 */
เป็นโมฆะ HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
อัพนับ++;
}
เป็นโมฆะ HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ถ้า(isUpCapt)//หากเป็นการจับขอบที่เพิ่มขึ้น
{
ValueUp=HAL_TIM_ReadCapturedValue(ทิม,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(ทิม,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
จำนวนขึ้น=0;
}
อื่น{
ValueDown=HAL_TIM_ReadCapturedValue(ทิม,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(ทิม,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
ถ้า(ความกว้าง>4400&&ความกว้าง<4600)
{
รหัสบัฟเฟอร์=0;
บัฟเฟอร์[รหัสบัฟเฟอร์++]=ความกว้าง;
}
อย่างอื่นถ้า(รหัสบัฟเฟอร์>0)
{
บัฟเฟอร์[รหัสบัฟเฟอร์++]=ความกว้าง;
ถ้า(รหัสบัฟเฟอร์>32)
{
rcvFalg=1;
รหัสบัฟเฟอร์=0;
}
}
}
}
เป็นโมฆะ bitBuffer2num(ถ่านหมายเลข[])
{
หมายเลข[0]=0;
หมายเลข[1]=0;
หมายเลข[2]=0;
หมายเลข[3]=0;
สำหรับ(อินท์ i=0;ฉัน<32;ฉัน++)
{
ถ้า(บัฟเฟอร์[ฉัน+1]<1000)
{
หมายเลข[ฉัน/8]=หมายเลข[ฉัน/8]<<1;
}
อื่น
{
หมายเลข[ฉัน/8]=หมายเลข[ฉัน/8]<<1;
หมายเลข[ฉัน/8]|=0x01;
}
}
}
/* รหัสผู้ใช้สิ้นสุด 0 */

/**
* @brief จุดเข้าสู่แอปพลิเคชัน.
* @retval int
*/
int หลัก(เป็นโมฆะ)
{
/* รหัสผู้ใช้เริ่มต้น 1 */
ถ่าน printbuff[128]-{0};
ถ่านหมายเลข[4]-{0};
คีย์ถ่าน=0;
/* รหัสผู้ใช้สิ้นสุด 1 */

/* การกำหนดค่า MCU——————————————————–*/

/* รีเซ็ตอุปกรณ์ต่อพ่วงทั้งหมด, เริ่มต้นอินเทอร์เฟซ Flash และ Systick. */
HAL_เริ่มต้น();

/* รหัสผู้ใช้เริ่มต้น เริ่มต้น */

/* รหัสผู้ใช้สิ้นสุด เริ่มต้น */

/* กำหนดค่านาฬิกาของระบบ */
SystemClock_Config();

/* รหัสผู้ใช้เริ่มต้น SysInit */

/* รหัสผู้ใช้สิ้นสุด SysInit */

/* เริ่มต้นอุปกรณ์ต่อพ่วงที่กำหนดค่าไว้ทั้งหมด */
MX_GPIO_เริ่มต้น();
MX_TIM4_เริ่มต้น();
MX_USART1_UART_เริ่มต้น();
/* รหัสผู้ใช้เริ่มต้น 2 */

/* รหัสผู้ใช้สิ้นสุด 2 */

/* วนซ้ำไม่สิ้นสุด */
/* รหัสผู้ใช้เริ่มต้นในขณะที่ */
HAL_GPIO_TogglePin(LED0_GPIO_พอร์ต,LED0_พิน);
HAL_TIM_Base_Start_IT(&htim4);//การอัปเดตตัวจับเวลาทำให้เกิดการขัดจังหวะ
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
ในขณะที่ (1)
{
ถ้า(rcvFalg)
{
สำหรับ(อินท์ i=0;ฉัน<4;ฉัน++)
{
บิตบัฟเฟอร์2num(หมายเลข);
วิ่ง(หนังพิมพ์,”0xx “,หมายเลข[ฉัน]);
HAL_UART_ส่ง(&huart1, พิมพ์บัฟ,สเตรน(หนังพิมพ์),HAL_MAX_DELAY);
}
// วิ่ง(หนังพิมพ์,”%คุณ “,บัฟเฟอร์[ฉัน]);
// HAL_UART_ส่ง(&huart1, พิมพ์บัฟ,สเตรน(หนังพิมพ์),HAL_MAX_DELAY);
// }
HAL_UART_ส่ง(&ฮวาร์ต1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
พิมพ์ฉ(“%d\r\n”,หมายเลข[3]);
ถ้า(หมายเลข[3]==157)
{
พิมพ์ฉ(“111111\r\n”);
}
HAL_ดีเลย์(1000);
/* รหัสผู้ใช้สิ้นสุดในขณะนั้น */

/* รหัสผู้ใช้เริ่มต้น 3 */
}
/* รหัสผู้ใช้สิ้นสุด 3 */
}

/**
* @brief การกำหนดค่านาฬิการะบบ
* @retval ไม่มี
*/
เป็นโมฆะ SystemClock_Config(เป็นโมฆะ)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};