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 1THÍ NGHIỆM ĐO LƯỜNG VÀ ĐIỀU
Trang 2BTN #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 4Hì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 6Hì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 8Hình 9: Các file trong group Application/User
Hình 10: Các file trong group Middlewares/USB_Device_Library
Trang 9Hì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 14static 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 22Tạ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 23Chươ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 24Chươ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 25Form 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 26private void Form1_FormClosing( object sender, FormClosingEventArgs e)
{
MessageBoxButtons YesNo, MessageBoxIcon Question) == DialogResult Yes)
Trang 27Cấu trúc chương trình hoàn chỉnh
Kết quả kết nối
Trang 28Gử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 34Tươ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 35Thay đổ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 37Nộ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 38Bảng nhận xét, đánh giá của GV Thông tin Sinh viên:
Đánh giá của GV:
Trang 391u 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