You are on page 1of 23

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.

HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỀU KHIỂN TỰ ĐỘNG

TIỂU LUẬN
ĐIỀU KHIỂN VÀ GIÁM SÁT TỐC ĐỘ ĐỘNG CƠ DC SỬ
DỤNG MCU STM32 VỚI C#

MÔN HỌC
EE3017 - ĐO LƯỜNG VÀ ĐIỀU KHIỂN BẰNG MÁY TÍNH

NHÓM SINH VIÊN:


NGÔ ĐĂNG HIỀN – 1670782
NGUYỄN THẾ NGỌC - 1770548

NGÀNH KỸ THUẬT ĐIỀU KHIỂN & TỰ ĐỘNG HÓA

GIẢNG VIÊN HƯỚNG DẪN


TS. NGUYỄN TRỌNG TÀI

TP. HỒ CHÍ MINH, 2019


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP. HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

KHOA ĐIỆN – ĐIỆN TỬ Độc lập - Tự do - Hạnh phúc

BỘ MÔN: ĐIỀU KHIỂN TỰ ĐỘNG

TP. HCM, ngày tháng 09 năm 2019

NHẬN XÉT ĐÁNH GIÁ TIỂU LUẬN


Tên tiểu luận:

ĐIỀU KHIỂN VÀ GIÁM SÁT TỐC ĐỘ ĐỘNG CƠ DC SỬ DỤNG MCU STM32 VỚI C#

Nhóm Sinh viên thực hiện: Cán bộ hướng dẫn:

NGÔ ĐĂNG HIỀN 1670782 TS. NGUYỄN TRỌNG TÀI

NGUYỄN THẾ NGỌC 1770548

Đánh giá tiểu luận:

Về nội dung tiểu luận:

Về tính ứng dụng:

Về thái độ làm việc của sinh viên:

Cho điểm từng sinh viên:

Ngô Đăng Hiền:

Nguyễn Thế Ngọc


MỤC LỤC

Contents
MỤC LỤC .......................................................................................................................................................................... 3
DANH MỤC HÌNH VẼ .................................................................................................................................................. 4
DANH MỤC BẢNG ........................................................................................................................................................ 4
DANH MỤC TỪ VIẾT TẮT ......................................................................................................................................... 4
Chương 1. GIỚI TIỆU TỔNG QUAN VỀ TIỂU LUẬN ........................................................................................ 1
1.1. Giới thiệu về phần cứng ......................................................................................................................... 1
1.2. Giới thiệu về phần mềm lập trình cho MCU STM32 và PC....................................................... 3
Chương 2. LẬP TRÌNH FIRMWARE TRÊN MCU STM32F407 .................................................................... 4
2.1. Lập trình thuật toán PID điều khiển động cơ..................................................................................... 4
2.1.1. Bộ PWM...................................................................................................................................................... 4
2.1.2. Đọc tốc độ qua bộ Encoder ................................................................................................................ 5
2.1.3. Giải thuật PID rời rạc ............................................................................................................................ 7
2.2. Lập trình giao tiếp với máy tính .............................................................................................................. 8
2.2.1. Giao tiếp nối tiếp RS232 ...................................................................................................................... 8
2.2.2. Giao tiếp qua chuẩn USB 2.0 .............................................................................................................. 9
2.2.3. giao tiếp qua chuẩn TCP/IP ............................................................................................................ 11
Chương 3. LẬP TRÌNH GUI TRÊN C# ................................................................................................................ 14
3.1. Giao diện phần mềm thiết kế ............................................................................................................ 14
3.2. Khung truyền quy định giữa MCU và PC ............................................................................................ 14
3.3. Các giao thức truyền đã triển khai trên C# ........................................................................................ 15
Chương 4. KẾ HOẠCH VÀ KẾT QUẢ THỰC HIỆN ......................................................................................... 18
4.1. Kế hoạch thực hiện ............................................................................................................................... 18
TÀI LIỆU THAM KHẢO............................................................................................................................................ 19
Môn: Đo lường và điều khiển bằng máy Chương 1. Giới thiệu tổng quan về tiểu
tính luận

DANH MỤC HÌNH VẼ

DANH MỤC BẢNG


Table 1.1 Tổng quan về Hệ thống.......................................................................................................................... 1
Table 1. 2 Các phần mềm lập trình cho MCU STM32F4 ............................................................................... 3
Table 1. 3 Phần mềm lập trình GUI trên PC ...................................................................................................... 3

Table 3. 1 Software và Library sử dụng trong Project............................................................................... 14


Table 3. 2 Các Function truyền và nhận trên C# .......................................................................................... 14
Table 3. 3 Ý nghĩa của các vị trí trong mảng được truyền đi -txbuff[] ................................................ 15
Table 3. 4 Phần code xử lý data nhận được ................................................................................................... 15
Table 3. 5 Các công việc của Timer 2 – 5ms ................................................................................................... 15
Table 3. 6 Source code RS232, USB, TCP/IP .................................................................................................. 15

DANH MỤC TỪ VIẾT TẮT

4
Chương 1. Giới thiệu tổng quan về tiểu luận

Chương 1. GIỚI TIỆU TỔNG QUAN VỀ TIỂU LUẬN

1.1. Giới thiệu về phần cứng


STT Name Note
1 STM32F4-DIS1 STM32F407VGT6 Proe.vn
2 H-Bridge HI216 Nhatbon.vn
3 MINERTIA MOTOR MINERTIA MOTOR, F SERIES YASKAWA
27.0V 50W UGFMED-03SRI21
Encoder: 400 pulse AX070025A
Speed Max: 2500 rpm

STT Encoder Lead Note


1 RED +5V
INPUT BACK 0V
2 WHITE CHANEL A
OUTPUT GREEN CHANEL B

Table 1.1 Tổng quan về Hệ thống

Sơ đồ bố trí các thiết bị

1
Chương 1. Giới thiệu tổng quan về tiểu luận

Mạch cầu H sử dụng

Phương pháp kích tín hiệu PWM và điều hướng

Mô hình thực tế sử dụng

2
Chương 1. Giới thiệu tổng quan về tiểu luận

1.2. Giới thiệu về phần mềm lập trình cho MCU STM32 và PC

Table 1. 2 Các phần mềm lập trình cho MCU STM32F4


STT IDE + Compiler Note
STM32CubeMX Version 5.3.0
1
Package for STM32F4 Verion 1.24.0
MDK-ARM Professional Version 5.27.1.0
2
Package STM32F4xx_DFP Version 2.14.0

Note: Toàn bộ source code lưu trong Folder: DCMotorController; với


STM32CubeMX.ioc project của STM32CubeMX và STM32CubeMX.uvprojx là
của MDK-ARM
Table 1. 3 Phần mềm lập trình GUI trên PC
STT IDE + Compiler Note
Microsoft Visual Studio Enterprise Version 2015
1
Visual C# Version 2015

Note: Toàn bộ source code lưu trong Folder WindowsFormsApplication1 với


project là: WindowsFormsApplication1.sln

3
Chương 2. Lập trình Firmware trên MCU STM32F407

Chương 2. LẬP TRÌNH FIRMWARE TRÊN MCU STM32F407

2.1. Lập trình thuật toán PID điều khiển động cơ


2.1.1. Bộ PWM
Cấu hình PWM sử dụng Timer 12 ở tần số băm là 20Khz
Sử dụng Internal clock (84Mhz), các thông số đặt như hình bên dưới, chân
ngõ ra PB14 (TIM12_CH1)

Timer Clock = 84Mhz


Prescaler (CNT): 4
Period (ARR): 839
Repetition: 0
➔ UE = 20 KHz
NOTE: Việc cấu hình PWM đã được CubeMX làm sẵn, User chỉ việc tạo hàm Set Duty
như bên dưới.
/* Output pwm frequency - unit: 0.1% */
void PWM0_Set_Duty(int16_t d)
{
if (d < -1000)
d = -1000;
else if (d > 1000)
d = 1000;

4
Chương 2. Lập trình Firmware trên MCU STM32F407

if (d == 0)
{
//GPIO_SetBits(GPIOD,GPIO_Pin_10); // disable pwm
}
else if (d > 0)
{
//
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_RESET); // dir = 1
}
else
{
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET); // dir = 0
d = -d;
}
d = (TIM12->ARR + 1) * d / 1000;
TIM12->CCR1 = (uint32_t)d;

2.1.2. Đọc tốc độ qua bộ Encoder


Encoder chọn như hình bên dưới, với ARR = 65535 (0xFFFF), Encoder Mode
= TI1 and TI2 (chế độ x4)

5
Chương 2. Lập trình Firmware trên MCU STM32F407

//Note: Function để đọc (lấy mẫu): số xung đếm được trên 1 thời gian (sampe)
/* Get encoder counter 32 bit */
int32_t ENC0_GetSpeed(void)
{
static int32_t p = 0, p_pre = 0, dp = 0;
p = (int32_t)TIM1->CNT;
dp = p - p_pre; //+/- (speed)
if (dp > 32768)
dp -= 65536;
else if (dp < -32768)
dp += 65536;
p_pre = p;

return dp;
}
//Tốc độ (RPM) được tính như sau:
Speed = ENC0_GetSpeed()*60000.0/Ts/1600;
Trong đó:
+ ENC0_GetSpeed(): Số xung Encoder đọc được trong 1 khoản thời gian Ts (ms)
+ Ts: Thời gian lấy mẫu (ms)
+ 1600: Độ phân giải của Encoder (x4): 400x4 = 1600

6
Chương 2. Lập trình Firmware trên MCU STM32F407

2.1.3. Giải thuật PID rời rạc

void PID_step(void)
{
speed = (double)ENC0_GetSpeed() * 37.5/cPID.Ts;
Speed = ENC0_GetSpeed()*60000.0/Ts/1600;

e = setpoint - speed;
pPart = Kp * e;

iPart += 0.5 * Ts * Ki * e;
dPart = Kd / Ts * e - predPart;
predPart = Kd / Ts * e;

udk = pPart + iPart + dPart;

/* Saturate */
if (udk > 1000.0)
pwm = 1000.0;
else if (udk < 0.0)
pwm = 0.0;
else pwm = udk;

PWM0_Set_Duty((int)pwm);
}

7
Chương 2. Lập trình Firmware trên MCU STM32F407

2.2. Lập trình giao tiếp với máy tính


2.2.1. Giao tiếp nối tiếp RS232

char txRs232Buffer[64] = { 0 }; //tx


__IO uint8_t rxUsbBuffer[64] = {0}; //rx
/* Initialize all configured peripherals */

8
Chương 2. Lập trình Firmware trên MCU STM32F407

MX_UART4_Init();
//
HAL_UART_Receive_DMA(&huart4, (uint8_t*)rxUsbBuffer, RXBUFFERSIZE);
//
len =
sprintf((char*)txUsbBuffer,"%ld,%ld,%ld\r\n",(long)setpoint,(long)speed,(long)pwm
);
txRs232Buffer[0] = 'A';
txRs232Buffer[1] = (char)',';
for(int i = 0; i<=len;i++)
{
txRs232Buffer[i + 2] = txUsbBuffer[i];
}
HAL_UART_Transmit_DMA(&huart4,(uint8_t*)txRs232Buffer,len+2);
//

2.2.2. Giao tiếp qua chuẩn USB 2.0

9
Chương 2. Lập trình Firmware trên MCU STM32F407

main.c
/* USER CODE BEGIN PV */
__IO uint8_t rxUsbBuffer[64] = {0}; //rx
char txUsbBuffer[64] = { 0 }; //tx
/* Initialize all configured peripherals */
MX_USB_DEVICE_Init();
usb_device.c
/* USER CODE BEGIN Includes */
#include "usbd_bulk.h"
/* USER CODE END Includes */
void MX_USB_DEVICE_Init(void)
{
//if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK)
if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_BULK) != USBD_OK)
{
Error_Handler();
}
// if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) !=
USBD_OK)
// {
// Error_Handler();
// }
}
usbd_bulk.c Phần truyền nhận dữ liệu từ USB
static uint8_t USBD_BULK_DataOut(USBD_HandleTypeDef* pdev, uint8_t epnum)
{
// Ham nhan giu Lieu .../
USBD_LL_PrepareReceive(pdev, BULK_EPOUT_ADDR, rxUsbBuffer, 64);
cComStatus.ready = 1;

// Nhan dc thi gui luon.


USBD_BULK_SendData(pdev, (uint8_t*)txUsbBuffer, 64);
//
return USBD_OK;

10
Chương 2. Lập trình Firmware trên MCU STM32F407

}
Thêm File usbd_bulk.c vào Project

2.2.3. giao tiếp qua chuẩn TCP/IP


Chọn RMII; Chọn Ext PHY: DP83848
Để mọi thứ mặc định (Rx Mode: Polling Mode; TX IP …. By Hardware)

Chọn địa chỉ IP Address, còn lại để mặc định

11
Chương 2. Lập trình Firmware trên MCU STM32F407

Thêm File tcp_echoserver.c vào Project

Trong File: main.c


/* Initialize all configured peripherals */
MX_LWIP_Init();
/* USER CODE BEGIN 2 */
tcp_echoserver_init();
/* USER CODE END 2 */
Trong File: tcp_echoserver.c
// Day se lam ham gui, nhan du lieu./
extern char txUsbBuffer[64];
extern uint8_t rxUsbBuffer[64];
extern Status cComStatus;
static void tcp_echoserver_send(struct tcp_pcb * tpcb, struct
tcp_echoserver_struct * es)
{
struct pbuf * ptr;
err_t wr_err = ERR_OK;

while ((wr_err == ERR_OK) &&


(es->p != NULL) &&

12
Chương 2. Lập trình Firmware trên MCU STM32F407

(es->p->len <= tcp_sndbuf(tpcb)))


{

/* get pointer on pbuf from es structure */


ptr = es->p;
//add
for (int i = 0; i<ptr->len; i++)
rxUsbBuffer[i] = *((uint8_t*)(ptr- >payload)+i);
/* enqueue data for transmission */
wr_err = tcp_write(tpcb, txUsbBuffer, 64, 1);

}
}

13
Chương 3. Lập trình GUI trên C#

Chương 3. LẬP TRÌNH GUI TRÊN C#

3.1. Giao diện phần mềm thiết kế

Hình 3. 1 Giao diện phần mềm thiết kế


Trong đó:

Table 3. 1 Software và Library sử dụng trong Project


STT Name Version
1 Visual Studio C# WindowsFormsApplication1.sln 2015
2 LibUsbDotNet Library LibUsbDotNet.dll 2.2.8.104
3 ZedGraph Library ZedGraph.dll 5.1.7.430
4 Measurement Studio Shared NationalInstruments.UI 19.0.45.491
.NET 54

3.2. Khung truyền quy định giữa MCU và PC


Table 3. 2 Các Function truyền và nhận trên C#
Truyền (PC to MCU) – Timer2 (5ms) Nhận (MCU to PC)
byte[] txbuff = new byte[64]; byte[] readBuffer = new byte[64];
RS232 serialPort1.Write(txbuff, 0, 36); serialPort1.ReadLine();
writer.Write(txbuff, 1000, out reader.Read(readBuffer, 1000, out
USB
bytesWritten); bytesRead);
TCP/IP stream.Write(txbuff, 0, 36); stream.Read(readBuffer, 0, 64);

14
Chương 3. Lập trình GUI trên C#

Table 3. 3 Ý nghĩa của các vị trí trong mảng được truyền đi -txbuff[]
STT [Buffer] Ý nghĩa Note
1 txbuff[0] Start/Stop 1 = start
2 txbuff[1] Com = comuncation: 0:rs232, 1:usb, 2: LAN
3 txbuff[2] Ts Sample time (ms)
4 txbuff[3-10] Double (Kp) Hệ số Kp (PID)
5 txbuff[11-18] Double (Ki) Hệ số Ki (PID)
6 txbuff[19-26] Double (Kd) Hệ số Kd (PID)
7 txbuff[27-28] Amplitude (rpm) Ampilute
8 txbuff[29] Period (secs) Period
9 txbuff[30] Pulse Width (% of period) Pulse
10 txbuff[31-32] Stop time (sec) TimeStop
11 txbuff[33] Manual/Pulse M/Auto
12 txbuff[34-35] slide1 Silde (0->2400)

Table 3. 4 Phần code xử lý data nhận được


STT readBuffer Ý nghĩa
1 string data = Encoding.Default.GetString(readBuffer); Convert String
2 string[] subdata = data.Split(','); Split
3 if (subdata.Length < 3) return;
string realSpeed, setpoint, udk;
setpoint = subdata[0];
4 Copy data
realSpeed = subdata[1];
udk = subdata[2];
5 Draw(setpoint, realSpeed, udk); Vẽ đồ thị
Note: Phần nhận (from MCU) trên PC tuân theo mảng Byte được gửi lên từ MCU

Table 3. 5 Các công việc của Timer 2 – 5ms


STT Các công việc của Timer2 (5ms) Note
1 Tính toán khối Performance and Robustness POT,Peak…
2 Liên tục gửi và nhận dữ liệu từ USB USB selected
3 Liên tục gửi và nhận dữ liệu từ TCP/IP TCP/IP selected
4 Liên tục nhận dữ liệu từ MCU gửi lên qua RS232 RS232 selected
5 Vẽ đồ thị đáp ứng của Setpoint, realSpeed, Udk Draw()

3.3. Các giao thức truyền đã triển khai trên C#


Table 3. 6 Source code RS232, USB, TCP/IP
STT RS232 Note
1 serialPort1 Using
System.IO.Ports
string[] port = SerialPort.GetPortNames(); Form1_Load()

15
Chương 3. Lập trình GUI trên C#

cbComPort.Items.AddRange(port);
serialPort1.PortName = cbComPort.Text; btConnect_Click()
serialPort1.BaudRate = Int32.Parse(cbBaudRate.Text);
serialPort1.Open(); ckConnect = true;
serialPort1.Write(txbuff, 0, 36);
if (serialPort1.IsOpen) timer2_Tick()
{
if (serialPort1.BytesToRead > 8)
{
string data = serialPort1.ReadLine();
serialPort1.DiscardInBuffer();
string[] subdata = data.Split(',');

if (subdata.Length < 4) return;


if (subdata[0] == "A")
{
string realSpeed, setpoint, udk;
setpoint = subdata[1];
realSpeed = subdata[2];
udk = subdata[3];
Draw(setpoint, realSpeed, udk);
}
}
}
2 USB Note
public static UsbDevice myUsbDevice; Global
UsbEndpointReader reader;
UsbEndpointWriter writer;
if (myUsbDevice == null) btConnect_Click()
{
UsbRegDeviceList allDevices = UsbDevice.AllDevices;
foreach (UsbRegistry usbRegistry in allDevices)
{
if (usbRegistry.Open(out myUsbDevice))
{
txtproductname.Text =
myUsbDevice.Info.ProductString;
txtvendorid.Text =
myUsbDevice.Info.Descriptor.VendorID.ToString();
txtproductid.Text =
myUsbDevice.Info.Descriptor.ProductID.ToString();
}
}
}
//USB - Connect
UsbDevice wholeUsbDevice = myUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
// Select config #1
wholeUsbDevice.SetConfiguration(1);
// Claim interface #0.
wholeUsbDevice.ClaimInterface(0);
}
//Open usb end point reader and writer
reader =
myUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01); //
open read endpoint 1.

16
Chương 3. Lập trình GUI trên C#

writer =
myUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);//
open write endpoint 1.
//Send timer2_Tick()
try
{
int bytesWritten;
writer.Write(txbuff, 1000, out bytesWritten);
}
catch (Exception err)
{
MessageBox.Show("Can Not Send Data To USB
Device\nDetails: " + err, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//Receive
try
{
int bytesRead = 0;
byte[] readBuffer = new byte[64];
reader.Read(readBuffer, 1000, out bytesRead);
string data = Encoding.Default.GetString(readBuffer);
string[] subdata = data.Split(',');
if (subdata.Length < 3) return;
string realSpeed, setpoint, udk;
setpoint = subdata[0];
realSpeed = subdata[1];
udk = subdata[2];
Draw(setpoint, realSpeed, udk);
}
catch (Exception err)
{
MessageBox.Show("Can Not Receive Data From USB
Device\nDetails: " + err, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
3 TCP/IP Note
TcpClient client = null; Global
Stream stream = null;
client = new TcpClient(); btConnect_Click()
client.Connect("192.168.0.10", 7);
stream = client.GetStream();
// 2. send timer2_Tick()
stream.Write(txbuff, 0, 36);
// 3. receive
byte[] readBuffer = new byte[64];
stream.Read(readBuffer, 0, 64);
//process
string data = Encoding.Default.GetString(readBuffer);
string[] subdata = data.Split(',');
if (subdata.Length < 3) return;
string realSpeed, setpoint, udk;
setpoint = subdata[0];
realSpeed = subdata[1];
udk = subdata[2];
Draw(setpoint, realSpeed, udk);

17
Chương 4. Kế hoạch và kết quả thực hiện

Chương 4. KẾ HOẠCH VÀ KẾT QUẢ THỰC HIỆN

4.1. Kế hoạch thực hiện


Địa điểm thực hiện: Phòng trọ 708 Học viện Quân y, 84 Thành Thái, Q10, Tp. Hồ Chí
Minh

STT Công việc Phân công


1 Mua các thiết bị cho thí nghiệm (khu vực Chợ Nhật Hiền + Ngọc
Tảo)
2 Ghép các thiết bị thành mô hình Hiền
3 Lập trình Firmware cho MCU STM32 Hiền
4 Lập trình GUI trên C# Ngọc
5 Viết báo cáo tiểu luận Hiền + Ngọc

18
TÀI LIỆU THAM KHẢO
[1] Nguyễn Thị Phương Hà, Lý thuyết điều khiển tự động, Nhà xuất bản
ĐHQG HCM, 2005
[2] Bộ môn TĐH, Bài thí nghiệm 03 – Điều khiển vị trí động cơ DC dùng bộ
tự chỉnh STR – Khoa ĐĐT, HCMUT
[3] Bộ môn TĐH, Bài thí nghiệm nhận dạng hệ thống, Khoa ĐĐT, HCMUT
[4] Carmine Noviello, Mastering STM32 (Leanpub book – PDF), 2016
[5] UM1718, STM32CubeMX for STM32 configuration and initialization C
code generation, STMicroelectronics, 2019

19

You might also like