คลาส Timer -- ควบคุมตัวจับเวลาภายใน¶
ตัวจับเวลาสามารถใช้งานได้หลากหลายรูปแบบ ในขณะนี้ มีการรองรับเฉพาะกรณีพื้นฐานที่สุดเท่านั้น ได้แก่ การเรียกฟังก์ชันซ้ำๆ ตามช่วงเวลาที่กำหนด
ตัวจับเวลาแต่ละตัวประกอบด้วยตัวนับที่นับขึ้นในอัตราหนึ่ง อัตราที่นับคือความถี่สัญญาณนาฬิกาของอุปกรณ์ต่อพ่วง (เป็น Hz) หารด้วยตัวหารของตัวจับเวลา เมื่อตัวนับถึงค่าคาบของตัวจับเวลา ก็จะก่อให้เกิดเหตุการณ์และตัวนับจะรีเซตกลับเป็นศูนย์ ด้วยการใช้เมธอด callback ตัวจับเวลาสามารถเรียกฟังก์ชัน Python ได้
ตัวอย่างการใช้งานเพื่อสลับสถานะ LED ด้วยความถี่คงที่:
tim = pyb.Timer(4) # create a timer object using timer 4
tim.init(freq=2) # trigger at 2Hz
tim.callback(lambda t:pyb.LED(1).toggle())
ตัวอย่างการใช้ฟังก์ชันที่มีชื่อสำหรับ callback:
def tick(timer): # we will receive the timer object when being called
print(timer.counter()) # show current timer's counter value
tim = pyb.Timer(4, freq=1) # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick) # set the callback to our tick function
ตัวอย่างเพิ่มเติม:
tim = pyb.Timer(4, freq=100) # freq in Hz
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter() # get counter (can also set)
tim.prescaler(2) # set prescaler (can also get)
tim.period(199) # set period (can also get)
tim.callback(lambda t: ...) # set callback for update interrupt (t=tim instance)
tim.callback(None) # clear callback
หมายเหตุ: Timer(1) ถูกใช้สำหรับกล้อง ในทำนองเดียวกัน Timer(5) ควบคุมไดรเวอร์เซอร์โว และ Timer(6) ใช้สำหรับการอ่าน/เขียน ADC/DAC แบบตั้งเวลา แนะนำให้ใช้ตัวจับเวลาตัวอื่นในโปรแกรมของคุณ
หมายเหตุ: ไม่สามารถจัดสรรหน่วยความจำระหว่าง callback (อินเทอร์รัปต์) ได้ ดังนั้นข้อยกเว้นที่เกิดขึ้นภายใน callback จะไม่ให้ข้อมูลมากนัก ดู micropython.alloc_emergency_exception_buf() สำหรับวิธีหลีกเลี่ยงข้อจำกัดนี้
ตัวสร้าง¶
- class pyb.Timer(id: int, *args, **kwargs)¶
สร้างออบเจ็กต์ตัวจับเวลาใหม่ด้วย id ที่กำหนด หากมีอาร์กิวเมนต์เพิ่มเติม ตัวจับเวลาจะถูกเริ่มต้นด้วย
init(...)ชุดค่าidที่ถูกต้องขึ้นอยู่กับ STM32 MCU บน OpenMV Cam ที่ใช้งาน โปรดดูคู่มืออ้างอิง STM32 สำหรับตัวจับเวลาเอนกประสงค์และตัวควบคุมขั้นสูงที่มีให้ใช้เมธอด¶
- init(*, freq: int | float | None = None, prescaler: int | None = None, period: int | None = None, mode: int = Timer.UP, div: int = 1, callback: Callable[[Timer], None] | None = None, deadtime: int = 0, brk: int = Timer.BRK_OFF, hard: bool = True) None¶
เริ่มต้นตัวจับเวลา การเริ่มต้นต้องระบุด้วยความถี่ (เป็น Hz) หรือตัวหารและคาบ:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
อาร์กิวเมนต์แบบคีย์เวิร์ด:
freq--- ระบุความถี่แบบคาบของตัวจับเวลา คุณอาจมองว่านี่คือความถี่ที่ตัวจับเวลาใช้ผ่านหนึ่งรอบสมบูรณ์prescaler[0-0xffff] - ระบุค่าที่จะโหลดเข้า Prescaler Register (PSC) ของตัวจับเวลา แหล่งสัญญาณนาฬิกาของตัวจับเวลาจะถูกหารด้วย(prescaler + 1)เพื่อหาสัญญาณนาฬิกาของตัวจับเวลา แหล่งสัญญาณนาฬิกามาจาก APB bus แม่ของตัวจับเวลาและ ขึ้นอยู่กับ MCU บน STM32 ตัวจับเวลาบน APB1 โดยทั่วไปใช้สัญญาณนาฬิกาที่2 * pclk1และตัวจับเวลาบน APB2 ที่2 * pclk2อ่านความถี่ bus ปัจจุบันด้วยpyb.freq()และดูคู่มืออ้างอิง STM32 สำหรับ MCU ของ OpenMV Camperiod[0-0xffff] สำหรับตัวจับเวลา 1, 3, 4 และ 6-15 [0-0x3fffffff] สำหรับตัวจับเวลา 2 และ 5 ระบุค่าที่จะโหลดเข้า AutoReload Register (ARR) ของตัวจับเวลา ค่านี้กำหนดคาบของตัวจับเวลา (กล่าวคือ เมื่อตัวนับวนรอบ) ตัวนับจะโรลโอเวอร์หลังจากperiod + 1รอบสัญญาณนาฬิกาของตัวจับเวลาmodeสามารถเป็นหนึ่งใน:Timer.UP- กำหนดค่าตัวจับเวลาให้นับจาก 0 ถึง ARR (ค่าเริ่มต้น)Timer.DOWN- กำหนดค่าตัวจับเวลาให้นับจาก ARR ลงมาถึง 0Timer.CENTER- กำหนดค่าตัวจับเวลาให้นับจาก 0 ถึง ARR แล้วกลับลงมาถึง 0
divสามารถเป็นหนึ่งใน 1, 2 หรือ 4 หารสัญญาณนาฬิกาของตัวจับเวลาเพื่อกำหนดสัญญาณนาฬิกาการสุ่มตัวอย่างที่ใช้โดยฟิลเตอร์ดิจิทัลcallback- ตามที่ระบุใน Timer.callback()deadtime- ระบุปริมาณเวลา "dead" หรือเวลาหยุดระหว่างการเปลี่ยนสถานะบนช่องสัญญาณเสริม (ทั้งสองช่องสัญญาณจะหยุดทำงานในช่วงเวลานี้)deadtimeอาจเป็นจำนวนเต็มระหว่าง 0 ถึง 1008 โดยมีข้อจำกัดดังนี้: 0-128 เพิ่มทีละ 1, 128-256 เพิ่มทีละ 2, 256-512 เพิ่มทีละ 8 และ 512-1008 เพิ่มทีละ 16deadtimeวัดจำนวนเทิกของsource_freqหารด้วยสัญญาณนาฬิกาdivdeadtimeใช้ได้เฉพาะกับตัวจับเวลา 1 และ 8 เท่านั้นbrk- ระบุว่าจะใช้โหมด break เพื่อหยุด output ของ PWM เมื่อBRK_INinput ถูกกระตุ้นหรือไม่ ค่าของอาร์กิวเมนต์นี้กำหนดว่า break เปิดใช้งานและมีขั้วใด และสามารถเป็นหนึ่งในTimer.BRK_OFF,Timer.BRK_LOWหรือTimer.BRK_HIGHเพื่อเลือกพินBRK_INให้สร้างออบเจ็กต์ Pin ด้วยmode=Pin.ALT, alt=Pin.AFn_TIMxลักษณะ GPIO input ของพินสามารถใช้งานได้ในโหมด alt ได้แก่pull=,value()และirq()hardสามารถเป็นหนึ่งใน:True- callback จะถูกเรียกใช้ในบริบท hard interrupt ซึ่งลดความหน่วงและความสั่นไหวให้น้อยที่สุด แต่ต้องอยู่ภายใต้ข้อจำกัดที่อธิบายไว้ใน การเขียนตัวจัดการอินเทอร์รัปต์ รวมถึงไม่สามารถจัดสรรบน heap ได้False- callback จะถูกกำหนดเวลาเป็น soft interrupt ซึ่งอนุญาตให้จัดสรรได้ แต่อาจทำให้เกิดความหน่วงและความสั่นไหวจากการ garbage-collection
ค่าเริ่มต้นของตัวเลือกนี้คือ True
คุณต้องระบุ freq หรือทั้ง period และ prescaler
- deinit() None¶
ยกเลิกการเริ่มต้นตัวจับเวลา
ปิดใช้งาน callback (และ irq ที่เกี่ยวข้อง)
ปิดใช้งาน callback ของช่องสัญญาณ (และ irq ที่เกี่ยวข้อง) หยุดตัวจับเวลา และปิดใช้งานอุปกรณ์ต่อพ่วงของตัวจับเวลา
- callback(fun: Callable[[Timer], None] | None) None¶
ตั้งค่าฟังก์ชันที่จะถูกเรียกเมื่อตัวจับเวลาทริกเกอร์
funจะถูกส่งอาร์กิวเมนต์ 1 ตัว คือออบเจ็กต์ตัวจับเวลา หากfunเป็นNonecallback จะถูกปิดใช้งาน
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
หากส่งเฉพาะหมายเลขช่องสัญญาณ ออบเจ็กต์ช่องสัญญาณที่เริ่มต้นไว้ก่อนหน้าจะถูกส่งคืน (หรือ
Noneหากไม่มีช่องสัญญาณก่อนหน้า)มิเช่นนั้น ออบเจ็กต์ TimerChannel จะถูกเริ่มต้นและส่งคืน
แต่ละช่องสัญญาณสามารถกำหนดค่าเพื่อทำ pwm, output compare หรือ input capture ทุกช่องสัญญาณใช้ตัวจับเวลาพื้นฐานร่วมกัน ซึ่งหมายความว่าพวกมันใช้สัญญาณนาฬิกาของตัวจับเวลาร่วมกัน
อาร์กิวเมนต์แบบคีย์เวิร์ด:
modeสามารถเป็นหนึ่งใน:Timer.PWM--- กำหนดค่าตัวจับเวลาในโหมด PWM (active high)Timer.PWM_INVERTED--- กำหนดค่าตัวจับเวลาในโหมด PWM (active low)Timer.OC_TIMING--- ระบุว่าไม่มีพินที่ถูกขับเคลื่อนTimer.OC_ACTIVE--- พินจะถูกทำให้ active เมื่อมีการจับคู่ compare (active ถูกกำหนดโดยขั้ว)Timer.OC_INACTIVE--- พินจะถูกทำให้ inactive เมื่อมีการจับคู่ compareTimer.OC_TOGGLE--- พินจะสลับสถานะเมื่อมีการจับคู่ compareTimer.OC_FORCED_ACTIVE--- พินถูกบังคับให้ active (การจับคู่ compare จะถูกละเว้น)Timer.OC_FORCED_INACTIVE--- พินถูกบังคับให้ inactive (การจับคู่ compare จะถูกละเว้น)Timer.IC--- กำหนดค่าตัวจับเวลาในโหมด Input CaptureTimer.ENC_A--- กำหนดค่าตัวจับเวลาในโหมด Encoder ตัวนับจะเปลี่ยนแปลงเฉพาะเมื่อ CH1 เปลี่ยนTimer.ENC_B--- กำหนดค่าตัวจับเวลาในโหมด Encoder ตัวนับจะเปลี่ยนแปลงเฉพาะเมื่อ CH2 เปลี่ยนTimer.ENC_AB--- กำหนดค่าตัวจับเวลาในโหมด Encoder ตัวนับจะเปลี่ยนแปลงเมื่อ CH1 หรือ CH2 เปลี่ยน
callback- ตามที่ระบุใน TimerChannel.callback()pinNone (ค่าเริ่มต้น) หรือออบเจ็กต์ Pin หากระบุ (และไม่ใช่ None) จะทำให้ฟังก์ชันสำรองของพินที่ระบุถูกกำหนดค่าสำหรับช่องสัญญาณตัวจับเวลานี้ จะเกิดข้อผิดพลาดหากพินไม่รองรับฟังก์ชันสำรองใดๆ สำหรับช่องสัญญาณตัวจับเวลานี้
อาร์กิวเมนต์แบบคีย์เวิร์ดสำหรับโหมด Timer.PWM:
pulse_width- กำหนดค่าความกว้างพัลส์เริ่มต้นที่จะใช้pulse_width_percent- กำหนดเปอร์เซ็นต์ความกว้างพัลส์เริ่มต้นที่จะใช้
อาร์กิวเมนต์แบบคีย์เวิร์ดสำหรับโหมด Timer.OC:
compare- กำหนดค่าเริ่มต้นของรีจิสเตอร์ comparepolarityสามารถเป็นหนึ่งใน:Timer.HIGH- output เป็น active highTimer.LOW- output เป็น active low
อาร์กิวเมนต์แบบคีย์เวิร์ดที่เป็นทางเลือกสำหรับโหมด Timer.IC:
polarityสามารถเป็นหนึ่งใน:Timer.RISING- จับภาพที่ rising edgeTimer.FALLING- จับภาพที่ falling edgeTimer.BOTH- จับภาพที่ทั้งสอง edge
โปรดทราบว่า capture ใช้งานได้เฉพาะกับช่องสัญญาณหลักเท่านั้น ไม่ใช่ช่องสัญญาณเสริม
หมายเหตุสำหรับโหมด Timer.ENC:
ต้องใช้ 2 พิน ดังนั้นพินหนึ่งหรือทั้งสองพินจะต้องกำหนดค่าให้ใช้ timer AF ที่เหมาะสมโดยใช้ Pin API
อ่านค่า encoder ด้วยเมธอด timer.counter()
ใช้งานได้เฉพาะกับ CH1 และ CH2 (ไม่ใช่ CH1N หรือ CH2N)
หมายเลขช่องสัญญาณจะถูกละเว้นเมื่อตั้งค่าโหมด encoder
ตัวอย่าง PWM -- บน OpenMV Cam STM32 ทุกรุ่น ช่องสัญญาณ 1 และ 2 ของ
TIM4จะถูกเชื่อมต่อกับพิน headerP7และP8ตามลำดับ:timer = pyb.Timer(4, freq=1000) ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.P7, pulse_width=8000) ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.P8, pulse_width=16000)
ค่าคงที่¶
ค่าคงที่โหมดตัวนับ (อาร์กิวเมนต์
modeของinit()):ค่าคงที่โหมด break (อาร์กิวเมนต์
brkของinit()):ค่าคงที่โหมดช่องสัญญาณ (อาร์กิวเมนต์
modeของchannel()):- OC_FORCED_ACTIVE: int¶
โหมด output-compare forced-active พินถูกบังคับให้ active และการจับคู่ compare จะถูกละเว้น
- OC_FORCED_INACTIVE: int¶
โหมด output-compare forced-inactive พินถูกบังคับให้ inactive และการจับคู่ compare จะถูกละเว้น
ขั้วของ output-compare (อาร์กิวเมนต์
polarityของchannel()ในโหมด OC):ขั้วของ input-capture (อาร์กิวเมนต์
polarityของchannel()ในโหมด IC):