1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Điều khiển tốc độ động cơ sử dụng phương pháp pid dùng stm32 đồ án chuyên ngành kỹ thuật điều khiển và tự đông hóa

60 10 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Điều Khiển Tốc Độ Động Cơ Sử Dụng Phương Pháp PID Dùng STM32
Tác giả Đỗ Minh Chính
Người hướng dẫn TS. Nguyễn Thị Phương Thảo
Trường học Trường Đại Học Tôn Đức Thắng
Chuyên ngành Kỹ Thuật Điều Khiển Và Tự Động Hóa
Thể loại đồ án
Năm xuất bản 2023
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 60
Dung lượng 1,04 MB

Cấu trúc

  • 1.1 G IỚI THIỆU ĐỀ TÀI (14)
  • 1.2 M ỤC ĐÍCH NGHIÊN CỨU (15)
  • 1.3 Đ ỐI TƯỢNG NGHIÊN CỨU (15)
  • 1.4 P HẠM VI NGHIÊN CỨU (16)
  • 1.5 D Ự KIẾN KẾT QUẢ (16)
  • CHƯƠNG 2. MÔ HÌNH TOÁN CỦA ĐỘNG CƠ DC (17)
    • 2.1 G IỚI THIỆU ĐỘNG CƠ DC (17)
      • 2.1.1 Cấu tạo (17)
      • 2.1.2 Nguyên lý hoạt động (18)
      • 2.1.3 Một số loại động cơ DC phổ biến (19)
    • 2.2 T HIẾT LẬP VẬT LÝ (19)
    • 2.3 P HƯƠNG TRÌNH HỆ THỐNG (20)
    • 2.4 H ÀM TRUYỀN (21)
  • CHƯƠNG 3. GIẢI THUẬT ĐIỀU KHIỂN PID (22)
    • 3.1 K HÂU TỶ LỆ (P ROPORTIONAL ) (23)
    • 3.2 K HÂU VI PHÂN (I NTEGRAL ) (24)
    • 3.3 K HÂU ĐẠO HÀM ( D ERIVATIVE ) (25)
  • CHƯƠNG 4. PHƯƠNG PHÁP ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ (27)
    • 4.1 Đ IỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ THEO PHƯƠNG PHÁP ĐIỀU CHẾ ĐỘ RỘNG XUNG PWM 24 (27)
    • 4.2 L STM32 PWM (0)
    • 5.1 S Ơ ĐỒ KHỐI CỦA HỆ THỐNG (35)
    • 5.2 L ƯU ĐỒ GIẢI THUẬT (37)
    • 5.3 C HƯƠNG TRÌNH LẬP TRÌNH (38)
      • 5.3.1 Thư viện LCD (38)
      • 5.3.2 Thư viện PID (40)
      • 5.3.3 Chương trình chính (42)
  • TÀI LIỆU THAM KHẢO (59)

Nội dung

Hồ Chí Minh, ngày 29 tháng 11 năm 2023Tác giả Trang 7 Tóm tắt đề tài điều khiển tốc độ động cơ bằng giải thuật PID dùng STM32Động cơ DC là một trong những loại động cơ được sử dụng phổ

G IỚI THIỆU ĐỀ TÀI

Ngày nay, sự phát triển không ngừng của các ngành công nghiệp đã dẫn đến nhu cầu gia tăng về máy móc và công cụ sản xuất Để đáp ứng nhu cầu này, động cơ đóng vai trò quan trọng và là nền tảng của ngành công nghiệp Hiện có hai loại động cơ chính: động cơ đốt trong và động cơ điện Tuy nhiên, động cơ điện ngày càng được ưa chuộng hơn nhờ vào hiệu suất cao và tính thân thiện với môi trường.

Hiện nay, động cơ điện rất đa dạng, bao gồm động cơ đồng bộ, không đồng bộ, xoay chiều, một chiều, servo, giảm tốc và bước Trong số đó, động cơ một chiều ngày càng được ưa chuộng, đặc biệt trong bối cảnh xe điện đang trở thành xu hướng toàn cầu Sự phát triển mạnh mẽ của xe điện ở nhiều quốc gia là minh chứng rõ ràng cho sự ưu tiên này.

Ô nhiễm không khí đang gia tăng, đặc biệt ở các đô thị lớn, với ô nhiễm giao thông được xác định là nguyên nhân chính Các chuyên gia cho biết, hoạt động giao thông thải ra gần 85% khí cacbon monoxit hàng ngày, gây ảnh hưởng xấu đến sức khỏe con người và có thể dẫn đến ngộ độc cấp tính.

Việc khai thác quá mức các nhiên liệu hóa thạch như xăng và dầu đã dẫn đến tình trạng cạn kiệt tài nguyên Do đó, việc chuyển đổi sang các nguyên liệu thân thiện với môi trường trở nên cấp bách Các phương tiện xanh như ô tô điện, xe buýt và xe máy điện đang được coi là giải pháp tối ưu và hiệu quả để bảo vệ môi trường.

Động cơ điện một chiều hiện nay có ứng dụng đa dạng, hiện diện trong nhiều lĩnh vực sản xuất công nghiệp và đời sống, như sử dụng trong đài FM và ổ đĩa.

DC, trong tivi, máy công nghiệp, các loại máy in, máy photo,… Đặc biệt là chế tạo Robot.

Động cơ điện một chiều mang lại nhiều lợi ích thiết thực, nhưng bài toán điều khiển tối ưu vẫn là thách thức lớn Cần xác định cách điều khiển chính xác theo yêu cầu, đạt hiệu suất cao nhất và duy trì tuổi thọ của động cơ Đây chính là vấn đề cốt lõi trong nghiên cứu của tôi.

M ỤC ĐÍCH NGHIÊN CỨU

Đề tài này tập trung vào việc nghiên cứu nguyên lý hoạt động của động cơ DC và cách sử dụng vi điều khiển STM32 để tạo ra tín hiệu điều khiển phù hợp với tải không đồng nhất với nguồn cấp của vi điều khiển Mục tiêu chính là điều khiển tốc độ động cơ theo tốc độ cài đặt ban đầu với sai số tối thiểu, đảm bảo hệ thống hoạt động ổn định Bên cạnh đó, nghiên cứu cũng mở rộng đến giải thuật điều khiển PID, từ đó áp dụng cho các hệ thống điều khiển tự động khác.

Từ đó, thiết kế các sản phẩm, dự án điều khiển tự động khác trong đời sống.

Đ ỐI TƯỢNG NGHIÊN CỨU

Vi điều khiển STM32F103C8T6 được sử dụng để điều khiển động cơ DC GA25 thông qua hệ thống điều khiển vòng kín Nguyên lý hoạt động bao gồm việc sử dụng encoder để theo dõi vị trí và tốc độ của động cơ, kết hợp với giải thuật điều khiển PID để đạt được hiệu suất tối ưu Giao tiếp truyền thông nối tiếp dữ liệu UART cho phép truyền tải thông tin giữa các thiết bị, trong khi điều chế độ rộng xung PWM được áp dụng để điều chỉnh công suất đầu ra của động cơ.

P HẠM VI NGHIÊN CỨU

Bộ điều khiển tốc độ động cơ DC sử dụng thuật toán PID để điều chỉnh tốc độ động cơ, phù hợp với nhiều loại tải như tải thuần trở, tải cảm ứng và tải trở Ứng dụng của bộ điều khiển này rất đa dạng, từ các dự án yêu cầu độ chính xác cao và ổn định như băng chuyền, hệ thống tự động hóa hàng hóa, robot, đến các thiết bị gia dụng như quạt và máy bơm.

D Ự KIẾN KẾT QUẢ

Bộ điều khiển tốc độ động cơ là thiết bị điện tử chuyên dụng để điều chỉnh tốc độ động cơ theo yêu cầu của người dùng Người dùng nhập tốc độ mong muốn, và bộ điều khiển sẽ áp dụng thuật toán điều khiển để tính toán tín hiệu cần thiết nhằm đạt được tốc độ đó Thông qua màn hình LCD, người dùng có thể theo dõi tốc độ đo được từ encoder, với thông tin được phản hồi liên tục và hiển thị trên màn hình.

MÔ HÌNH TOÁN CỦA ĐỘNG CƠ DC

G IỚI THIỆU ĐỘNG CƠ DC

Động cơ DC (Direct Current Motors) là loại động cơ điện một chiều, chuyển đổi năng lượng điện thành năng lượng cơ học Cấu tạo của động cơ DC bao gồm hai phần chính.

 Stato: là phần tĩnh, bao gồm các cuộn dây stato.

 Rotor: là phần quay, bao gồm các thanh dẫn hoặc nam châm vĩnh cửu.

Khi cấp điện cho cuộn dây stato, một từ trường quay được hình thành, tác động lên các thanh dẫn hoặc nam châm vĩnh cửu trên rotor, dẫn đến việc rotor quay.

Khi dòng điện đi qua cuộn dây stato, nó tạo ra một từ trường Từ trường này tác động lên các thanh dẫn trên rotor, sinh ra lực điện từ Lực điện từ này làm cho các thanh dẫn quay, tạo ra chuyển động.

Hướng quay của rotor được xác định bởi chiều dòng điện trong các cuộn dây stato Nếu dòng điện chạy theo chiều kim đồng hồ, rotor sẽ quay theo chiều kim đồng hồ Ngược lại, nếu dòng điện chạy theo chiều ngược kim đồng hồ, rotor sẽ quay theo chiều ngược kim đồng hồ.

Tốc độ của động cơ DC phụ thuộc vào điện áp cung cấp và điện trở của dây quấn stato Cụ thể, khi điện áp cấp cho động cơ tăng, tốc độ động cơ cũng tăng theo, trong khi điện trở dây quấn stato cao sẽ làm giảm tốc độ động cơ Để điều chỉnh tốc độ động cơ DC, có thể thay đổi điện áp cung cấp; ví dụ, nếu điện áp giảm một nửa, tốc độ động cơ cũng sẽ giảm tương ứng.

Động cơ DC có thể điều chỉnh tốc độ bằng cách thay đổi điện trở của dây quấn stato; cụ thể, nếu điện trở tăng gấp đôi, tốc độ động cơ sẽ giảm một nửa Động cơ DC sở hữu nhiều ưu điểm nổi bật.

Động cơ DC nổi bật với khả năng điều chỉnh tốc độ linh hoạt, cho phép người dùng dễ dàng thay đổi tốc độ hoạt động chỉ bằng cách điều chỉnh điện áp cung cấp cho động cơ.

 Khả năng khởi động và dừng nhanh: Động cơ DC có thể khởi động và dừng nhanh mà không gây ra hiện tượng sốc điện.

Động cơ DC có khả năng chịu tải cao mà không bị quá tải, làm cho chúng trở thành lựa chọn lý tưởng cho nhiều ứng dụng khác nhau.

 Các thiết bị gia dụng: Quạt, máy bơm, máy khoan, v.v.

 Các thiết bị công nghiệp: Máy móc, băng tải, robot, v.v.

 Các thiết bị tự động hóa: Hệ thống điều khiển, máy CNC, v.v.

2.1.3 Một số loại động cơ DC phổ biến

 Động cơ DC chổi than: là loại động cơ DC phổ biến nhất Nó có cấu tạo đơn giản và giá thành rẻ.

 Động cơ DC không chổi than: là loại động cơ DC không sử dụng chổi than.

Nó có hiệu suất cao và độ bền cao hơn động cơ DC chổi than.

Động cơ DC bước là loại động cơ DC cho phép quay từng bước, thường được ứng dụng trong các lĩnh vực yêu cầu độ chính xác cao như máy in 3D và máy CNC.

T HIẾT LẬP VẬT LÝ

Động cơ DC là một thiết bị truyền động phổ biến trong các hệ thống điều khiển, cung cấp chuyển động quay trực tiếp và có thể tạo ra chuyển động tịnh tiến khi kết hợp với bánh xe, trống và dây cáp Trong ví dụ này, đầu vào là nguồn điện áp (V) được áp dụng vào phần ứng của động cơ, trong khi đầu ra là tốc độ quay của trục, với rôto và trục được coi là đứng yên Mô hình ma sát nhớt được giả định, trong đó mômen ma sát tỷ lệ với vận tốc góc của trục Các tham số vật lý sẽ được sử dụng cho ví dụ này.

(J) Momen quán tính của rotor 0.01 kg.m^2

(b) Hằng số ma sát nhớt động cơ 0.1 N.m.s

(Ke) Hằng số suất điện động 0.03 V/rad/sec

(Kt) Hằng số mô-men xoắn của động cơ 0.03 N.m/Amp

P HƯƠNG TRÌNH HỆ THỐNG

Mô-men xoắn của động cơ DC tỷ lệ thuận với dòng điện phần ứng và cường độ từ trường Giả sử từ trường là không đổi, mô-men xoắn của động cơ chỉ phụ thuộc vào dòng điện phần ứng I theo hệ số không đổi Kt Đây được gọi là động cơ điều khiển phần ứng.

Emf phía sau, e, tỷ lệ với vận tốc góc của trục theo hệ số không đổi Ke

Trong hệ đơn vị SI, hằng số mô-men xoắn (Kt) và hằng số emf ngược (Ke) của động cơ là bằng nhau, tức là Kt = Ke Do đó, chúng tôi sẽ sử dụng ký hiệu K để biểu thị cho cả hai hằng số này của động cơ.

Từ hình trên, chúng ta có thể suy ra các phương trình điều chỉnh sau dựa trên định luật 2 Newton và định luật điện áp Kirchhoff.

H ÀM TRUYỀN

Áp dụng phép biến đổi Laplace, các phương trình mô hình hóa trên có thể được biểu diễn dưới dạng biến Laplace s.

Chúng ta có thể đạt được hàm truyền vòng hở bằng cách loại bỏ I(s) giữa hai phương trình, trong đó tốc độ quay được xem là đầu ra và điện áp phần ứng là đầu vào.

GIẢI THUẬT ĐIỀU KHIỂN PID

K HÂU TỶ LỆ (P ROPORTIONAL )

Hình 3-5 Sơ đồ khối khâu tỷ lệ

Khâu tỉ lệ, hay còn gọi là độ lợi, ảnh hưởng đến giá trị đầu ra dựa trên sai số hiện tại Để điều chỉnh đáp ứng tỉ lệ, sai số này được nhân với một hằng số Kp, được biết đến là hệ số tỉ lệ.

Hình 3-6 biểu đồ biểu diễn giá trị ngõ ra hiện tại với các hê số Kp khác nhau

Hệ số của khâu tỉ lệ lớn phản ánh sự thay đổi lớn ở đầu ra trong khi sai số đầu vào chỉ thay đổi nhỏ, tuy nhiên, nếu hệ số này quá cao, hệ thống sẽ trở nên không ổn định Ngược lại, hệ số nhỏ dẫn đến đáp ứng đầu ra yếu khi sai số đầu vào lớn, làm cho bộ điều khiển trở nên kém nhạy và đáp ứng chậm Nếu hệ số của khâu tỉ lệ quá thấp, tác động điều khiển có thể không đủ mạnh để đối phó với các nhiễu trong hệ thống.

K HÂU VI PHÂN (I NTEGRAL )

Hình 3-7 Sơ đồ khối khâu tích phân

Phân phối của khâu tích phân, hay còn gọi là reset, tỉ lệ thuận với biên độ sai số và quảng thời gian xảy ra sai số Tổng sai số tức thời theo thời gian (tích phân sai số) cho phép tích lũy bù đã được hiệu chỉnh trước đó Sai số tích lũy được nhân với độ lợi tích phân và cộng với tín hiệu đầu ra của bộ điều khiển Biên độ phân phối của khâu tích phân trong tất cả các tác động điều chỉnh được xác định bởi độ lợi tích phân K i.

Khâu tích phân, khi kết hợp với khâu tỉ lệ, giúp tăng tốc độ chuyển động đến điểm đặt và loại bỏ sai số ổn định với tỉ lệ phụ thuộc vào bộ điều khiển Tuy nhiên, do khâu tích phân phản ánh sai số tích lũy trong quá khứ, nó có thể dẫn đến việc giá trị hiện tại vượt quá giá trị đặt, gây ra độ lệch trong các hướng khác Để hiểu rõ hơn về việc điều chỉnh độ lợi tích phân và độ ổn định của bộ điều khiển, hãy tham khảo phần điều chỉnh vòng lặp.

K HÂU ĐẠO HÀM ( D ERIVATIVE )

Hình 3-8 Sơ đồ khối khâu tích phân

Tốc độ thay đổi của sai số quá trình được xác định bằng cách tính độ dốc của sai số theo thời gian, tương ứng với đạo hàm bậc một Tốc độ này sau đó được nhân với độ lợi tỉ lệ K d Biên độ phân phối khâu vi phân, hay còn gọi là tốc độ, trên tất cả các hành vi điều khiển bị giới hạn bởi độ lợi vi phân K d.

Khâu vi phân trong bộ điều khiển giúp làm chậm tốc độ thay đổi của đầu ra, từ đó đạt được điểm đặt mong muốn Nó giảm biên độ vọt lố do thành phần tích phân và tăng cường độ ổn định cho bộ điều khiển hỗn hợp Tuy nhiên, việc vi phân tín hiệu có thể khuếch đại nhiễu, làm cho khâu này nhạy cảm với nhiễu trong sai số, dẫn đến tình trạng không ổn định nếu nhiễu và độ lợi vi phân quá lớn Do đó, thường sử dụng xấp xỉ bộ vi sai với băng thông giới hạn, như mạch bù sớm pha.

Độ lợi tỉ lệ Kp có ảnh hưởng lớn đến tốc độ đáp ứng của hệ thống; giá trị Kp càng lớn thì thời gian đáp ứng càng nhanh, nhưng đồng thời cũng làm tăng sai số Nếu giá trị Kp quá cao, hệ thống có thể trở nên mất ổn định và gây ra dao động không mong muốn.

Độ lợi tích phân K i càng lớn giúp giảm sai số ổn định nhanh chóng, nhưng cũng dẫn đến độ vọt lố lớn hơn Điều này có nghĩa là bất kỳ sai số âm nào trong quá trình đáp ứng quá độ cần được triệt tiêu bằng sai số dương trước khi hệ thống đạt trạng thái ổn định.

Độ lợi vi phân K d có ảnh hưởng lớn đến hiệu suất của hệ thống; giá trị cao giúp giảm độ vọt lố nhưng lại làm chậm đáp ứng quá độ Hơn nữa, việc tăng K d có thể dẫn đến mất ổn định do khuếch đại nhiễu tín hiệu trong phép vi phân sai số.

PHƯƠNG PHÁP ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ

Đ IỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ THEO PHƯƠNG PHÁP ĐIỀU CHẾ ĐỘ RỘNG XUNG PWM 24

Phương pháp điều khiển tốc độ động cơ DC bằng PWM (Điều chế độ rộng xung) là kỹ thuật điều chỉnh tốc độ của động cơ DC thông qua việc thay đổi độ rộng xung của tín hiệu điện áp cung cấp cho động cơ.

Tốc độ của động cơ DC phụ thuộc vào điện áp cung cấp và điện trở của dây quấn stato Cụ thể, khi điện áp cấp cho động cơ tăng, tốc độ của động cơ cũng sẽ tăng theo Ngược lại, nếu điện trở của dây quấn stato cao, tốc độ của động cơ sẽ giảm.

Phương pháp điều khiển tốc độ động cơ DC bằng PWM cho phép điều chỉnh điện áp cấp cho động cơ thông qua việc thay đổi độ rộng xung của tín hiệu PWM Độ rộng xung được xác định bởi tỷ lệ thời gian tín hiệu PWM ở mức cao so với tổng thời gian của nó; ví dụ, độ rộng xung 50% tương ứng với điện áp cấp cho động cơ bằng 50% điện áp định mức Để thực hiện điều này, cần sử dụng bộ điều khiển tốc độ PWM, nhận tín hiệu điều khiển từ người dùng và điều chỉnh độ rộng xung của tín hiệu PWM theo yêu cầu.

 Nếu muốn tăng tốc độ của động cơ, cần tăng độ rộng xung của tín hiệu PWM.

 Nếu muốn giảm tốc độ của động cơ, cần giảm độ rộng xung của tín hiệu PWM.

Để dừng động cơ, cần thiết lập độ rộng xung của tín hiệu PWM bằng 0 Phương pháp điều khiển tốc độ động cơ DC bằng PWM mang lại nhiều lợi ích, như độ chính xác cao, chi phí thấp và khả năng điều khiển tốc độ động cơ một cách liên tục.

Phương pháp này được sử dụng rộng rãi trong các ứng dụng công nghiệp và gia dụng.

Phương pháp điều khiển tốc độ động cơ DC bằng PWM có nhiều ứng dụng thực tiễn, bao gồm điều khiển tốc độ quạt, máy bơm, máy CNC và robot.

4.2 Lập trình STM32 với PWM

Hình 4-9 Sơ đồ module STM32F103C6T8

Dòng sản phẩm STM32F103x4 và STM32F103x6 mang đến hiệu suất cao với nhân ARM® Cortex™-M3 32-bit RISC hoạt động ở tần số 72 MHz Các vi điều khiển này được trang bị bộ nhớ nhúng tốc độ cao, bao gồm bộ nhớ Flash lên đến 32 Kbyte và SRAM tối đa 6 Kbyte, cùng với nhiều cổng I/O và ngoại vi nâng cao kết nối qua hai bus APB Tất cả thiết bị đều tích hợp hai ADC 12-bit, ba bộ đếm 16-bit đa năng, một bộ đếm PWM, và các giao diện truyền thông tiêu chuẩn như hai I2C, SPI, ba USART, một USB và một CAN.

Dòng sản phẩm STM32F103xx hoạt động với điện áp cung cấp từ 2.0 đến 3.6 V, phù hợp cho nhiều ứng dụng Nó có khả năng hoạt động ở dải nhiệt độ từ -40 đến +85 °C, cũng như dải nhiệt độ mở rộng, đảm bảo hiệu suất ổn định trong điều kiện khắc nghiệt.

40 đến +105 °C Một bộ chế độ tiết kiệm điện toàn diện cho phép thiết kế các ứng dụng công suất thấp.

Dòng sản phẩm STM32F103xx bao gồm các thiết bị với bốn loại gói khác nhau, từ 36 chân đến 64 chân Tùy thuộc vào từng thiết bị, các bộ ngoại vi khác nhau sẽ được tích hợp, và bài viết này cung cấp cái nhìn tổng quan về toàn bộ phạm vi ngoại vi được đề xuất trong dòng sản phẩm này.

Dòng sản phẩm vi điều khiển STM32F103xx low-density performance line sở hữu nhiều tính năng vượt trội, phù hợp cho các ứng dụng đa dạng như điều khiển động cơ, thiết bị y tế cầm tay, thiết bị ngoại vi PC và trò chơi, nền tảng GPS, ứng dụng công nghiệp, PLC, biến tần, máy in, máy quét, hệ thống báo động, video intercom và HVAC.

ARM 32-bit Cortex™-M3 CPU Core

 72 MHz maximum frequency,1.25 DMIPS/MHz (Dhrystone 2.1) performance at 0 wait state memory access

 Single-cycle multiplication and hardware division

 16 or 32 Kbytes of Flash memory

Clock, reset and supply management

 2.0 to 3.6 V application supply and I/Os

 POR, PDR, and programmable voltage detector (PVD)

 Internal 8 MHz factory-trimmed RC

 32 kHz oscillator for RTC with calibration

Low power: Sleep, Stop and Standby modes

VBAT supply for RTC and backup registers

2 x 12-bit, 1 μs A/D converters (up to 16 channels)

 Dual-sample and hold capability

 Peripherals supported: timers, ADC, SPIs, I2Cs and USARTs

 26/37/51 I/Os, all mappable on 16 external interrupt vectors and almost all 5 V-tolerant

 Serial wire debug (SWD) & JTAG interfaces

 Two 16-bit timers, each with up to 4 IC/OC/PWM or pulse counter and quadrature (incremental) encoder input

 16-bit, motor control PWM timer with dead-time generation and emergency stop

 2 watchdog timers (Independent and Window)

 2 × USARTs (ISO 7816 interface, LIN, IrDA capability, modem control)

CRC calculation unit, 96-bit unique ID

4.2.2 Cấu hình cho vi điều khiển

Hình 4-10 Cấu hình chân STM32F103C6T8

 Pin PA0 – GPIO_EXTI0: Nút nhấn START, có chức năng cho phép module L298 hoạt động (kích mức cao cho chân En L298).

 Pin PA1 – GPIO_EXTI1: Nút nhấn UP, có chức năng tăng giá trị vận tốc.

 Pin PA2 – GPIO_EXTI2: Nút nhấn DOWN, có chức năng giảm giá trị vận tốc.

 Pin PA3 – GPIO_EXTI3: Nút nhấn EXIT, có chức năng thoát các lựa chọn, dừng hệ thống.

 Pin PA6 – TIMER3_CHANNEL_1: nối với Cực A Encoder

 Pin PA7 – TIMER3_CHANNEL_2: nối với Cực B Encoder

 Truyền thông nối tiếp dữ liệu:

 Pin PA9 – USART1_TX: nối với Pin D4 (RX) của module ESP8266

 Pin PA10 – USART1_RX: nối với Pin D5 (TX) của module ESP8266

CHƯƠNG 5 THIẾT KẾ MÔ HÌNH 5.1 Sơ đồ khối của hệ thống

Hình 6-11 Sơ đồ khối của hệ thống

Khối giao diện điều khiển cho phép người dùng giao tiếp và hiển thị tốc độ đo được của động cơ thông qua Encoder, đồng thời cho phép cài đặt tốc độ mong muốn Khối vi xử lý đóng vai trò là bộ não của hệ thống, chịu trách nhiệm điều khiển và xử lý các sự kiện dựa trên thuật toán đã được thiết lập, cũng như thực hiện chức năng truyền và nhận dữ liệu với các cơ cấu chấp hành và giám sát hệ thống.

IC L298 là một khối Driver hiệu quả cho việc điều khiển động cơ DC, với một trong những phương pháp phổ biến là điều khiển tốc độ thông qua PWM Phương pháp này cho phép IC L298 sử dụng tín hiệu PWM để điều chỉnh tốc độ hoạt động của động cơ DC một cách linh hoạt.

Hình 6-12 Sơ đồ nguyên lý module L298

Khối cơ cấu chấp hành là động cơ DC sẽ hoạt động dựa theo điện áp được điều chế bằng khối Driver.

Khối cảm biến đóng vai trò quan trọng trong việc phản hồi tốc độ, với Encoder có nhiệm vụ đếm số xung và gửi dữ liệu về khối vi xử lý Từ thông tin này, hệ thống sẽ tính toán tốc độ của động cơ để đảm bảo duy trì tốc độ theo yêu cầu mà người dùng đã thiết lập.

#define RS_Pin GPIO_PIN_13

#define RS_GPIO_Port GPIOC

#define EN_Pin GPIO_PIN_15

#define EN_GPIO_Port GPIOC

#define RW_Pin GPIO_PIN_14

#define RW_GPIO_Port GPIOC

#define LCD_MODE LCD_4_BIT_MODE

// Number of visible lines of the display (1 or 2)

// DDRAM address of first char of line 1

// DDRAM address of first char of line 2

#define LCD16xN // For 16xN LCDs

#define OPT_S 0x01 // Shift entire display to right

#define OPT_INC 0x02 // Cursor increment

#define DISPLAY_ON_OFF_CONTROL 0x08

#define OPT_D 0x04 // Turn on display

#define OPT_C 0x02 // Turn on cursor

#define OPT_B 0x01 // Turn on cursor blink

#define CURSOR_DISPLAY_SHIFT 0x10 // Move and shift cursor

#define OPT_DL 0x10 // Set interface data length

#define OPT_N 0x08 // Set number of display lines

#define OPT_F 0x04 // Set alternate font

#define SET_DDRAM_ADDR 0x80 // Set DDRAM address

#define LCD_DATA_REG GPIO_PIN_SET

#define LCD_COMMAND_REG GPIO_PIN_RESET

#define Lcd_PortType GPIO_TypeDef*

The article outlines several public functions for LCD display control, including Lcd_Init for initialization, Lcd_clear_xy to clear specific coordinates, and Lcd_write_custom_char for displaying custom characters at designated positions Additional functions include Lcd_gotoxy for setting cursor location, Lcd_create_custom_char to define new characters, Lcd_clear_display for wiping the screen, Lcd_write_string for outputting text, and Lcd_write_int for displaying integers.

The article discusses key components of a control system, highlighting derived gains such as A0, A1, and A2, calculated from proportional (Kp), integral (Ki), and derivative (Kd) gains It describes A0 as the sum of Kp, Ki, and Kd, while A1 is defined as the negative sum of Kp and twice Kd Additionally, A2 represents the derivative gain Kd The state array, consisting of three elements, is also mentioned, alongside the significance of these gains in optimizing system performance.

* @brief Initialization function for the floating-point PID Control.

* @param[in,out] S points to an instance of the PID structure.

* @param[in] resetStateFlag flag to reset the state 0 = no change in state 1 reset the state.

*/ void pid_init(arm_pid_instance_f32 * S,float Kp,float Ki, float Kd); float pid_cal(arm_pid_instance_f32 * S, float in); void pid_setPoint(arm_pid_instance_f32 * S,float sp);

* @brief Reset function for the floating-point PID Control.

* @param[in,out] S is an instance of the floating-point PID Control structure */ void pid_reset(arm_pid_instance_f32 * S);

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

/* Private typedef -*/ /* USER CODE BEGIN PTD */

/* Private define -*/ /* USER CODE BEGIN PD */

/* Private macro -*/ /* USER CODE BEGIN PM */

/* Private variables -*/ TIM_HandleTypeDef htim1;

/* USER CODE BEGIN PV */ uint16_t var; uint16_t encoder_cnt_pre =0; uint16_t encoder_cnt =0; uint8_t msg[35]={'\0'}; uint8_t speed=0;

The article outlines essential private function prototypes for system configuration, including the initialization of the system clock, GPIO, TIM1, TIM3, and USART1 UART These functions are crucial for setting up the necessary hardware components and ensuring proper communication within the system.

/* Private user code -*/ /* USER CODE BEGIN 0 */

* @brief The application entry point.

/* Reset of all peripherals, Initializes the Flash interface and the Systick */ HAL_Init();

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_1|TIM_CHANNEL_2); /* USER CODE END 2 */

Lcd_write_string("Do Minh Chinh");

/* USER CODE BEGIN WHILE */ while (1)

HAL_Delay(1000); encoder_cnt= HAL_TIM_GET_COUNTER(&htim3); speed=(encoder_cnt-encoder_cnt_pre)/100; encoder_cnt_pre =encoder_cnt;

//truyen tin sprintf(msg,"speed = %d\r\n", speed);

HAL_UART_Transmit(&huart1, msg, sizeof(msg), 1);

/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

/** Initializes the CPU, AHB and APB buses clocks

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK| RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) ! HAL_OK)

*/ static void MX_TIM1_Init(void)

/* USER CODE BEGIN TIM1_Init 0 */

/* USER CODE END TIM1_Init 0 */

/* USER CODE BEGIN TIM1_Init 1 */

S Ơ ĐỒ KHỐI CỦA HỆ THỐNG

Hình 6-11 Sơ đồ khối của hệ thống

Khối giao diện điều khiển tương tác với người dùng, hiển thị tốc độ đo được của động cơ qua Encoder và cho phép cài đặt tốc độ mong muốn Khối vi xử lý, được xem là bộ não của hệ thống, thực hiện chức năng điều khiển và xử lý các sự kiện dựa trên thuật toán đã được lập trình, đồng thời còn có khả năng truyền và nhận dữ liệu với các cơ cấu chấp hành cũng như giám sát hệ thống.

IC L298 là một khối driver hiệu quả cho việc điều khiển động cơ DC, cho phép điều chỉnh tốc độ động cơ thông qua phương pháp PWM Bằng cách sử dụng tín hiệu PWM, IC L298 có thể điều khiển tốc độ hoạt động của động cơ DC một cách linh hoạt và chính xác.

Hình 6-12 Sơ đồ nguyên lý module L298

Khối cơ cấu chấp hành là động cơ DC sẽ hoạt động dựa theo điện áp được điều chế bằng khối Driver.

Khối cảm biến có nhiệm vụ phản hồi tốc độ, trong đó Encoder sẽ đếm số xung và gửi thông tin về khối vi xử lý Từ dữ liệu này, vi xử lý sẽ tính toán tốc độ của động cơ để duy trì tốc độ mong muốn mà người dùng đã cài đặt.

C HƯƠNG TRÌNH LẬP TRÌNH

#define RS_Pin GPIO_PIN_13

#define RS_GPIO_Port GPIOC

#define EN_Pin GPIO_PIN_15

#define EN_GPIO_Port GPIOC

#define RW_Pin GPIO_PIN_14

#define RW_GPIO_Port GPIOC

#define LCD_MODE LCD_4_BIT_MODE

// Number of visible lines of the display (1 or 2)

// DDRAM address of first char of line 1

// DDRAM address of first char of line 2

#define LCD16xN // For 16xN LCDs

#define OPT_S 0x01 // Shift entire display to right

#define OPT_INC 0x02 // Cursor increment

#define DISPLAY_ON_OFF_CONTROL 0x08

#define OPT_D 0x04 // Turn on display

#define OPT_C 0x02 // Turn on cursor

#define OPT_B 0x01 // Turn on cursor blink

#define CURSOR_DISPLAY_SHIFT 0x10 // Move and shift cursor

#define OPT_DL 0x10 // Set interface data length

#define OPT_N 0x08 // Set number of display lines

#define OPT_F 0x04 // Set alternate font

#define SET_DDRAM_ADDR 0x80 // Set DDRAM address

#define LCD_DATA_REG GPIO_PIN_SET

#define LCD_COMMAND_REG GPIO_PIN_RESET

#define Lcd_PortType GPIO_TypeDef*

The article outlines several public functions for LCD manipulation, including Lcd_Init for initialization, Lcd_clear_xy to clear specific coordinates, and Lcd_write_custom_char for displaying custom characters at designated positions Additional functions include Lcd_gotoxy for cursor positioning, Lcd_create_custom_char to define new characters, and Lcd_clear_display for clearing the entire screen Finally, Lcd_write_string and Lcd_write_int allow for writing strings and integers to the display, respectively.

The article discusses key components of a control system, specifically focusing on derived gains such as A0, A1, and A2, which are calculated using proportional (Kp), integral (Ki), and derivative (Kd) gains A0 is defined as the sum of Kp, Ki, and Kd, while A1 is calculated as the negative sum of Kp and twice Kd A2 represents the derivative gain, Kd Additionally, the state array, consisting of three elements, is mentioned, along with the significance of the setpoint (SP) in the control process.

* @brief Initialization function for the floating-point PID Control.

* @param[in,out] S points to an instance of the PID structure.

* @param[in] resetStateFlag flag to reset the state 0 = no change in state 1 reset the state.

*/ void pid_init(arm_pid_instance_f32 * S,float Kp,float Ki, float Kd); float pid_cal(arm_pid_instance_f32 * S, float in); void pid_setPoint(arm_pid_instance_f32 * S,float sp);

* @brief Reset function for the floating-point PID Control.

* @param[in,out] S is an instance of the floating-point PID Control structure */ void pid_reset(arm_pid_instance_f32 * S);

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

/* Private typedef -*/ /* USER CODE BEGIN PTD */

/* Private define -*/ /* USER CODE BEGIN PD */

/* Private macro -*/ /* USER CODE BEGIN PM */

/* Private variables -*/ TIM_HandleTypeDef htim1;

/* USER CODE BEGIN PV */ uint16_t var; uint16_t encoder_cnt_pre =0; uint16_t encoder_cnt =0; uint8_t msg[35]={'\0'}; uint8_t speed=0;

This article outlines essential private function prototypes for configuring system components, including the system clock, GPIO initialization, TIM1 and TIM3 setup, and USART1 UART initialization These functions are crucial for ensuring proper operation and communication within the system.

/* Private user code -*/ /* USER CODE BEGIN 0 */

* @brief The application entry point.

/* Reset of all peripherals, Initializes the Flash interface and the Systick */ HAL_Init();

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_1|TIM_CHANNEL_2); /* USER CODE END 2 */

Lcd_write_string("Do Minh Chinh");

/* USER CODE BEGIN WHILE */ while (1)

HAL_Delay(1000); encoder_cnt= HAL_TIM_GET_COUNTER(&htim3); speed=(encoder_cnt-encoder_cnt_pre)/100; encoder_cnt_pre =encoder_cnt;

//truyen tin sprintf(msg,"speed = %d\r\n", speed);

HAL_UART_Transmit(&huart1, msg, sizeof(msg), 1);

/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

/** Initializes the CPU, AHB and APB buses clocks

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK| RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) ! HAL_OK)

*/ static void MX_TIM1_Init(void)

/* USER CODE BEGIN TIM1_Init 0 */

/* USER CODE END TIM1_Init 0 */

/* USER CODE BEGIN TIM1_Init 1 */

The TIM1 timer initialization code sets up the timer instance with a prescaler of 159, an up-counter mode, and a period of 999 It configures the clock division to DIV1 and disables auto-reload preload The initialization is completed by calling HAL_TIM_Base_Init, which must return HAL_OK for successful setup.

} sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)

} if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

} sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) ! HAL_OK)

The PWM configuration for the timer is set to TIM_OCMODE_PWM1 with a pulse value of 299 The output polarity is defined as TIM_OCPOLARITY_HIGH, and the complementary output polarity is also set to TIM_OCNPOLARITY_HIGH Fast mode is disabled, and both idle states are configured to reset The configuration is applied to TIM_CHANNEL_1 of htim1 using the HAL_TIM_PWM_ConfigChannel function, which should return HAL_OK for successful execution.

The configuration for the break and dead time settings in the timer is established with the following parameters: the off state run mode is disabled, the idle mode is also disabled, and the lock level is set to off The dead time is configured to zero, with the break state disabled and the break polarity set to high Additionally, automatic output is disabled If the function HAL_TIMEx_ConfigBreakDeadTime is not executed successfully, an error will occur.

/* USER CODE BEGIN TIM1_Init 2 */

/* USER CODE END TIM1_Init 2 */

*/ static void MX_TIM3_Init(void)

/* USER CODE BEGIN TIM3_Init 0 */

/* USER CODE END TIM3_Init 0 */

/* USER CODE BEGIN TIM3_Init 1 */

To initialize the TIM3 timer for encoder mode, set the instance to TIM3 with a prescaler of 0, an up-counter mode, and a period of 65535 Configure the clock division to TIM_CLOCKDIVISION_DIV1 and disable auto-reload preload For encoder settings, use TIM_ENCODERMODE_TI1 with rising edge polarity for both input channels Select direct TI for input capture, apply a prescaler of DIV1, and set the input filter to 0 Finally, check if the HAL_TIM_Encoder_Init function returns HAL_OK to confirm successful initialization.

} sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) !HAL_OK)

/* USER CODE BEGIN TIM3_Init 2 */

/* USER CODE END TIM3_Init 2 */

*/ static void MX_USART1_UART_Init(void)

/* USER CODE BEGIN USART1_Init 0 */

/* USER CODE END USART1_Init 0 */

/* USER CODE BEGIN USART1_Init 1 */

To initialize the USART1 interface, set the baud rate to 9600, configure the word length to 8 bits, and establish one stop bit with no parity The mode is set for both transmission and reception, while hardware flow control is disabled Additionally, the oversampling rate is configured to 16 The initialization process is completed with a check to ensure that the HAL_UART_Init function executes successfully.

/* USER CODE BEGIN USART1_Init 2 */

/* USER CODE END USART1_Init 2 */

*/ static void MX_GPIO_Init(void)

HAL_RCC_GPIOD_CLK_ENABLE();

HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);

/*Configure GPIO pins : PA0 PA1 PA2 */

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/*Configure GPIO pins : PA3 PA4 */

GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);

HAL_NVIC_EnableIRQ(EXTI0_IRQn);

HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);

HAL_NVIC_EnableIRQ(EXTI1_IRQn);

HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);

HAL_NVIC_EnableIRQ(EXTI2_IRQn);

/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{ if(GPIO_Pin==GPIO_PIN_0)

{ while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)==0){} HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3); var0;

} if(GPIO_Pin==GPIO_PIN_1)

{ while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0){} if(var100) var=var-400;

HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,var); } void pid_init(arm_pid_instance_f32 * S,float Kp,float Ki, float Kd) {

/* Check whether state needs reset or not */

} void pid_setPoint(arm_pid_instance_f32 * S,float sp)

* @brief Reset function for the floating-point PID Control.

* @param[in,out] S is an instance of the floating-point PID Control structure */ void pid_reset(arm_pid_instance_f32 * S)

/* Clear the state buffer The size will be always 3 samples */ memset(S->state, 0, 3U * sizeof(float));

} float pid_cal(arm_pid_instance_f32 * S, float in)

{ float out; float err = S->SP - in;

/* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ out = S->state[2] + S->A0 * err + S->A1 * S->state[0] + S->A2 * S->state[1];

/* return to application */ return (out);

* @brief This function is executed in case of error occurrence.

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */ disable_irq(); while (1)

/* USER CODE END Error_Handler_Debug */

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

*/ void assert_failed(uint8_t *file, uint32_t line)

/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */

Ngày đăng: 03/01/2024, 13:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w