BÀI 14: ENCODER VỚI STM32F103.
- Một số khái niệm về lý thuyết.
- Cấu hình sử dụng thư viện chuẩn.
- Cấu hình TIM1 với 4 kênh PWM để điều khiển động cơ.
- Cấu hình 2 Encoder có ngắt tràn với TIM2, TIM3.
- Cấu hình tràn TIM4 mỗi 10ms.
- Chương trình con xử lí ngắt tràn TIM2.
- Chương trình con xử lí ngắt tràn TIM3.
- Chương trình con xử lí ngắt tràn TIM4.
- Chương trình trong main.
- Tùy thuộc vào loại encoder mà số xung(độ phân giải) / 1 vòng quay sẽ khác nhau.
- Tùy thuộc cách mắc dây mà chiều encoder âm hay dương.
- Khi sử dụng encoder cần có IC đệm được mắc kèm theo để tránh hư hỏng chân vi điều khiển và tín hiệu xung đọc về được chính xác hơn.
Để xác định được góc quay, vận tốc quay hay vị trí quay một cách chính xác thì sử dụng encoder là một biện pháp hữu hiệu nhất. Từ các thông số mà encoder đưa về chúng ta phải xử lý và đưa ra các phương pháp điều khiển phù hợp. Thông thường các động cơ như AC Servo hay DC Servo điều có encoder đi kèm để dễ dàng điều khiển vận tốc cũng như vị trí. Đa số các encoder đều phải cấp nguồn riêng(khác với nguồn cấp cho động cơ). Điều cơ bản cần biết về 1 encoder là độ phân giải bao nhiêu(bao nhiêu xung – càng cao càng tốt), điện áp cấp là bao nhiêu, số dây in-out.
2 loại cấu tạo thông dụng nhất của encoder là encoder quang(bao gồm một thiết bị phát quang, 1 đĩa chia rãnh hoặc khe, 1 thiết bị thu quang) và encoder dùng cảm biến từ Hall. Người ta chia encoder ra làm 2 loại encoder tuyệt đối(độ chính xác cao, hoạt động ổn định tuy nhiên giá thành cao và tín hiệu ngõ ra phức tạp) và encoder tương đối(độ chính xác ở mức vừa, giá rẻ, dễ sử dụng).
Encoder có nhiều loại nên cấu tạo, cách sử dụng, số dây ra, điện áp cấp là khác nhau. Tuy nhiên về cơ bản thì thường sẽ có 5 dây chính: 2 dây cấp nguồn cho encoder hoạt đông, 2 dây A,B để xác định chiều quay, 1 dây Z để xác định số vòng quay.
Ở STM32F013C8T6 có 4 timer sử dụng được mode encoder tương thích với thư viện của nhà sản xuất – nghĩa là sử dụng được tối đa là 4 encoder riêng biệt. Với mode encoder của thư viện, cách sử dụng đó là: Loại encoder 2 dây(cả pha A và B)sử dụng trên cùng 1 timer với 2 kênh tương ứng là CH1 và CH2 – không được sử dụng trên các kênh CH2 và CH3 hoặc CH1 và CH3…
Bộ đếm của các timer này tối đa là 16 bit tương ứng với giá trị 65535 là sẽ bị tràn. Khi bị tràn chúng ta phải cấu hình ngắt tràn để xử lí sự kiện tràn và reset bộ đếm để tránh tình trạng đọc sai giá trị encoder. Chỉ cần sử dụng STM32F103C8 loại 48 chân là bạn có thể thoải mái điều khiển động cơ mà không cần lo về việc thiếu timer.
Vd: mình sẽ sử dụng TIM1 với 4 kênh timer để băm xung điều khiển 2 động cơ là TIM1_CH2, TIM1_CH2N, TIM1_CH3, TIM1_CH3N; tần số 1khz. 2 động cơ có sẵn 2 encoder với 2 pha A,B được đọc về ở 2 timer là TIM2 và TIM3, có cấu hình ngắt tràn. TM4 được cấu hình ngắt tràn mỗi 10ms để tính vận tốc. Vận tốc được tính sẽ được in lên máy tính thông qua UART với tốc độ baud 115200.
Sơ đồ kết nối:
LƯU Ý :
Code mình đã upload ở dưới. Đây chỉ là cấu hình theo phần cứng có sẵn của mình các bạn có thể tham khảo hoặc linh hoạt chọn các chân khác. Chúc các bạn thành công, có thắc mắc thì cứ nhắn tin cho mình
Link tải chương trình Encoder
encoder_pulse1 = 500000000 + TIM_GetCounter(TIM2) + 65536*count_temp1;
ReplyDeleteBạn giải thích cho mình 2 con số 500000000 và 65536*count_temp1. Mình nghĩ mãi chưa ra.
Cùng câu hỏi...
DeleteXin lỗi các bạn, đấy là lỗi mà khi làm project mình quên chưa sửa. Ban đầu nó là ý tưởng để xử lí tràn encoder nhưng sau đó mình đã thêm ngắt tràn timer encoder(TIM2 và TIM3) nên chưa xóa. Cám ơn các bạn đã góp ý.
DeleteLưu ý thêm là TIM2 của STM32F103C8T6 chỉ có 16 bit, còn đối với 1 số dòng các là 32 bit.
mình muốn lấy giá trị xung encoder thì tính ntn vậy bạn, bạn giúp mình với nhé
DeleteMình chưa hiểu ý bạn lắm. Như ở trên thì biến encoder_pulse chính là số xung encoder đọc về trong 1 khoảng thời gian nhất định.
Delete500000 là sao vậy a ơi
ReplyDeleteXin lỗi các bạn, đấy là lỗi mà khi làm project mình quên chưa sửa. Ban đầu nó là ý tưởng để xử lí tràn encoder nhưng sau đó mình đã thêm ngắt tràn timer encoder(TIM2 và TIM3) nên chưa xóa. Cám ơn các bạn đã góp ý.
DeleteLưu ý thêm là TIM2 của STM32F103C8T6 chỉ có 16 bit, còn đối với 1 số dòng các là 32 bit.
bạn có face hay zalo không mình hỏi vài vấn đề cái , nhiều cái mình ko hiểu quá , mà đang cần đề tài này , cảm ơn bạn rất rất nhiều , hic
Deletebạn có face hay zalo không mình hỏi vài vấn đề cái , nhiều cái mình ko hiểu quá , mà đang cần đề tài này , cảm ơn bạn rất rất nhiều , hic
ReplyDeleteTại sao ở đây mình lại cấu hình TIM4 tràn? Và nó để làm gì? Mình không hiểu lắm ạ!
ReplyDeleteTIM4 ở đây là yếu tố real time, sau 1 khoảng thời gian nhất định (ở đây là 10 ms) bạn cần phải xử lí các tác vụ như: lấy giá trị encoder, xuất xung điều khiển động cơ....và quan trọng hơn là tính vận tốc bạn phải có thời gian nên TIM4 phục vụ điều này. Bạn có thể để việc xử lí các tác vụ này trong vòng lặp while ngoài main, tuy nhiên theo mình thì điều đó không được tốt(chương trình ngoài main đợi các tác vụ khác, thời gian chạy không ổn định....).
Deletebạn ơi có thể giải thích giúp mình tại sao ở đây nó lại như này ...6000(v/p)/60->100(v/s)... 100 ở đây là ms hay us... nếu mình muốn thời gian trong vòng 1 s thì chương trình sẽ thay đổi như thế nào???
Deletemình cảm ơn!!!
.6000(v/p)/60->100(v/s) ???? Mình chưa hiểu cái này lắm. Nếu bạn muốn thời gian tính toán là 1s thì bạn cấu hình ngắt TIM4 là 1s. Cứ 1s nhảy vào ngắt tính toán vận tốc 1 lần, và công thức tính vận tốc cũng phải thay đổi lại.
Deleteanh cho em hỏi con stm32f103 này lập trình có giống con stm32f407 không ạ
ReplyDeleteVề cơ bản thì nó giống nhau nha bạn, tuy nhiên bộ số bit TIMER và clock hệ thống của 2 MCU khác nhau nên cần chú ý lúc cấu hình để chúng hoạt động được.
Deleteencoder bạn chọn chế độ GPIO_Mode_IN_FLOATING, tức là GPIO kết nối 2 kênh encoder thông qua điện trở ngoại vi hả bạn?
ReplyDeleteChào bạn, floating tức là để nổi, điện áp chân input sẽ phụ thuộc vào chân kết nối, ví dụ: chân chân kết = 3.0V thì điện áp chân input sẽ là 3.0V
Delete