Khi động cơ hoạt động, cảm biến Hall sẽ liên tục thay đổi trạng thái. Cảm biến Hall sẽ lần lượt đạt đến từng trạng thái khi rotor quay và sẽ trở về trạng thái ban đầu khi mạch điều khiển kết thúc một chu kỳ kích từ. Để tính toán được tộc độ động cơ, vi điều khiển sẽ đo khoảng thời gian giữa hai lần thay đổi trạng thái của cảm biến, kết hợp với số lần thay đổi trạng thái của cảm biến khi động cơ quay đủ một vòng, qua tính toán sẽ biết được tốc độ quay của động cơ mỗi khi cảm biến thay đổi trạng thái.
Hình 4.19. Phương pháp xác định tốc độ động cơ
Đây là cách tính toán được sử dụng phổ biến, có độ chính xác cao. Mặc dù dài tốc độ tính toán sẽ bị giới hạn bởi đặc tính làm việc của bộ đếm thời gian trong vi điều khiển và thời gian lấy mẫu sẽ phụ thuộc vào tốc độ quay của động cơ nhưng những vấn đề này có thể được xử lý thông qua quá trình lập trình. Nhìn chung, đây vẫn là phương pháp đơn giản, hiệu quả và đáng tin cậy để lấy dữ liệu tốc độ động cơ, độ chính xác cao sẽ hỗ trợ
CHƯƠNG 5: LẬP TRÌNH ĐIỀU KHIỂN ĐỘNG CƠ BLDC 5.1. Giới thiệu môi trường phát triển tích hợp STM32CubeIDE
STM32CubeIDE là một môi trường phát triển tích hợp (hay IDE) được phát triển bởi STMicroelectric, là công cụ lập trình và phát triển phần mềm chính thức của dòng vi điều khiển STM32 và là một phần của hệ sinh thái phần mềm STM32Cube. STM32CubeIDE có giao diện gần giống với Eclipse IDE, là một môi trường phát triển tích hợp của ngôn ngữ Java, phần mềm tích hợp nhiều chức năng của các phần mềm tiền nhiệm (TRUEStudio và STM32CubeMX), bao gồm nền tảng lập trình nâng cao cho ngôn ngữ C/C++, công cụ cấu hình và thiết lập ngoại vi cho vi điều khiển dựa trên hình ảnh trực quan, công cụ tạo mã nguồn chương trình, biên dịch, gỡ lỗi nâng cao kết hợp đồng thời với ST-Link. Ngoài ra STM32CubeIDE còn hỗ trợ người dùng với một hê thống thư viện lập trình tích hợp gồm nhiều câu lệnh thực thi trực tiếp (macro), các hằng số được khai báo sẵn, các thanh ghi được đơn giản hóa nhằm hỗ trợ quá trình phát triển ứng dụng và các hàm chương trình được lập trình sẵn, có tên là thư viên HAL (Hardware Abstraction Layer).
Hình 5.1. Môi trường phát triển tích hợp chính thức của vi điều khiển STM32 – STM32CubeIDE
5.2. Các ngoại vi sử dụng trong quá trình điều khiển5.2.1. Bộ định thời Timers (TIM) 5.2.1. Bộ định thời Timers (TIM)
Bộ định thời – Timer là một trong số những ngoại vi cần thiết nhất trong công việc điều khiển động cơ. Ngoài chức năng xác định thời gian cho các vòng lặp kiểm tra và
tính toán của chương trình, bộ định thời Timer còn đóng vai trò tạo tín hiêu PWM để điều khiển tốc độ động cơ. Chương trình điều khiển sẽ sử dụng 6 bộ Timer của vi điều khiển nhằm các mục đích sau:
Timer 2, 3, 14 và 16 sẽ đóng vai trò là bộ tạo xung PWM cho các chân input/output của vi điều khiển.
Timer 17 sẽ tạo vòng lặp cho bộ điều khiển PID và hàm lấy giá trị ADC. Timer 6 sẽ được sử dụng để tính tốc độ động cơ.
5.2.2. Bộ chuyển đổi Analog – Digital (ADC)
Để đọc và theo dõi các tín hiệu như giá trị dòng điện, điện áp, nhiệt độ,… chương trình cần phải sử dụng một hay nhiều bộ chuyển đổi Analog – Digital. Bộ chuyển đổi này đóng vai trò chuyển đổi các tín hiệu tương tự (analog) từ các cảm biến thành tín hiệu số (digital) mà vi điều khiển có thể đọc và xử lí được. Các kênh chuyển đổi được sử dụng trong chương trình gồm:
Kênh ADC_IN0 sẽ đọc giá trị của biến trở
Kênh ADC_IN8 sẽ đọc giá trị của nhiệt độ MOSFET
Kênh ADC_IN10 sẽ đọc giá trị của dòng điện qua cuộn dây stator Kênh ADC_IN11 sẽ đọc giá trị của điện áp nguồn
5.2.3. Bộ truyền thông nối tiếp không đồng bộ (UART)
UART là một giao thức truyển thông nối tiếp được sử dụng rộng rãi và được tích hợp trên hầu hết các vi điều khiển hiện nay. Giao thức này có ưu điểm là thiết kế và cấu trúc dữ liệu đơn giản, dải tốc độ truyển tín hiệu rộng, có thể giao tiếp giữa 2 vi điều khiển không cùng tần số hoạt động. Giao thức truyền thông này được sử dụng trong đồ án với mục đích đưa các thông số theo dõi hoạt động của động cơ lên máy tính để xuất đồ thị hoặc lưu dữ liệu.
5.2.4. Watchdog Timer (WDT)
Watchdog Timer là một bộ định thời hoạt động độc lập với vi điều khiển bằng cách sử dụng mạch dao động riêng. Watchdog Timer có thể được tạo sự kiện ngắt hoặc khởi động lại vi điều khiển khi bộ đếm tràn hoặc khi giá trị bộ đếm đạt đến một giá định cố
dụng để khởi động lại vi điều khiển khi chương trình thực thi xảy ra lỗi và không thể tiếp tục điều khiển hoặc theo dõi đông cơ.
5.2.5. GPIO và ngắt ngoài (EXTI)
GPIO (General Purpose Input Output) là ngoại vi cần thiết được sử dụng để thiết lập chức năng của các chân tín hiệu vào và ra của vi điều khiển. Tùy vào từng ngoại vi và chức năng được kích hoạt mà các chân tín hiệu tương ứng có thể được thiết lập tự động hoặc bởi người dùng.
Ngắt ngoài – EXTI (External Interrupt) cho phép chương trình theo dõi trạng thái các chân tín hiệu đầu vào và tạo sự kiện ngắt tùy vào trạng thái của từng chân. Người lập trình có thể viết chương trình ngắt cho từng sự kiện ngắt riêng biệt. Trong chương trình này, ngắt ngoài được sử dụng để lấy tín hiệu từ cảm biến Hall, từ đó có thể tính toán tốc độ đồng thời thông báo vị trí kích từ tiếp theo cho vi điều khiển.
5.2.6. Truy cập bộ nhớ trực tiếp (DMA)
Truy cập bộ nhớ trực tiếp – DMA (Direct Memory Access) cho phép các ngoại vi trao đổi dữ liệu trực tiếp với nhau mà không cần thông qua lõi xử lí trung tâm. Ngoại vi này giúp vi điều khiển tiết kiệm tài nguyên xử lí, cho phép dử liệu được truyền nhận nhanh chóng nội bộ bên trong vi điều khiển. Chương trình điều khiển sẽ sử dụng DMA để lấy dữ liệu từ bộ chuyển đổi ADC, vì đây là ngoại vi sử dụng nhiều tài nguyên và dữ liệu chuyển đổi thường có kích thước khá lớn, sử dụng DMA để lưu trữ và truyền dữ liệu sẽ giúp vi điều khiển bảo toàn và đọc dữ liệu nhanh hơn so với các phương pháp truyền thống như chờ bộ chuyển đổi hoàn tất quá trình làm việc hoặc tạo chương trình ngắt để lấy dữ liệu.
5.3.1. Danh sách các hàm sử dụng trong chương trình điều khiển:
Tên hàm Chức năng
void SystemClock_Config(void) Thiết lập tần số làm việc của vi điều khiển
static void MX_GPIO_Init(void) Thiết lập chức năng các chân input/output
static void
MX_USART2_UART_Init(void
Thiết lập các thông số hoạt động của giao thức UART
static void MX_DMA_Init(void) Thiết lập các thông số hoạt động của DMA
static void MX_ADC_Init(void) Thiết lập thông số hoạt động bộ chuyển đổi ADC
static void MX_TIM2_Init(void); Thiết lập các thông số hoạt động bộ Timer 2
static void MX_TIM3_Init(void); Thiết lập các thông số hoạt động bộ Timer 3
static void MX_TIM6_Init(void); Thiết lập các thông số hoạt động bộ Timer 6
static void MX_TIM14_Init(void); Thiết lập các thông số hoạt động bộ Timer 14
static void MX_TIM16_Init(void); Thiết lập các thông số hoạt động bộ Timer 16
static void MX_TIM17_Init(void); Thiết lập các thông số hoạt động bộ Timer 17
static void MX_IWDG_Init(void); Thiết lập các thông số hoạt động của Watchdog Timer
Tên hàm Chức năng
static void Peripheral_Initiate() Khởi động các ngoại vi
static uint8_t
Set_PWM_Value(doubleduty)
Thiết lập giá trị chu kỳ làm việc cho bộ tạo xung PWM
static double getSpeed()
Lấy về giá trị tốc độ động cơ
static void Read_ADC_Value()
Đọc các giá trị của bộ chuyển đổi ADC
static void BLDCStart()
Động cơ bắt đầu hoạt động
static void BLDCStop()
Động cơ ngừng hoạt động
static void
BLDCBackwardCommutate(double
dutySet)
Chuyển bước kích từ theo chiều quay ngược
static void
BLDCForwardCommutate(double
dutySet);
Chuyển bước kích từ theo chiều quay thuận
static void dirCheck(uint16_t GPIO)
Cập nhật chiều quay của động cơ
static void hallCheck()
Cập nhật giá trị cảm biến Hall
static void Speed_PID(double
set_speed) Tính toán giá trị output của bộ điều khiển PID
Tên hàm Chức năng
void
HAL_GPIO_EXTI_Callback(uint16 _t GPIO_Pin)
Hàm ngắt ngoài cho các chân cảm biến Hall
void HAL_TIM_PeriodElapsedCallback( TIM_HandleTypeDef *htim) Hàm ngắt tràn các bộ định thời void HAL_TIM_OC_DelayElapsedCallb ack(TIM_HandleTypeDef *htim)
Hàm ngắt khi giá trị bộ đếm trùng khớp với một giá trị định sẵn
Bảng 5.3. Các chương trình ngắt
5.3.2. Lưu đồ thuật toán
Hình 5.3.static void Peripheral_Initiate()
Hình 5.5.static double getSpeed()
Hình 5.6.static void Read_ADC_Value()
Hình 5.11.static void dirCheck(uint16_t GPIO)
Hình 5.13.static void Speed_PID(doubleset_speed)
Hình 5.15.void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
CHƯƠNG 6: KẾT QUẢ VÀ PHƯƠNG HƯỚNG PHÁT TRIỂN TRONG TƯƠNG LAI
6.1. Đánh giá hoạt động của chương trình điều khiển
Trước khi kết nối các phần cứng và chạy thử động cơ, cần phải giả lập tín hiệu cảm biến Hall và kiểm tra các chức năng cùng tín hiệu PWM từ vi điều khiển để đảm bảo chương trình có thể hoạt động đúng như dự định khi lập trình. Dưới đây là các kiểm tra cần thiết trước khi kết nối với động cơ được thực hiện trên vi điều khiển.
Tín hiệu PWM được quan sát bằng một thiết bị Logic Analyzer, so sánh với cấu hình PWM đã được xây dựng từ trước, có thể thấy chương trình đã hoạt động đúng chức năng. Các MOSFET trên cùng một bán cầu không bao giờ ở trạng thái dẫn cùng một lúc, các thứ tự chuyển bước và MOSFET được kích hoạt tương ứng đúng với thứ tự được viết trong chương trình.
Các tín hiệu được gửi từ UART cũng được đưa lên thành công, định dạng và giá trị các tín hiệu đều đúng ở trong phạm vi cho phép.
Hình 6.2. Tín hiệu nhận được từ cổng Serial COM Port
Sau khi đảm bảo các chức năng của chương trình đều hoạt động đúng, tiến hành thiết lập kết nối hệ thống dựa trên sơ đồ nối dây và các chân kết nối tương ứng. Cụm dây từ động cơ sẽ được nối trực tiếp vào mạch điều khiển đông cơ BLDC 500W, sử dụng một bộ nguồn 24V để cấp nguồn cho toàn hệ thống và kết nối vi điều khiển vào máy tính để theo dõi các thông số hoạt động của động cơ.
Sau khi đã thiết lập hoàn chỉnh, chạy thử chương trình dưới các điều kiện: chạy tự do không tải và thay đổi giá trị biến trở để kiểm tra khả năng đáp ứng. Sau một số lần
chạy thử, kết quả cho ra các đồ thị dưới đây:
Hình 6.4. Đồ thị khả năng đáp ứng của bộ điều khiển tốc độ - chạy thử lần 1
Hình 6.6. Đồ thị khả năng đáp ứng của bộ điều khiển tốc độ - chạy thử lần 3
Quan sát đồ thị, có thể thấy được qua một số lần hiệu chỉnh, chương trình điều khiển đã làm tốt việc giữ tốc độ động cơ gần với tốc độ mong muốn điều khiển bởi người dùng. Ở lần chạy thử thứ nhất, thiết lập hệ số kP = 0.5 và kI = 0.02, bộ điều khiển không tăng tốc độ của động cơ đủ nhanh, đồng thời sai số ổn định vẫn tồn tại. Lần chạy thử thứ hai, thiết lập hệ số kP = 1 và kI = 0.7 sai số ổn định đã được loại bỏ, tuy nhiên thời gian để động cơ đạt đến tốc độ đầu vào vẫn còn khá lâu (khoảng 400 lần lấy mẫu). Ở lần chạy thử thứ 3, thiết lập hệ số kP = 1.5 và kI = 1.85, động cơ đã có thể đáp ứng gần như đồng thời giá trị setpoint, thời gian thiết lập đã giảm đáng kể (khoảng 140 lần lấy mẫu). Đồng thời, trên đồ thị cũng có thể thấy rõ sự dao động của tốc độ thực tế của động cơ. Đây là một nhược điểm của phương pháp điều khiển 6 bước (6 steps commutation) mà cách khắc phục là sử dụng một phương pháp điều khiển cao cấp hơn.
Hình 6.7. Đồ thị các thông số làm việc khác
Các thông số khác cũng có thể được quan sát trên đồ thị, nhiệt độ MOSFET được duy trì ổn định ở một giá trị hợp lý, trong khi có một số dao động nhỏ ở đồ thị điện áp khi động cơ tăng tốc độ, dòng điện đọc được cũng có một số thay đổi khi động cơ tăng hoặc giảm tốc độ.
6.2. Kết luận
Nhìn chung, quá trình thực hiện đồ án đã đạt được các mục tiêu đề ra cụ thể như sau: Tìm hiểu và nắm rõ các cấu tạo và nguyên lý hoạt động của động cơ không chổi than,
hiểu được nguyên nhân khiến cho loại động cơ này có độ bền và hiệu suất làm việc cao hơn động cơ sử dụng chổi than truyền thống.
Xây dựng được một mô hình mô phỏng hoạt động của động cơ không chổi than, hỗ trợ cho quá trình phát triển chương trình điều khiển.
Phát triển một chương trình điều khiển đơn giản nhưng có hiệu quả điều khiển cao Quan sát và theo dõi các thông số hoạt động của động cơ thông qua giao tiếp với máy
6.3. Các phương hướng nghiên cứu trong tương lai6.3.1. Về mặt phần cứng 6.3.1. Về mặt phần cứng
Các phần cứng được sử dụng trong đồ án đã có thể phục vụ hầu hết các nhu cầu sử dụng của động cơ không chổi than trên các phương tiện hiện nay. Mặc dù vậy, vẫn tồn tại nhiều yêu cầu để có thể đưa một thiết bị kết nối vào hệ thống điện của một chiếc xe hoàn chỉnh. Các yêu cầu này có thể phân làm 3 nhóm chính là kích thước, khả năng tương thích và kết nối.
Về kích thước, đối với các ứng dụng yêu cầu công suất lớn, động cơ và mạch điều khiển ít nhất cũng phải đạt được công suất cần thiết tối thiểu của hệ thống. Động cơ công suất càng lớn, kéo theo các linh kiện điện tử công suất được sử dụng để điều khiển cũng có sự gia tăng về kích thước. Thành ra phương hướng giải quyết yêu cầu này phần lớn phải dựa trên kỹ thuật và khả năng của các kỹ sư thiết kế mạch điều khiển. Các mạch điều khiển được thiết kế ra phải có kích thước hợp lý, đồng thời đạt khả năng hoạt động ổn định dưới công suất làm việc của động cơ
Về khả năng tương thích, các thiết bị điên tử trên xe hoạt động dưới nhiều điều kiện khác nhau, đặc biệt là khi hoạt động ở gần động cơ. Sự dao động cơ khí, nhiễu trên đường dây điện gây ra bởi từ trường hay các tín hiệu điện khác hoặc các yếu tố môi trường như nhiệt độ, bụi bẩn, dầu nhớt,… có thể ảnh hưởng đến khả năng hoạt động của mạch điều khiển và của cả động cơ. Vì vậy nên khi đưa một thiết bị mới kết nối vào hệ thống của một chiếc xe hoạt động trong thực tế, cần phải cân nhắc về các yếu tố có thể gây ảnh hưởng đến khả năng hoạt động của thiết bị này. Phải đảm bảo sự tương thích toàn bộ của thiết bị đối với các hệ thống khác trên xe, đưa ra các thay đổi về thiết kế hợp lý để đảm bảo khả năng hoạt động ổn định của thiết bị khi chiếc xe đang vận hành.
Về vấn đề kết nối, động cơ và bộ điều khiển phải đảm bảo kết nối với các hệ thống khác trên xe để có thể hoạt động đúng chức năng. Nhờ có mạng CAN, các hệ thống trên xe có thể chia sẻ thông tin và hoạt động đồng thời với nhau một cách hiệu quả nhất. Vậy nên khi thay thế các động cơ chổi than cũ bằng động cơ không chổi than cùng với mạch