Professional Documents
Culture Documents
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
ĐIỀU KHIỂN VÀ GIÁM SÁT TỐC ĐỘ ĐỘNG CƠ DC SỬ DỤNG MCU STM32 VỚI 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
4
Chương 1. Giới thiệu tổng quan về tiểu luận
1
Chương 1. Giới thiệu tổng quan về tiểu luận
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
3
Chương 2. Lập trình Firmware trên MCU STM32F407
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;
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
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;
/* 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
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);
//
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;
10
Chương 2. Lập trình Firmware trên MCU STM32F407
}
Thêm File usbd_bulk.c vào Project
11
Chương 2. Lập trình Firmware trên MCU STM32F407
12
Chương 2. Lập trình Firmware trên MCU STM32F407
13
Chương 3. Lập trình GUI trên C#
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)
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(',');
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
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