Bộ đếm thời gian là một thiết bị ngoại vi được tích hợp trong hầu hết các bộ vi điều khiển, cung cấp cho người dùng nhiều ứng dụng như xác định chính xác khoảng thời gian, đo đếm xung đầu vào, điều khiển đầu ra dạng sóng đầu vào, băm…. stm32f411 có 8 bộ định thời, trong đó có bộ hẹn giờ điều khiển nâng cao (tim1), thường được các thư viện sử dụng để tạo bộ định thời hệ thống tiêu chuẩn (chẳng hạn như ngắt đánh dấu hệ thống, bộ tạo trễ, thời gian chờ …) và 7 bộ chung mục đích – Sử dụng bộ định thời (tim2 đến tim5 và tim9 đến tim11).
Bài viết này giúp bạn hiểu cấu trúc, chức năng và ứng dụng cơ bản của khối bộ định thời trên vi điều khiển stm32f411.
[Học trực tuyến: lập trình bộ điều khiển stm32, arm cortex-m]
Tôi. Đơn vị cơ sở thời gian: Thành phần chính của bộ đếm thời gian là bộ đếm – bộ đếm (cnt) , ngưỡng trên được đặt bởi thanh ghi tự động tải lại (arr) . Bộ đếm có thể đếm lên hoặc đếm ngược. Đầu vào của đồng hồ cho bộ đếm có thể được chia bằng một bộ chia – bộ định mức. Người dùng có thể thực hiện các hướng dẫn đọc và ghi vào các thanh ghi cnt, arr và psc để cấu hình khối cơ sở cho mỗi bộ định thời. – Thanh ghi Counter (timx_cnt): Khi hoạt động, giá trị của thanh ghi này tăng hoặc giảm theo từng xung nhịp đầu vào. Tùy thuộc vào bộ đếm thời gian, bộ đếm này có thể là 16-bit hoặc 32-bit. – Thanh ghi prescaler (timx_psc): Giá trị của thanh ghi prescaler (16bit) cho phép người dùng cấu hình bộ chia đầu vào (ck_psc) thành bất kỳ giá trị nào trong [1-65536]. Sử dụng kết hợp bộ định thời và bộ chia của rcc có thể thay đổi thời gian mà mỗi cnt đếm, giúp tạo khoảng thời gian và điều chỉnh độ rộng xung cho phù hợp với nhu cầu. – Thanh ghi tự động tải lại (timx_arr): giá trị của arr được người dùng xác định trước khi cài đặt bộ đếm thời gian, làm cơ sở để tải lại giá trị đếm mỗi khi tràn cnt (tràn khi đếm lên – cnt vượt quá giá trị.arr, đếm ngược Dưới tràn – cnt nhỏ hơn 0). Tùy thuộc vào bộ đếm thời gian, bộ đếm này có thể là 16-bit hoặc 32-bit.
II. Các chế độ hoạt động: – Các chế độ đếm: Mỗi bộ timer đều hỗ trợ 3 chế chế độ đếm sau: + Upcounting mode (chế độ đếm lên): Ở chế độ này, CNT đếm lên từ 0 (hoặc một giá trị nào đó được người dùng ghi vào CNT trước) đến giá trị của thanh ghi ARR, sau đó CNT bắt đầu lại từ 0. Lúc này có sự kiện tràn counter – overflow, sự kiện này có thể tạo yêu cầu ngắt nếu người dùng cấu hình cho phép ngắt. Một ví dụ với ARR = 36: + Downcouting mode (chế độ đếm xuống): Ở chế độ này, CNT đếm xuống từ giá trị thanh ghi ARR (hoặc 1 giá trị nào đó do người dùng ghi trực tiếp vào CNT trước) đến 0, sau đó CNT bắt đầu lại từ giá trị ARR, lúc này có sự kiện tràn counter – underflow, sự kiện này có thể tạo yêu cầu ngắt nếu người dùng cấu hình cho phép ngắt. Một ví dụ với ARR = 36: + Center-Aligned mode (chế độ đếm lên và xuống): Ở chế độ này, counter sẽ đếm lên từ 0 (hoặc một giá trị nào đó được người dùng ghi vào CNT trước) đến giá trị thanh ghi ARR – 1, lúc này xuất hiện sự kiện tràn counter – overflow, tiếp theo CNT sẽ đếm xuống từ ARR tới 1, lúc này có sự kiện tràn counter – underflow, sau đó CNT sẽ về giá trị 0 và bắt đầu lại quá trình đếm lên. Một ví dụ với ARR = 06:
Ba. Lựa chọn đồng hồ bộ định thời: Đồng hồ bộ đếm là nguồn cho các hoạt động tăng / giảm cnt, có thể được cấu hình tùy chọn từ các nguồn sau: – Đồng hồ bên trong (ck_int): chọn nguồn đồng hồ từ đồng hồ hệ thống, có thể từ thạch anh tạo dao động tần số cao (hse) bên ngoài hoặc bộ dao động rc tần số cao tích hợp sẵn (hsi), từ đó thông qua bộ chia của hệ thống. Hệ thống đồng hồ cung cấp thiết bị ngoại vi hẹn giờ (đồng hồ ck_psc đầu vào của tim2 đến tim5 bằng đồng hồ bus apb1 và đồng hồ ck_psc của tim9 đến tim11 bằng đồng hồ bus apb2). ck_psc là đồng hồ không có bộ đếm trước của khối bộ định thời.
– External clock mode1: Nếu chọn mode này thì counter có thể đếm mỗi khi chân external input pin (TIx) xuất hiện sườn lên hoặc sườn xuống, người dùng cấu hình chọn sườn. – External clock mode2: Nếu chọn mode này thì counter có thể đếm mỗi khi chân external trigger input (ETR) xuất hiện sườn lên hoặc sườn xuống. (Mode này chỉ có ở các bộ TIM2, TIM3, TIM4). – Internal trigger inputs (ITRx): Mode này cho phép sử dụng một timer làm bộ prescaler cho một bộ timer khác. IV. Các kênh Caputer/Campare: Mỗi bộ timer có 4 kênh Capture/Compare độc lập, mỗi kênh này phối hợp Time-base unit có thể tạo ra các tính năng sau: – Input caputer: Ở chế độ Input capture, thanh ghi CCR của kênh đầu vào tương ứng sẽ được sử dụng để lưu giá trị của CNT khi phát hiện sự thay đổi mức logic (sườn lên/ sườn xuống) như được cấu hình trước đó. Từ đó có thể biết được khoảng thời gian giữa 2 lần có sườn lên hoặc sườn xuống. – Output compare: Chế độ này thường được sử dụng để điều khiển đầu ra của 1 I/O PIN khi timer đạt được một chu kỳ thời gian, cũng chính là khi giá trị CNT đếm tới giá trị bằng với giá trị thanh ghi capture/campare (đã được nạp sẵn). Người dùng có thể cài đặt I/O Pin tương ứng với các giá trị logic: mức 1, mức 0 hoặc đảo giá trị logic hiện tại. Đồng thời, cờ ngắt được bật lên và yêu cầu ngắt cũng được tạo ra nếu người dùng cấu hình cho phép ngắt. – PWM generation: Tính năng điều chế độ rộng xung cho phép tạo ra xung với tần số được xác định bởi giá trị của thanh ghi ARR, và chu kỳ nhiệm vụ (Duty cycle) được xác định bởi giá trị thanh ghi CCR.
STM32F411 hỗ trợ 2 chế độ PWM như sau: + Mode1: Nếu sử dụng chế độ đếm lên thì ngõ ra sẽ ở mức logic 1 khi CNT <CCR và ngược lại, ở mức 0 nếu CNT>CCR. Nếu sử dụng chế độ đếm xuống, đầu ra sẽ ở mức 0 khi CNT > CCR và ngược lại, ở mức 1 khi CNT < CCR. + Mode2: Nếu sử dụng chế độ đếm lên thì ngõ ra sẽ ở mức logic 0 khi CNT <CCR và ngược lại, ở mức 1 nếu CNT>CCR. Nếu sử dụng chế độ đếm xuống, đầu ra sẽ ở mức 1 khi CNT > CCR và ngược lại, ở mức 0 khi CNT<CCR. PWM được sử dụng trong rất nhiều ứng dụng như điều chỉnh điện áp đầu ra để thay đổi độ sáng đèn LED, điều khiển động cơ; điều chế bản tin bởi sóng mang, tạo âm thanh… – One-pulse mode output: Chế độ này là một trường hợp cụ thể PWM, giúp tạo ra 1 xung với độ rộng xung có thể cấu hình được. Counter sẽ được dừng lại tự động khi tràn overflow/underflow.
v. Bài tập với bộ đếm thời gian (đã cập nhật) Bài tập 1: Thay đổi trạng thái đèn led sau mỗi 1 giây, sử dụng đơn vị cơ sở thời gian.
Bước 1: Nhấp vào dòng stm32f411vetx và chọn “bắt đầu dự án”.
Bước 2: Chọn dòng nối tiếp để tải mã
Bước 3: Nhấp chuột phải vào chân pd12 và chọn hộp gpio_output
Bước 3: Nhấp vào Hẹn giờ -> Chọn trái tim2
Áp dụng công thức (1)
Prescaler = 1599, Period = 9999 Chúng tôi có bộ đếm thời gian ngắt = 1 giây
Bước 4: Nhấp vào tab cài đặt nvic, nhấp vào Bật ngắt tim2
Bước 5: Thiết lập dự án và tạo mã
Bước 6: Lập trình trong phần mềm keil c
Trong tệp main.c tab các chức năng , bạn có thể tìm thấy tệp stm32f4xx_hal_tim.c. Gọi hàm hal_tim_periodelapsedcallback như sau:
Tiếp theo trong main (), hãy gọi hal_tim_base_start_it để bắt đầu làm gián đoạn heart2:
Bước 7: Xây dựng và Chạy. Quan sát led pd12 sẽ thay đổi trạng thái 1s 1 lần
Bài tập 2: Kiểm soát độ sáng pwm.
Định cấu hình lõi hệ thống và gpio vẫn thực hiện theo các hướng dẫn ở trên.
Bước đầu tiên: định cấu hình cài đặt tham số của hàm pwm
Áp dụng phương trình (1) ở trên với bộ đếm trước = 3 và chu kỳ bộ đếm = 199, chúng tôi tạo ra một xung có tần số pwm_frequency = 20000 khz
Bước 2: Led ngoài vào chân pa1 để điều khiển độ sáng LED Bước 3: Định cấu hình dự án và tạo mã
Bước thứ tư: chuyển sang phần mềm keil c để bắt đầu viết mã
Trong mã người dùng bắt đầu pv, chúng tôi khai báo biến uint8_t pwm để đặt giá trị của thanh ghi ccr (thanh ghi so sánh chụp)
Gọi hal_tim_pwm_start để bắt đầu băm ở pin pa1
Trong hàm while (), chúng ta thực hiện bước chiếu sáng dần led cho đến khi led đạt độ sáng cực đại, sau đó 2 giây thì độ sáng của led giảm dần. Khi đèn led tắt, hãy lặp lại các bước trên sau 2 giây.
Bước 5: Xây dựng dự án và nhấn Load để chạy chương trình.
nghiên cứu và phát triển cánh tay tapit