STM32F103CST6: Sử dụng vị điều khiển này để thực hiện việc đọc tín hiệu từ encoder, tính toán và điều khiển dong co DC.. - Dé xm việc do các công ty vừa và nhỏ sử dung STM32 trong cac in
Trang 1
DAI HOC QUOC GIA THANH PHO HO CHI MINH
TRUONG DAI HOC BACH KHOA
Trang 2MUC LUC
CHƯƠNG 2: Giới thiệu về vi điều khiến STM32F103C8T6 và môi trường phát triển sử dụng 5 2.1 Giới thiệu về vi điều khiển STM32F103C8T6 5
2.4.2 STMB2F103CBT6 cccccsssscescessessesssessessesssssscssessssssessessnsssessesseessessesaseesssseescessseaceacearecsesteseeesceneeses 6
2.2 Động cơ Dc-encoder 9
CHƯƠNG 3: Thiết kế mạch điều khiến và kết nối với động cơ DC -encoder 5 -<ccseccesee 13 3.1 L298 là gøì, có chức năng gì? 14 3.2 Thông tin động cơ DC-encoder 15
CHƯƠNG 4: Lập trình vi điều khiển SIM32F103C§T6 để đọc thông tin từ encoder và điều khiến động
4.3 Code stm32 27
5.1 Tong Quan về Winform C# 48 5.2 Giao Diện vad code C# 49 5.3 Code winform C# 49 5.4 Giải thích phần chính của code 54 CHƯƠNG ó: Kết quả mô phỏng, 58 6.1 Kết quả mô phông 58
Trang 3LOI MO DAU
Ngày nay với sự phát trién cia khoa hoc ki thuật STM32 cũng trở nên phổ biến trong nhiều lĩnh vực xuất hiện nhiều trong các ngành công nghiệp, y tế, giám sát điều khiển, Trong bài báo cáo này em sẽ trình bày một số niệm liên qua đến stm32 và sử dụng stm32 đề điều khiển động cơ DC Trong quá trình thực hiện em vẫn còn l số thiếu sót em mong đợi những góp ý từ thầy cô để em có thê hoàn thiện hơn
Em chân thành cảm ơn cô Hồ Thanh Phương đã giành thời gian hướng đẫn và chỉ bảo
tận tính trong suốt quá trình em thực hiện đề tài để có được kết quả tốt nhất
Trang 4CHUONG 1: Giới thiệu về Đề Tài
Tổng quan về đề tài
Xây dựng mô hình phần cứng và giải thuật điều khiển có hồi tiếp động cơ (DC/AC/BLDC, không dùng động cơ step), khảo sát đáp ứng của hệ thống bằng phần mềm máy tính (hoặc wed app) Trong đề tài này em sử dựng STM32fI03c8t6 đề thực hiện điều khiển động cơ DC-encoder
Vẻ Cầu trúc phân cứng:
Động cơ DC: Sử dụng một động cơ DC dé thực hiện các thử nghiệm và đo lường đáp
ứng của hệ thống điều khiên
Encoder: Kết nối một encoder với động cơ DC đề do vị trí và tốc độ quay của động cơ
STM32F103CST6: Sử dụng vị điều khiển này để thực hiện việc đọc tín hiệu từ encoder, tính toán và điều khiển dong co DC
Giao tiếp: Kết nói STM32F103C8T6 với máy tính thông qua giao tiếp nối tiếp UART
dé truyén dữ liệu va diéu khién từ xa
Giải thuật điều khiển:
Phần mềm điều khiến: Sử dụng STM32Cube[IDE hoặc các công cụ phat triển khác đề
lập trình vi điều khiển STM32F103C§Tó6 Sử dụng ngôn ngữ lập trình như C/C++ để triển khai các giải thuật điều khiên
Đọc encoder: Viết mã đề đọc tín hiệu từ encoder và tính toán vị trí và tốc độ quay của dong co DC
Điều khiển: Áp đụng một phương pháp điều khién nhu diéu khién PID (Proportional-
Integral-Derivative) dé diéu khién động cơ DC dựa trên thông tm từ encoder
Giao tiếp: Xây đựng giao tiếp giữa vi điều khiển STM32F103C§T6 va may tinh dé
truyền đữ liệu đo lường và điều khiên từ xa
Phân mềm máy tính hoặc web app:
Trang 5Xây dựng phần mềm may tinh dé hién thi dữ liệu đo lường từ encoder và gửi tín hiệu
điều khiến đến vi điều khiển STM32F103C§T6
Sử dụng các công nghệ phần mềm C# đề xây dựng giao diện người dùng và giao tiếp với vi điều khiển qua giao tiếp nối tiếp UART
Trang 6CHUONG 2: Giéi thiéu vé vi diéu khién STM32F103C8T6 va méi
trường phát triên sử dụng 2.1 Giới thiệu về vi điều khiển STM32F103C§T6
2.1.1 STM32 la gi?
STM32 là một dòng vi điều khiên (MCU - Microcontroller Unit) phé bién diroc san
xuất bởi cong ty STMicroelectronics STM32 noi tiéng với sự linh hoạt và hiệu suất cao, là
sự lựa chọn hàng đầu trong nhiều ứng dụng nhúng và dự án IoT (Internet of Things)
Lập trình STM32 nói riêng hay lập trình Vi Điều Khiên (MCU) đều sử đụng 2 ngôn
ngữ chính đó là C và C++
Đặc điểm chính của vi điều khiển STM32:
- - Kiến trúc ARM Cortex-M: Các dòng STM32 thường sử dụng các lõi vi xử ly ARM Cortex-M, cung cấp hiệu suất mạnh mẽ và tiêu thụ năng lượng hiệu quả
‹ - Dải sản phẩm đa dạng: STM32 cung cấp nhiều đòng sản phẩm với các tính năng và cầu hình khác nhau, từ dòng F0 đành cho ứng dụng giá rẻ, đòng F1 dành cho các ứng
dụng đòi hỏi hiệu suất cao, đến đòng H7 với hiệu suất cao và các tính năng đặc biệt
‹ - Bộ nhớ dữ liệu và chương trình: Hầu hết các dòng STM32 có các tùy chọn bộ nhớ
flash (ROM) và RAM khác nhau, cung cấp linh hoạt cho các ứng dụng khác nhau
‹ - Tích hợp nhiều chức năng: STM32 thường được tích hợp với nhiều chức năng
nhu GPIO, USART, SPI, 12C, CAN, ADC, DAC, PWM, timers, va cac tinh nang
khác, giúp giảm chi phí và diện tích mạch in PCB
‹ - Hỗ trợ phần mềm đa dạng: STMicroelectronics cung cấp nhiều công cụ phần mềm
hỗ trợ như STM32CubeMX và STM32CubeIDE để giúp để đàng hóa quá trình phát triên
¢ Thưyiện chuẩn CMSIS và HAL: Sử dụng thư viện CMSIS (Cortex
Microcontroller Software Interface Standard) va HAL (Hardware Abstraction Layer), việc lập trình trở nên thuận tiện và chuyên nghiệp
‹ _ Hỗ trợ cộng đồng mạnh mẽ: Cộng đồng người dùng STM32 rộng lớn, có nhiều tài nguyên trực tuyển, diễn đàn, và mã nguôn mở đề hô trợ người dùng
Trang 7* Téc dé xt ly cao, ngoai Vi hỗ trợ rất nhiều, dong chip phan khuc thap la
STM32F0x cting co the hoat động lên tới 4SMhz, 64kB Flash, I6kB RAM, § bộ
Timer 16 bit, 1 b6 Timer 32 bit, 10 b6 ADC 12 bit, 8 b6 USART, 2 bộ SPI, 2 bộ
ĐC
« Gia thành rẻ nhưng hiệu quả đem lại lớn
¢ Hoc lap trinh STM32 rat dé dàng do cộng đồng hỗ trợ nhiều
- Dé xm việc do các công ty vừa và nhỏ sử dung STM32 trong cac ing dung rất nhiêu
« _ Công cụ lập trình đều Free và đầy đủ tài liệu hỗ trợ
Vi điều khiển STM32 là một công cụ mạnh mẽ cho các nhà phát triển nhúng, từ
những dự án nhỏ đến các ứng dụng phức tạp đòi hỏi hiệu suât và độ tin cậy cao
2.1.2 STM32F103C8T6
HÌNH I.STM32F103C§T6
Trang 8STM832 là một trong những dòng chip phố biến của ST với nhiều họ thông dụng như EF0,F1,F2,F3,F4 Stm32f103 thuộc họ F1 với lõi là ARM COTEX M3 STM32F103 là vị
điều khiến 32 bít, tốc độ tối đa là 72Mhz Giá thành cũng khá rẻ so với các loại vi điều khiển
có chức năng tương tự Mạch nạp cũng như công cụ lập trình khá đa dạng và để sử dụng Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều khiển ứng dụng thông thường, thiết bị cầm tay và thuốc, máy tính và thiết bị ngoại vi chơi game, GPS
cơ bản, các ứng dụng trong công nghiệp, thiết bị lập trình PLC, biến tần, máy in, máy quét,
hệ thông cảnh báo, thiết bị liên lạc nội bộ
Phân mềm lập trình: có khá nhiều trình biên dịch cho STM32 như IAR Embedded
Workbench, Keil C G day minh str dung Keil C nén các bài viết sau mình chỉ đề cập đến Keil C
Thu vién lap trinh: co nhiều loại thư viện lập trình cho STM32 như: STM32snippets,
STM32Cube LL, STM32Cube HAL, Standard Peripheral Libraries, Mbed core Mỗi thư viện đều có ưu và khuyết điểm riêng, ở đây mình xin phép sử dụng Standard Peripheral Libraries vì nó ra đời khá lâu và khá thông dụng, hỗ trợ nhiều ngoại vi và cũng dễ hiểu rõ
bản chất của lập trình
Mach nap: co kha nhiéu loại mạch nạp nhu : ULINK, J-LINK , CMSIS-DAP,
STLINK ở đây mình sử dụng Stlink vì giá thành khá rả và debug lỗi cũng tốt
Board đề lập trình: các bạn có thé mua san 1 số kít ra chân đã có sẵn trên thị trường
hoặc thiết kế l cái board dành riêng cho bản thân mình Ở đây mình đã thiết kế 1 board đã
tích hợp sẵn mạch nạp, mình cũng đã test và chạy khá ôn, debug bằng Keil C khá giống với
phiên bản STlink V2 trên thị trường
So luoc vé STM32F 103C8T6:
¢ 1 cong Mini USB ding dé cap ngu6n, nạp cũng như debug
¢ C6 chan Output riêng cho các chân mạch nạp trên MCU]
Trang 9© Chan cap nguén ngoai riéng cho MCU2 néu khéng str dung nguén tir USB
e =Thach anh 32,768khz dung cho RTC va Backup
e Chan nap ding cho chế độ nap boot loader
¢ Nut Reset ngoai va | led hiển thi trén chan PB9, 1 led bao nguồn cho MCU2
Thành phần: Board có thê sử dụng một số loại MCU 48 pin của ST(vì sơ đồ chân
cũng khá tương đồng giữa các dòng F0, Fl, F2, F3, F4) như : STM32F100C§Tó,
STM32F 103C8T6, STM32F303CCT6
Cầu hình chỉ tiết của STM32F103C8176:
ARM 32-bit Cortex M3 với clock max là 72Mhz
Thạch anh nội dùng dao động RC ở mode 8Mhhz hoặc 40khz
Sử dụng thạch anh ngoài 32.768khz được str dung cho RTC
Trong trường hợp điện áp thấp:
Co cac mode :ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ
Cấp nguồn ở chân Vbat bằng pin đề hoạt động bộ RTC và sử dụng lưu trữ data khi mat ngu6n cap chính
Trang 102 bộ ADC 12 bít với 9 kênh cho mỗi bộ.
Trang 11Khoảng giá tri chuyén doi tir 0 —
3.6V Lay mau nhiéu kénh hoac 1
kénh
Có cảm biến nhiệt độ nội
CPU DMA: bộ chuyên đối này giúp tăng tốc độ xử lý do không có sự can thiệp quá sâu của
7 kênh DMA
Hỗ trợ DMA cho ADC, I2C, SPI, UART
7 timer
3 timer 16 bít hỗ trợ các mode IC/OC/PWM
1 timer 16 bít hỗ trợ để điều khiên động cơ với các mode bảo vệ như ngắt input, dead- time
2 watdog timer dùng để bảo vệ và kiểm tra lỗi
1 sysTick timer 24 bit đêm xuống dùng cho các ứng dụng như ham
Delay Hỗ trợ 9 kênh giao tiếp bao gồm:
2 bộ I2C(SMBus/PMBuạ)
3 bộ USART(SO 7816 mferface, LIN, IrDA capability, modem
control) 2 SPIs (18 Mbit/s)
1 b6 CAN interface (2.0B
Active) USB 2.0 full-speed
interface Kiểm tra lỗi CRC và
96-bit ID
2.2 Động cơ Dc-encoder
Động cơ Encoder (motor encoder, tiéng Anh la Rotary Encoder) la tén cua 1 loai
10
Trang 12động cơ có phần con quay được tích hợp trong 1 hệ thống tự động nhằm mục đích tạo tín
hiệu xung trong hoạt động điều khiển động cơ hoặc các máy móc, thiết bị vận hành trong
quá trình sản xuất
Trang 13Thong thudng, ngudi ta hay goi la Quadrature Encoder, Linear Encoder, Rotary Encoder, hoặc có thể gọi tắt là encoder Mặc dù có khá nhiều tên gọi nhưng mục đích chủ yếu của các dòng encoder chính là thực hiện mã hóa số vòng quay nhằm mục đích tạo tín hiệu xung có dạng vuông ở trong quá trình điều khiển động cơ
Dựa trên sơ đồ tín hiệu có đạng nhị phân thì tất cả các đòng encoder đều có thê hỗ trợ
hoán đổi được các vị trí góc hoặc các vị trí thăng căn cứ theo yêu cầu người sử dụng có mong muốn dịch chuyên đến vị trí điều khiển như thể nao
Cấu tạo và nguyên lý hoạt động:
Các đòng động cơ DC ecoder thường có cầu tạo khá đơn giản, bao gồm I thanh đĩa inox tròn được gắn vào l cái trục quay, trong đó:
Có 2 đèn led ở dưới dạng thu và phát,
Lớp boar mạch giúp bạn phân tích và xử lý dữ liệu
Encoder hoạt động tuân theo nguyên lý đó là khi ta cung cấp nguồn cho nó và khi tất
cả các trục quay đều hoạt động Đồng thời, động cơ còn tạo cho đĩa tròn được xoay vòng khi bạn đã xoay kéo theo chiếc đèn led sáng
Tất nhiên, ở trên đĩa tròn xoay còn có | cai lỗ và các lỗ này cũng được xen kẽ nhau Dựa vào đó, hệ thống xử lý vi boar mạch sẽ đếm tất cả các lượt quay bằng cách đèn xuyên qua lỗ, hoặc có thể không xuyên qua bằng I con bắt tích hợp ở trong đó truyền báo về
Cũng chính vì vậy, các xung vuông của động cơ được tạo ra và bạn có thể đếm được
thông qua độ cắt của ánh sáng từ chiếc đèn led thông qua các lỗ hồng trên
Trang 14Động cơ Ecoder „x2
PHOTO SENSOR
SQUARING CIRCUIT
Hình 2 Encoder tạo ra tín hiệu xung căn cứ vào số lần ánh sáng đèn led cat dĩa inox Chắc chắn, trong khi đó tín hiệu xung vuông đang có khả năng tăng giảm theo yêu cầu Bên cạnh đó, nếu nó ở gần các động cơ lớn hoặc bộ phận biến tan sé gây ra tín hiệu làm
nhiều xung, đo đó gây ra tỉnh trạng mất độ chính xác cho động cơ encoder trong khi hoạt động
Do đó, động cơ encoder có nhiệm vụ quan trọng là tạo các điểm xung vuông trên đồ thi sao cho chúng lệch nhau I góc 90 độ Từ 2 tín hiệu lệch góc đó, các bạn sẽ xác định được
hướng quay cũng như vi tri quay cua con motor servo
2.3 Môi trường phát trién STM32F103C8T6
Môi trường phát triển chính cho vi diéu khién STM32F 103C8T6 la STM32CubelDE
Đây là một công cụ phát triển tích hợp (IDE) cung cấp môi trường phát triển hoàn chỉnh cho
vi điều khién STM32 của STMIicroelectronics.
Trang 15STM32CubeIDE là một IDE dựa trên Eclipse, cung cấp các tính năng như viết mã,
biên dịch, gỡ lỗi và nạp chương trình cho vi điều khiên STM32F103C§T6 Nó hỗ trợ nhiều
ngôn ngữ lập trình như C và C++
Đặc điểm chính của STM32CubeIDE bao gồm:
Trình biên dich: STM32CubeIDE tich hop bd bién dich GCC (GNU Compiler Collection) dé bién dich mã nguồn thành mã máy thích hợp cho vi điều khiển STM32F103C8T6
Gỡ lỗi: STM232CubeIDE cho phép gỡ lỗi chương trình trực tiếp trên vi điều khién No cung cấp các tính năng như theo dõi biến, bước từng bước (step-by-step) và gỡ lỗi tín hiệu
Cầu hình phần cứng: STM32CubeIDE đi kèm với STM32CubeMX, một công cụ cho
phép bạn cầu hình phần cứng của vi điều khiên STM32F103C§T6 thông qua giao diện đồ họa Bạn có thê chọn các chức năng ngoại vi, thiết lập chân GPIO, cầu hình giao tiếp và nhiều hơn nữa
Thư viện và bộ phân phối: STM32CubeIDE đi kèm với STM32CubeF1, một bộ phần
mềm đi kèm với các thư viện, bộ điều khiển và ví dụ ứng dụng để bạn có thê bắt đầu phát
triển dự án trên vi điều khiển STM32F103C§T6 một cách nhanh chóng.
Trang 16CHUONG 3: Thiét kế mạch điều khiến và kết nối với động cơ DC -
mE: = IN4 OUT2 i
Hình3 Sơ đồ mạch kết noi vi điều khiển và động cơ DC-encoder
Trong đồ án này em sử dụng proteus để mô phỏng bao gồm vi điều khiển STM32F103C8T6, L298, mạch đảo chiều , động cơ DC-encoder Chân PB6 của vi điều
khiển nối với chân ENA của I298 và chân A của OC§ILLOSCOPE, chân INI và chân IN2 nối lần lượt với chân IN1 và chân IN2 của L298 Về phan L298 cấp nguồn 12v và chân I,
15, 8 nỗi đất Phần mạch đảo chiều bao gồm 4 diode theo tu ty la d1.d2.d3.d4 Khi co dong
điện chạy qua DI và D4 thì động cơ quay theo chiều thuận, Khi dòng chạy qua D2 Và D3 thì động cơ quay ngược chiều Ngõ ra của mạch kết nối với VCC và GND của DC-encoder
Trang 17U6 EE D1 + D2
UF4001 UF4001
Chức năng chính của vi mach L298 bao gồm:
Điều khiên động cơ: L298 cho phép người dùng điều khiển tốc độ quay và hướng quay của động cơ DC Nó được thiết kế để hoạt động với các động cơ DC có dòng điện lớn
và có thê điều khiển động cơ với đòng điện lên đến 2A
Đảo chiều quay động cơ: L298 có khả năng đảo chiều quay của động cơ DC, cho phép quay theo cả hai chiều (thuận và ngược) thông qua các tín hiệu điều khiến
Bảo vệ quá dòng: L298 có tích hợp chức năng bảo vệ quá đòng đề ngăn chặn thiết bị
bị hỏng trong trường hợp dòng điện vượt quá giới hạn cho phép
Giao tiếp: L298 sử dụng giao điện điều khiển đơn giản, thông qua tín hiệu điều khiển
từ vi điều khiển như Arduino hoặc vi điều khiên STM32 Thông qua các tín hiệu điều khiển,
người dùng có thể kiểm soát tốc độ quay và hướng quay của động cơ DC
Trang 18Két néi: L298 co cac chan két néi cho nguén cấp, đầu vào tín hiệu điều khién va dau
Part Value: Hidden: () Help
LISA Model File: ENCMOTOR Hide All Nhi Cancel
(_) Exclude from Simulation
@ Exclude from PCB Layout Hide common pins
Exclude from Current Variant
Hình 5: thông số của động cơ DC-encoder
Điện áp danh định (Nominal Voltage: 12V): Đây là điện áp mà động cơ được thiết
kế để hoạt động hiệu quả nhất
Trang 19Điện trở cuộn dây (Cọl Resistance: 50): Day là sức kháng của cuộn dây trong động
cơ, ảnh hưởng đến hiệu suất và nhiệt độ hoạt động của động cơ
Từ trở cuộn dây (Coil Inductance: 100mH): Dây là thơng số cho biết sự tự chủ về
từ tính của cuộn dây, liên quan tới tốc độ phản hồi và hiệu suất cua motor
Vịng quay khơng tải (Zero Load RPM: 800): Đây là tốc độ vịng quay mỗi phút khi khơng cĩ tải, cho biết tốc độ tối đa mà motor cĩ thê chạy mà khơng cĩ gánh nặng nào Tải/Torque tối đã (Load/Max Torque %: 90): Đây là phần trăm momen xoắn tối
đã so với momen xoắn khi khơng cĩ tải; cho biết sức mạnh và khả năng xử lý gánh nặng của
motor
Khối lượng hiệu quả (Effective Mass: 0.01): Đây là khối lượng hiệu quả liên quan toi inercia va kha năng xử lý gánh nặng xoay vịng của motOr
Xung mỗi vịng quay (Pulses per Revolution: 360): Đây là số xung trong mỗi chu kỳ
xoay, thường được sử dụng dé kiểm sốt và theo dõi vị trí hoặc tốc độ xoay
Ngồi ra cịn 1 cơng com hỗ trợ giao tiếp giữ máy tính và uartl
Trang 20Hình 6: cổng com Cổng com kết nối với 2 chân PA9 và PA10 của STM32F103C§T6 tương ứng với 2 chân TX(transmrt) và chân RX(recerver) đảm nhận chức năng truyền và nhận dữ liệu của uart]
Part Reference:
Part Value:
VSM Model:
Physical Baud Rate:
Physical Data Bits:
Physical Parity:
Virtual Baud Rate:
Virtual Data Bits:
Công com nay str dung Com4 voi Baud rate 9600, Databit 8, Party NONE Céng com ding
đề giao tiệp stm32 với máy tính
Trang 21CHUONG 4: Lập trình vi điều khiến STM32F103C8T6 để đọc thông
tin từ encoder và điêu khiên động cơ DC
4.1 Phần cứng của STM32F103C§T6
Về phần mèn lập trình em sử dựng phần mềm STM32CubeIDE ,phần mềm nay pho biến được sử dụng để phát triển ứng dụng trên vi điều khiển STM32 là STM32CubeIDE Đây là một môi trường phát triển tích hợp (IDE) được cung cấp bởi STMicroelectronics, nhằm hỗ trợ việc lập trình và phát triển ứng dụng trên các dòng vi điều khiển STM32 STM32CubeIDE dựa trên nền tảng Eclipse và cung cấp các tính năng như lập trình, biên dịch, gỡ lỗi và nạp chương trình cho vi điều khiển STM32 Nó hỗ trợ nhiều ngôn ngữ lập trình như C và C++
Trong STM32CubeIDE, bạn cũng có thê sử dụng công cụ STM32CubeMX đề cấu
hình phân cứng của vị điều khiên STM32 và tự động tạo mã mau dé bắt đầu phát triển ứng dụng
20
Trang 22Hinh 8: phan cimg stm32f103c8t6
Đầu tiên ta khởi tạo các chân PBI3,PBI14,PBI5 với chức năng input, chan PB3,PB4, PB5 chức năng output các chân này dùng đề điều khiến [298
Về chân PBI3, PBI14, PBIS :
PB13 nía n/a Input Pull-up n/a
PB14 nía n/a Input Pull-up n/a
PB15 nía n/a Input Pull-up n/a BES!
Hinh 9 cau hinh input
3 chân này sử dụng GPIO ở chế độ Pull-up ( điện trở kéo lên)
Vẻ chân PB3,PB4, PB5:
21
Trang 23PBH4 nía Low Outp No pu High
PBS n/a Low Outp No pu High
Hinh 10: cau hinh output
Cac chan nay có ng6 ra o muc high(cao)
Tiếp theo ta khởi tạo uartl tương ứng với chân PA9 và PALO
USAR! wiuue anu vurmgurauon
® }JVIC Settings @ DMA Settings @ GPIO Settings
® Parameter Settings ® User Constants
NVIC Interrupt Table — Sub Priority
DMA‘1 channel5 global interrupt
USART1 global interrupt 1
22
Trang 24Hinh1 1: cau hinh uart!
Đối với uart | ta str dung mode Asynchronous ( khéng déng b6) và cho phép nhắt với Preemption Prority la 1
v Basic Parameters
Baud Rate 9600 Bits/s Word Length 8 Bits (including Parity) Parity None
Stop Bits 1
Hinh12: setting uartl
Với baud Rate là 9600 trùng với dữ liệu truyền của máy tính và cổng com
PA0-W n/a na Externa No pull- n/a
PA1 na na Input m No pull- n/a L]
Hình 14 Chân PA0,PAI
23
Trang 25Chân Pal này cĩ chức năng tạo xung và ở chế độ input, cho phép ngắt Pa0 , chân này cho phép kích cạnh xuơng
Tiếp theo là timer4 tương ứng với chân PBĩ
VIOäE
Slave Mode |Disable v
Trigger Source |Disable Vv
® Parameter Settings ® User Constants
Configure the below parameters |
Y Counter Settings
Prescaler (PSC - 16 bits v 8
Counter Mode Up
Counter Period (AutoReloa 1000
Internal Clock Division (CKD) No Division
auto-reload preload Disable
*⁄ Trigger Output (TRGO) Parameters
Master/Slave Mode (MSM Disable (Trigger input effect not delay
Hình 15: Cấu hình timer4
Ta chon Internal Clock va Channel 1 la PWM Generation CH1 gia tri scale la 8 va couter 1000
24
Trang 26Tiếp theo là sys tương ứng với chân pal4
eS
BeBug! Serial Wire v
@ System Wake-Up
Timebase Source |SysTick v
Hinh 16: cau hinh sys
Chon Serial Wire
Tiép theo la timer2
25
Trang 27
Slave Mode [Disable v |
Trigger Source [Disable v |
Clock Source lInternal Clock vị
Prescaler (PSC - 16 bits v 800
Counter Mode Up
Counter Period (AutoReloa 1000
Internal Clock Division (CKD) No Division
auto-reload preload Disable
¢ Trigger Output (TRGO) Parameters
Master/Slave Mode (MSM Disable (Trigger input effect not delay
Trigger Event Selection Reset (UG bit from TIMx_EGR)
Hinh 17: cấu hình timer2
Chịn xung clock la internal clock tức giao động nội, scaler 800, counter 1000, cho phép
ngắt trong ing vs chu ki 0.1s
Cuối cùng ta dùng thêm timer 1 dé đo vận tốc
26
Trang 28Trigger Source [Disable v |
Clock Source lInteral Clock v |
Counter Period (AutoReloa
Internal Clock Division (CKD) No Division
Repetition Counter (RCR - 0
auto-reload preload Disable
* Trigger Output (TRGO) Parameters
x HH HH em — - ls
Hình 18: Cau hinh timer]
Vai clock la internal clock ( giao động noi), scaler 800, couter 1000 tương ứng vs chu
kì 0,1s, và cho phép ngát ở chế độ Timerl update interrupt
Công thức tinh chu ki
F
Tgcalescounier
Voi F=8M hz
27
Trang 29Voi CCR là giá trị thanh ghi CCR
ARR la gia tri thanh ghi ARR
28
Trang 30> Error = setpoint -outpu:
Y(t)= Kp*e(t) +KÍ* l e(0dr +Kd*" e@)
™ derivatiye = (error - errpr_truoc) / Delta_t,
Y(t)= Kp*e(t) +Ki* f e(t)dr + Kd** e(t)
0 dt
> output = (Kp * error) + (Ki * integral) + (Kd * derivative);
chu thich: derivative la: ¢ e(t )
Trang 31/* USER CODE BEGIN Header */
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component
* Ifno LICENSE file comes with this software, it is provided AS-IS
Trang 32/* USER CODE END PTD */
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro
*/
*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
volatile uint8_t buffer[4];
/* USER CODE END PV */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA _Init(void);
static void MX_TIM4_Init(void);
static void MX_TIM2_Init(void);
static void MX_TIM1_Init(void);
31
Trang 33static void MX_USART1_UART_Init(void):
/* USER CODE BEGIN PFP */
32
Trang 34/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
#define GPIO_NN_Thuan GPIOB
#define GPIO_PIN_NN_Thuan GPIO PIN 13
#define GPIO_NN_Nghich GPIOB
#define GPIO_PIN_NN_Nghích GPIO PIN 14
#define GPIO_NN_ Dung GPIOB
#define GPIO_IN1 GPIOB
#define GPIO_PIN_IN1 GPIO_ PIN 3
#define GPIO_IN2 GPIOB
#define GPIO_PIN_IN2 GPIO PIN 4
#define GPIO_ENA GPIOB
#define GPIO_PIN_ENA GPIO PIN Š
int Trang Thai = 0;
void Xuat_PWM(TIM_HandleTypeDef *htim, uint32_t Channel, float Duty_Cycle) Duty_Cycle = Duty_Cycle / 100 * htim->Instance->ARR;
HAL TIM SET COMPARE(htim, Channel, (uintl6_t)Duty_ Cycle);
}
void QuayThuan() {
HAL_GPIO_WritePin(GPIO_IN1, GPIO_PIN_INI, GPIO_PIN SET);
HAL_GPIO_WritePin(GPIO_IN2, GPIO_PIN_IN2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIO_ENA, GPIO_PIN_ ENA, GP/O_PIN_ SET),
}
void QuayNghich() {
HAL_GPIO_WritePin(GPIO_IN1, GPIO_PIN_INI, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIO_IN2, GPIO_PIN_IN2, GPIO_PIN_ SET);
HAL_GPIO_WritePin(GPIO_ENA, GPIO_PIN_ ENA, GP/O_PIN_ SET),
}
void Dung() {
HAL_GPIO_WritePin(GPIO_IN1, GPIO_PIN_INI, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIO_IN2, GPIO_PIN_IN2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIO_ENA, GPIO_PIN ENA, GPIO_PIN RESET);
33
Trang 35Trang Thai = 0;
}
}
volatile long xung;
void HAL_GPIO_EXTL Callback(uint16_t GPIO_Pin) £{
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0) {
xung ;
} else {xung++;}
volatile float giatrido_hientai, error = 0, error_truoc = 0;
volatile static float integral = 0, derivative = 0;
volatile float setpoint = 50, Kp =2, Ki=1, Kd=1;
volatile float Delta_t = 0.1;
volatile float output;
volatile static float xung_ vantoc_hientai, xung_vantoc_truoc = 0;
volatile static float Delta time vantoc = 0.1;
volatile static float vantoc;
volatile float number;
Trang 36void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim == &htim1) {
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
xung_ vantoc_hientai = xung:
vantoc = (xung_vantoc_hientai - xung vantoc truoc)/360
xung vantoc truoc = xung vantoc_hiental;
}
if (htim == &htim2) {
giatrido_hientai = vantoc;
error = setpoint - giatrido_hientat;
integral = integral + (error * Delta_t);
derivative = (error - error_truoc) / Delta_t;
output = (Kp * error) + (Ki * integral) + (Kd * derivative);
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
35