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

bài giảng thí nghiệm đo lường và điều khiển bằng máy tính2

39 14 1

Đ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 đề Lập trình Card USB Giao Tiếp Với Máy Tính
Tác giả Nhóm tác giả
Người hướng dẫn TS. Nguyễn Trọng Tài
Trường học Đại học Bách Khoa Thành phố Hồ Chí Minh
Chuyên ngành Điện Tử, Điều Khiển, Máy Tính
Thể loại Bài thí nghiệm
Năm xuất bản 2018
Thành phố TP.HCM
Định dạng
Số trang 39
Dung lượng 1,71 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Hình 3: Cửa sổ chọn dòng vi điều khiển - Chọn các pack CMSIS->CORE và Device->Startup, Variant của Device chọn là Standalone như hình dưới: Hình 4: Cửa sổ chọn các package trong K

Trang 1

THÍ NGHIỆM ĐO LƯỜNG VÀ ĐIỀU

Trang 2

BTN #4: BÀI THÍ NGHIỆM LẬP TRÌNH CARD USB

GIAO TIẾP VỚI MÁY TÍNH

A MỤC ĐÍCH THÍ NGHIỆM

• Biết cách lập trình vi điều khiển sử dụng phần mềm Keil-C

• Biết cách lập trình chương trình C# bằng phần mềm Visual Studio

• Lập trình giao tiếp giữa vi điều khiển và C# qua chuẩn USB

B CHUẨN BỊ THÍ NGHIỆM

• Sinh viên đọc kỹ các yêu cầu của mỗi bài thí nghiệm, xem sơ đồ mạch trước khi lên lớp

C GIỚI THIỆU MÔ HÌNH THÍ NGHIỆM

Kit thí nghiệm cho được bố trí như Hình 1

Hình 1: Sơ đồ bố trí của kit thí nghiệm Kít thí nghiệm được chia thành 12 khu vực:

- Khu vực 1 – CPU: là khu vực bố trí card USB

- Khu vực 2 – HMI/METER: là khu vực bố trí màn hình HMI và các thiết bị hiển thị

- Khu vực 3 – AI: là khu vực bố trí tín hiệu Analog, gồm các ngõ vào Analog AI1 và AI2; Điện áp thay đổi được VR1, và VR2

Trang 3

- Khu vực 4 – ENCODER: là khu vực bố trí tín hiệu ngõ vào xung tốc độ cao

- Khu vực 5 – DI: là khu vực bố trí các nút nhấn và công tắc điều khiển

- Khu vực 6 – DO: là khu vực bố trí các LED hiển thị ngõ ra số

- Khu vực 7 – AO: là khu vực bố trí các ngõ ra điều khiển ANALOG

- Khu vực 8 – PWM-PTO: là khu vực bố trí các ngõ ra xung tốc độ cao PWM và PTO cho phép điều khiển động cơ tốc độ, vị trí động cơ DC, SERVO, Bước

- Khu vực 9 - SENSOR: là khu vực bố trí lắp đặt cảm biến

- Khu vực 10: là khu vực bố trí các thiết bị cho phép kết nối mạng PLC

- Khu vực 11: là khu vực nguồn áp cung cấp 24VDC và 5VDC

- Khu vực 12: là khu vực ứng dụng điều khiển và hiển thị đèn giao thông

D THÍ NGHIỆM

I Bài thí nghiệm 1: Lập trình vi điều khiển sử dụng Keil-C

❖ Tạo project với Keil-C:

- Chọn Project -> New µVision Project

- Chọn vị trí lưu project và đặt tên project trong cửa sổ hiện ra

Hình 2: Cửa sổ tạo project mới trong Keil-C

- Chọn dòng vi điều khiển STMicroelectronics -> STM32F3 Series ->

Trang 4

Hình 3: Cửa sổ chọn dòng vi điều khiển

- Chọn các pack CMSIS->CORE và Device->Startup, Variant của Device chọn là Standalone như hình dưới:

Hình 4: Cửa sổ chọn các package trong Keil-C

Trang 5

❖ Add file thư viện vào project:

- Trong folder DLDKMT_USB ở Desktop, chép folder Src, Inc, Middlewares và Drivers vào folder chứa project

- Sau khi hoàn thành các bước trên, folder chứa project bao gồm các folder như hình dưới đây:

Hình 5: Folder chứa project

Hình 6: Các file trong folder Src

Trang 6

Hình 7: Các file trong folder Inc

- Click vào biểu tượng trên thanh công cụ, một cửa sổ hiện ra

Hình 8: Cửa sổ quản lí các file trong project

- Tạo group mới bằng cách click vào biểu tượng :

- Tạo group Application/User, nhấn nút Add Files và add các file c trong folder Src

- Tạo group Middlewares/USB_Device_Library và add các file c trong folder Middlewares\ST\STM32_USB_Device_Library\Class\CustomHID\Src và Middlewares\ST\STM32_USB_Device_Library\Core\Src

- Tạo group Driver/Src và add các file sau từ folder

Drivers\STM32F3xx_HAL_Driver\Src:

stm32f3xx_hal.c

stm32f3xx_hal_adc.c

Trang 8

Hình 9: Các file trong group Application/User

Hình 10: Các file trong group Middlewares/USB_Device_Library

Trang 9

Hình 11: Các file trong group Driver/Src

❖ Add đường dẫn tới file header và các define:

- Nhấn vào biểu tượng trên thanh công cụ, một cửa sổ như hình dưới hiện ra

Trang 10

- Chọn tab C/C++, ta có cửa sổ như sau:

- Copy dòng dưới vào mục Define

USE_HAL_DRIVER,STM32F373xC

- Tiếp tục copy dòng dưới vào mục Include path

./Inc;./Drivers/STM32F3xx_HAL_Driver/Inc;./Drivers/STM32F3xx_HAL_Driver/Inc/Legacy;./Middlewares/ST/STM32_USB_Device_Library/Core/Inc;./Middlewares/ST/STM32_USB_Device_Library/Class/CustomHID/Inc;./Drivers/CMSIS/Device/ST/STM32F3xx/Include;./Drivers/CMSIS/Include

- Cuối cùng ta có cửa sổ như sau:

Trang 11

- Chọn mục Debug, chọn ST-Link Debugger như hình vẽ

Trang 12

- Sau đó chọn Settings, một cửa sổ hiện ra, chọn tab Flash Download và nhấn Add

- Trong cửa sổ hiện ra, chọn mục STM32F3xx Flash như hình vẽ dưới đây và bấm Add và OK

Trang 13

- Trong cửa sổ Options for Target, chọn tab Utilities, click chọn Use Target Driver for Flash Programming

- Nhấn OK

❖ Viết chương trình trên vi điều khiển:

- Mở file main.c và sửa lại chương trình như hướng dẫn bên dưới

- Đầu tiên, include các thư viện như dưới đây:

Trang 14

static uint8_t DI_value;

static float AO_value[2];

static int AI_value[3];

static uint32_t C0_value;

static uint32_t DO_pwm_frequency[3];

static uint16_t Ts_ms =100;//ms

static uint8_t usb_rx_buffer[64];

static uint8_t usb_tx_buffer[17];

static volatile uint8_t usb_tx_flag = 0;

static volatile uint8_t usb_rx_flag = 0;

- Khai báo prototype của các hàm trong chương trình như sau:

void USB_RX_Interrupt(void);

void Sample_Timer_Interrupt(void);

- Viết hàm main như bên dưới Trong hàm main này, đầu tiên ta sẽ khởi tạo các ngoại vi, cấu hình xung clock, sau đó, chương trình sẽ vào hàm while(1) Trong hàm này, ta sẽ liên tục kiểm tra cờ usb_tx_flag và usb_rx_flag để thực hiện việc điều khiển các ngoại vi:

Trang 18

- Viết hàm _Error_Handler và hàm assert_failed như bên dưới:

void _Error_Handler(char *file, int line)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

Trang 19

{

/* USER CODE BEGIN 6 */

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

/* USER CODE END 6 */

}

#endif

❖ Biên dịch chương trình và nạp chương trình

- Nhấn Ctrl + S để save chương trình, click vào biểu tượng trên thanh công cụ hoặc nhấn F7 để biên dịch chương trình Nếu biên dịch thành công, cửa sổ Build Output sẽ hiện thông báo tương tự hình bên dưới

- Nhấn F8 hoặc nhấn vào biểu tượng để nạp chương trình xuống vi điều khiển

II Bài thí nghiệm 2: Tạo window form app C#

❖ Tạo project mới:

Trang 20

❖ Add Reference (Thư viện) cho Windown Form:

Trang 21

- Chọn Browse sau đó kiếm theo đường link

C:\Program Files\LibUsbDotNet\LibUsbdotnet.dll

Như vậy là thư viện LibUsbDotNet đã được Add

❖ Tạo giao diện GUI

Trang 22

Tạo groupbox Connection

- Trong cửa sổ Toolbox bên tay trái, chọn tab Common Controls và kéo thả các Button, Label, Textbox để tạo thành giao diện như hình sau

- Đặt thuộc tính Name của các textbox lần lượt là: txtProductName, txtVendorId, txtProductId, txtManufacturer

- Đặt thuộc tính Name của Button Connect là btnConnect

- Khai báo thư viện

- Khai báo biến toàn cục cho kết nối USB

Trang 23

Chương trình con cần thiết để thiết lập kết nối và gửi nhận dữ liệu:

reader.DataReceived += (OnRxEndPointData);

}

#endregion USB_DATA_RECEIVER_INIT

Trang 24

Chương trình cho nút nhấn Connect

#region USB DATA RECEIVER INTERRUPT SERVICE ROUTINE

#endregion USB DATA RECEIVER INTERRUPT SERVICE ROUTINE

#region USB EXIT

Trang 25

Form Closed

- Chọn vào sự kiện để viết đoạn chương trình đóng ứng dụng

{

{

txtProductName.Text = myUsbDevice.Info.ProductString; txtVendorId.Text =

MessageBoxButtons OK, MessageBoxIcon Error);

Trang 26

private void Form1_FormClosing( object sender, FormClosingEventArgs e)

{

MessageBoxButtons YesNo, MessageBoxIcon Question) == DialogResult Yes)

Trang 27

Cấu trúc chương trình hoàn chỉnh

Kết quả kết nối

Trang 28

Gửi nhận dữ liệu

- Frame truyền nhận dữ liệu bao gồm một byte đầu tiên là chiều dài frame (không kể byte độ dài), byte thứ hai là mã lệnh dạng kí tự ASCII, các byte tiếp theo là dữ liệu

- Từ thanh Toolbox, thêm vào các Button, Textbox, ComboBox, Checkbox, OvalShape, Label để tạo thành giao diện sau

- Kéo một đối tượng Timer từ thanh Toolbox vào giao diện, đặt thuộc tính Name của Timer là TimerSend

- Thay đổi thuộc tính Name của các đối tượng như sau:

• Checkbox ứng với Q0.0-Q0.7: chbDO0 - chbDO7

• Checkbox ứng với label PWM để chọn chế độ PWM hay GPIO: chbPWM0, chbPWM1, chbPWM3, chbPWM6, chbPWM7

• Textbox ứng với label Duty để cài đặt chu kì nhiệm vụ trong chế độ PWM, giá trị nhập vào từ 0-100%: txtPWM0, txtPWM1, txtPWM3, txtPWM6, txtPWM7

Trang 29

• Textbox ứng với label Frequency, giá trị nhập vào từ 1-255 KHz: txtF0, txtF1, txtF2

• Button Config Frequency: btnConfigFreq

• OvalShape để hiện thị DI0-DI7: ovalDI0- ovalDI7

• Textbox hiển thị AI0-AI2: txtAI0, txtAI1, txtAI2

• ComboBox để cài đặt gain của module ADC: cbGain Click vào thuộc tính Items trong cửa sổ Properties, một cửa sổ hiện lên, ta nhập các giá trị gain sau:

• Textbox ứng với Counter: txtCounter0

• Textbox ứng với label Sample Time để cài đặt thời gian lấy mẫu trên

cardUSB: txtTs

• Button ứng với label Sample Time: btnTs

• Textbox ứng với label AO 0: txtAO0

• Textbox ứng với label AO 1: txtAO1

- Khai báo các biến sử dụng để truyền nhận dữ liệu ở đầu chương trình

Trang 30

- Trong hàm UsbReceiverActionFunction, ta viết đoạn chương trình sau

Trang 31

- Để hiển thị giá trị DI nhận được, ta sẽ thay đổi màu sắc của OvalShape

Sinh viện tự viết đoạn chương trình tương tự để hiển thị DI1-DI7

- Hiển thị giá trị AIN và Counter:

- Sinh viên thay đổi giá trị trên các chân DI, AI, quay động cơ để thay đổi giá trị counter và kiểm tra lại chương trình trên máy tinh có cập nhật những giá trị này

- Chương trình gửi sẽ được đặt trong ngắt Timer, ta config Timer và giá trị ban đầu của các Textbox trong sự kiện Form1_Load

- Hàm gửi một mảng qua giao tiếp USB từ máy tính tới cardUSB

Trang 32

- Ta viết đoạn chương trình sau trong hàm ngắt timerSend_Tick để cập nhật giá trị

DO, AO:

• Cài đặt giá trị cho tín hiệu DO0

• Sinh viên tự viết chương trình cài đặt giá trị cho tín hiệu DO1-DO7

• Gửi frame tới USBcard

- Viết đoạn chương trình xử lí ngắt txtAO0_TextChanged

{

{

}

{

DOValue[2], DOValue[3], DOValue[4], DOValue[5],

DOValue[6], DOValue[7], AO0ByteValue[0], AO0ByteValue[1],

AO1ByteValue[0], AO1ByteValue[1], resetCounterCmd };

USBWrite(data_send);

resetCounterCmd = 0;

Trang 33

- Tương tự sinh viên viết đoạn chương trình xử lí ngắt txtAO1_TextChanged.

- Sinh viên bật tắt DO trên máy tinh và kiểm tra các đèn LED DO trên USBcard Nối chân AO1 với AI1, AO2 với AI2 trên panel và kiểm tra giá trị 𝑉𝐴𝐼𝑁 ≈𝑉𝑂𝑈𝑇

2

- Ta viết đoạn chương trình sau trong hàm ngắt chbPWM0_CheckedChanged

Tương tự sinh viên viết chương trình cho các sự kiện chbPWM1_CheckedChanged, chbPWM3_CheckedChanged, chbPWM6_CheckedChanged, chbPWM7_CheckedChanged

- Ta viết đoạn chương trình sau trong hàm ngắt txtPWM0_TextChanged

Trang 34

Tương tự sinh viên viết chương trình cho các sự kiện txtPWM1_TextChanged

txtPWM3_TextChanged, txtPWM6_TextChanged, txtPWM7_TextChanged

Sinh viên click vào checkbox PWM, thay đổi số trong textbox PWM và quan sát độ sáng đèn DO trên USBcard

- Ta viết đoạn chương trình sau trong hàm ngắt txtF0_TextChanged

Tương tự sinh viên viết chương trình cho các sự kiện txtF1_TextChanged,

txtF2_TextChanged

- Ta viết hàm ngắt cho sự kiện txtTs_TextChanged

- Ta viết chương trình xử lí sự kiện nhấn nút Config Frequency và Config Ts

{

MessageBoxButtons OK, MessageBoxIcon Warning);

MessageBoxButtons OK, MessageBoxIcon Warning);

Trang 35

Thay đổi thời gian lấy mẫu lần lượt là 1000 ms, 10 ms và quan sát tốc độ thay đổi giá trị trong textbox AIN

Quay động cơ về vị trí 0 và nhấn Reser Counter, kiểm tra giá trị counter bằng 0

- Ta viết chương trình xử lí sự kiện cbGain_SelectedIndexChanged

III Bài thí nghiệm 3: Điều khiển vị trí động cơ bằng bộ điều khiển PID

- Trong bài thí nghiệm này ta sử dụng cầu H BTS7960 để điều khiển động cơ

Trang 36

- Để điều khiển động cơ, trên panel ta nối chân DO0 với PULSE1, DO1 với PULSE2 trên mô hình động cơ

• PULSE2 = 1 và PULSE1 = 0 : Mô tơ quay thuận

• PULSE2 = 0 và PULSE1 = 1 : Mô tơ quay nghịch

• PULSE2 = 1 và PULSE1 = 1 hoặc PULSE2 = 0 và PULSE1 = 0 : Dừng

- Comment đoạn chương trình trong hàm ngắt TimerSend_Tick

- Cài đặt giá trị PWM0, 1 là 1 KHz, tần số lấy mẫu của USB card là 10ms

- Viết thêm đoạn chương trình PID gợi ý sau vào cuối hàm ngắt nhận

UsbReceiverActionFunction

- Sinh viên bổ sung chương trình tính giá trị PID vào đoạn chương trình trên

- Sinh viên tự tạo textbox để cài đặt giá trị setpoint PID và chạy thử chương trình

currentPos = counterValue;

// Write your code here to calculate pidOutput from currentPos

/* OUTPUT PID VALUE */

DOValue[5], DOValue[6], DOValue[7], AO0ByteValue[0], AO0ByteValue[1],

AO1ByteValue[0], AO1ByteValue[1], resetCounterCmd };

Trang 37

Nội dung Báo cáo thí nghiệm:

- Giải thích chương trình trên USBcard và máy tính trong các thí nghiệm 1 và 2

- Báo cáo chương trình PID điều khiển vị trí động cơ

Trang 38

Bảng nhận xét, đánh giá của GV Thông tin Sinh viên:

Đánh giá của GV:

Trang 39

1u C15

VREF_SD+

100k R8

104 C8

NRST

3V3 NRST

1

J1

SWD GND SWDIO SWCLK

SWCLK

GND

DIR 1 A0 2 A1 3 A2 4 A3 5 A4 6 A5 7 A6 8 A7 9 GND

10 VCC OEB7B6 B5 B4 B3 B2 B1 B0 11 12 13 14 15 16 17 18 19 20

U5

74HCT245D GND

GND

2K R39 5V

2K R44

2 5 8 10

VCC_DO

2K R48

2K R50 VCC_DO

2K R64 VCC_DO

2K R66 VCC_DO

2K R68 VCC_DO

2K R70 VCC_DO DIN1

GND

2K R40 5V

2

1 330 GND_DI

2

1 2k2 DI2_24V

2

1 330 GND_DI

2

1 2k2 DI3_24V

2

1 330 GND_DI

2

1 2k2 DI4_24V

2

1 330 GND_DI

2

1 2k2 DI6_24V

2

1 330 GND_DI

2

1 2k2 DI7_24V

2

1 330 GND_DI

2

1 2k2 DI8_24V

DIN4 DIN1

DIN6 DIN2

DIN_1

DIN_3

DIN_4 DIN_6

1A 1 1Y 2 2A 3 2Y 4 3A 5 3Y 6 GND

7 VCC4Y4A 5Y 5A 6Y 6A 8 9 10 11 12 13 14

U7

74HC14 GND

5V

2

104 GND ENCA1 DIN7

DIN8

GND_DI

DI2_24V DI2_5V DI3_24V DI3_5V DI4_24V DI4_5V DI5_24V DI5_5V DI6_24V DI6_5V DI7_24V DI7_5V DI8_24V DI8_5V

DI1_24V DI1_5V GND_DI

56R R3

102 C6

2 1

104 C1

D1 Zener 3.3V

AI1

AIN_1

2 1

100K R1

1100K

R6

1 3

8 U3A LM358

2 1

56R R4

100K R2

1100K

R7

7 5

U2B LM358

7 5

U3B LM358

2

104 C2 VDDA

2 1

56R R5

102 C5 AOUT_1

AO1

2 1

102 C9 AOUT_2

AO2

1 3

U2A LM358

7 R2IN

8 R2OUT9 T2IN 10 T1IN 11 R1OUT 12 R1IN 13 T1OUT 14

IC1 MAX3232CDR STM_RX

GND

GND

2 104 GND

TX_232

GND

HMI RS232

1 7 4

J6

DB9 Connector

Vcc D- D+

GND U

P1

USB 5V_USB

GND

2

1 R77 0R

2 1

0R R78

1.5K R75 3V3

USB_DM USB_DP

10k GND

5V

2

1 56R

2 1

GND

2 47u 16V C36 Tantalum

5V_DC

OUT 2 IN 3 TAB 0

2 10u 16V C32 Tantalum

3V3 5V

DIN_6 DIN_7

VREF_SD+

AGND

AGND AGND

AGND GND

2 1

0R R12

PA4

PA4

PA11 PA11

PB4 PB5

PB4

PA9 PA10

USART2_TX

PB0

PB0 ADC_IN8 PF7

PA0 PF6

I2C2_SCL

2

20p C3

2

20p C4

2 I/O 23 VCC 4

S1

1 2 4 3

U8

1 2 4 3

U9

1 2 4 3

U16

1 2 4 3

U17

1 2 4 3

U10

1 2 4 3

U18

1 2 4 3

U11

1 2 4 3

U19

1 2 4 3

U12

1 2 4 3

U20

1 2 4 3

U13

1 2 4 3

U21

1 2 4 3

U14

1 2 4 3

U22

1 2 4 3

U15

1 2 4 3

U23

PF7 36 PF6 35 PF1-OSC_OUT PF0-OSC_IN 6 5 PE9

22 PE8 21 PD8 28 PC15-OSC32_OUT

4 PC14-OSC32_IN

3 PC13 2

PB9 46 PB8 45 PB7 43 PB6 42 PB5 41 PB4 40 PB3 39 PB2 20

PB15 27 PB14 26

PB1 19 PB0 18

PA9

30 PA8 29 PA6

16 PA5

15 PA4

14 PA3

13 PA2 12

PA1

11 PA0 10

NRST 7 BOOT0 44

STM32F373CCT6

VIN+

1 VIN- 6 VSS 2 SDA 4 SCL 3 VDD 5

U4

MCP3421A0T-E/CH

10u 16V C10 Tantalum

2

1 R9 10K

2 1

10K R11 3V3

VSSSD/VREFSD- 23 VSSA/VREF- 8 VSS_1 47 VREFSD+ 25 VDDSD 24 VDDA/VREF+

9 VDD_2

17 48 VDD_1 VBAT 1

U1B

STM32F373CCT6

2 5 8 10 13 16

J3

Domino 18

2 5 8

J2

Domino 8

PA8

PB14 PB6 PB3

PA15

PE8

8MHz

1 4 3 2

2

1 R16 2K2 GND

10k 3V3

DIN_3 nDIN_3

Ngày đăng: 02/11/2022, 09:07

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w