สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ขณะนี้ ฉันกำลังสร้างเครื่องส่ง/เครื่องรับ RC โดยใช้ชิป SX1280 RF เป้าหมายหนึ่งของโครงการคือฉันต้องการความละเอียดเซอร์โว 12 บิตจากแท่งทั้งหมดไปจนถึงเซอร์โว ส่วนหนึ่งเนื่องจากเซอร์โวดิจิตอลสมัยใหม่มีความละเอียด 12 บิต อย่างที่สอง เครื่องส่งสัญญาณระดับไฮเอนด์ก็ใช้ 12 บิตอยู่ดี ฉันกำลังตรวจสอบว่าฉันสามารถสร้างสัญญาณ PWM ความละเอียดสูงบนอุปกรณ์ STM32 ได้อย่างไร ตอนนี้ฉันกำลังใช้ยาสีดำ (STM32F103C8T8) สำหรับต้นแบบ
ขั้นตอนที่ 1: รายการชิ้นส่วน
ฮาร์ดแวร์
- บอร์ดพัฒนา STM32F103 ใดๆ (เม็ดสีน้ำเงิน เม็ดสีดำ ฯลฯ)
- ธนาคารพลังงาน USB เป็นแหล่งจ่ายไฟ
- โปรแกรมเมอร์ STM32 (Segger j-links, ST-LINK/V2 หรือเพียงแค่โคลน st-link)
ซอฟต์แวร์
- STM32CubeMX
- Atolic TrueSTUDIO สำหรับ STM32
- แหล่งที่มาของโครงการจาก github
ขั้นตอนที่ 2: ทางออกที่ชัดเจน
น่าจะเป็นทางออกที่ง่ายที่สุดคือการใช้ตัวจับเวลาตัวใดตัวหนึ่งที่สามารถสร้างสัญญาณ PWM เช่น TIM1-3 บน STM32F103 สำหรับเซอร์โวดิจิตอลสมัยใหม่ อัตราเฟรมสามารถลดลงเหลือ 5 มิลลิวินาทีหรือมากกว่านั้น แต่สำหรับเซอร์โวอนาล็อกแบบเก่า ควรเป็น 20 มิลลิวินาทีหรือ 50 เฮิรตซ์ ดังนั้น ในสถานการณ์กรณีที่เลวร้ายที่สุด เรามาสร้างเรื่องนั้นกัน ด้วยนาฬิกา 72 MHz และความละเอียดตัวนับตัวจับเวลา 16 บิต เราจำเป็นต้องตั้งค่าตัวจับเวลาล่วงหน้าของตัวจับเวลาเป็น 23 ขั้นต่ำเพื่อให้ครอบคลุมอัตราเฟรม 20 ms ฉันเลือก 24 เพราะจากนั้นเป็นเวลา 20 มิลลิวินาที ฉันต้องตั้งค่าตัวนับเป็น 60000 อย่างแน่นอน คุณสามารถดูการตั้งค่า CubeMX และสัญญาณ PWM 1 และ 1.5 ms ที่สร้างขึ้นในภาพหน้าจอ ขออภัย สำหรับ 1ms ตัวนับของตัวจับเวลาควรตั้งไว้ที่ 3000 ซึ่งจะทำให้เรามีความละเอียดเพียง 11 บิตเท่านั้น ไม่เลว แต่เป้าหมายคือ 12 บิต ดังนั้นลองอย่างอื่น
แน่นอน ถ้าฉันจะเลือกไมโครคอนโทรลเลอร์ที่มีตัวจับเวลาแบบ 32 บิต เช่น STM32L476 ความละเอียดนี้จะสูงขึ้นมากและปัญหาก็จะได้รับการแก้ไข
แต่ในที่นี้ ฉันอยากจะเสนอทางเลือกอื่นที่จะเพิ่มความละเอียดให้มากขึ้น แม้กระทั่งใน STM32F103
ขั้นตอนที่ 3: Cascading Timers สำหรับความละเอียดสูงขึ้น
ปัญหาหลักของวิธีแก้ไขก่อนหน้านี้คืออัตราเฟรม (20 ms) ค่อนข้างสูงเมื่อเทียบกับสัญญาณ PWM ที่สร้างขึ้นจริง (ระหว่าง 1 ถึง 2 ms) ดังนั้นเราจึงสูญเสียบิตที่มีค่าสำหรับ 18 ms ที่เหลือเมื่อเรารอ เฟรมถัดไป ซึ่งสามารถแก้ไขได้ด้วยตัวจับเวลาแบบเรียงซ้อนโดยใช้คุณสมบัติลิงก์ตัวจับเวลาสำหรับการซิงโครไนซ์
แนวคิดคือฉันจะใช้ TIM1 เป็นต้นแบบเพื่อสร้างอัตราเฟรม (20 ms) และ TIM2, TIM3 เพื่อรับมือกับสัญญาณ PWM เป็นทาส เมื่อมาสเตอร์ทริกเกอร์ทาส พวกมันจะสร้างสัญญาณ PWM ในโหมดพัลส์เดียวเท่านั้น ดังนั้นฉันต้องครอบคลุม 2 ms ในตัวจับเวลาเหล่านั้นเท่านั้น โชคดีที่คุณสามารถเรียงตัวจับเวลาเหล่านั้นในฮาร์ดแวร์ได้ ดังนั้นการซิงโครไนซ์นี้จึงไม่ต้องการการแทรกแซงจากโปรเซสเซอร์ และมันแม่นยำมากเช่นกัน ความกระวนกระวายใจอยู่ในขอบเขต ps คุณสามารถดูการตั้งค่า CubeMX ได้จากภาพหน้าจอ
อย่างที่คุณเห็น ฉันเลือก 3 เป็นพรีสเกลาร์ ดังนั้นสำหรับ 2 มิลลิวินาที ฉันต้องตั้งค่า 48000 ในตัวนับของตัวจับเวลา สิ่งนี้ทำให้เรา 24000 สำหรับ 1 ms ซึ่งจริง ๆ แล้วเราต้องการมากกว่าสำหรับความละเอียด 14 บิต ตาด้า…
โปรดดูภาพหน้าจอของออสซิลโลสโคปในบทนำเพื่อผลลัพธ์สุดท้าย แชนเนล 3 (สีม่วง) เป็นการขัดจังหวะของตัวจับเวลาหลักซึ่งจะกระตุ้นการบรรเทาเพื่อสร้างหนึ่งพัลส์ ช่องสัญญาณ 1 และ 4 (ลำแสงสีเหลืองและสีเขียว) เป็นสัญญาณ PWM จริงที่สร้างโดยตัวจับเวลาที่แตกต่างกัน โปรดทราบว่ามันซิงค์กันแต่จะซิงค์ที่ขอบต่อท้าย นั่นเป็นเพราะโหมด PWM 2 นี่ไม่ใช่ปัญหาเพราะอัตรา PWM สำหรับเซอร์โวนั้นยังคงถูกต้อง
ประโยชน์อื่นๆ ของโซลูชันนี้คือการเปลี่ยนอัตราเฟรมหมายถึงการเปลี่ยนช่วงเวลาใน TIM1 เท่านั้น สำหรับเซอร์โวดิจิตอลสมัยใหม่ คุณสามารถเพิ่มได้ถึง 200-300 เฮิรตซ์ แต่โปรดอ่านคู่มือของเซอร์โวหากคุณต้องการปรับแต่ง