TN DLDKMT 4

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 39

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

KHIỂN BẰNG MÁY TÍNH


BTN #4: LẬP TRÌNH CARD USB GIAO TIẾP VỚI
MÁY TÍNH

THÁNG 4 NĂM 2018


BỘ MÔN TỰ ĐỘNG, KHOA ĐIỆN ĐIỆN TỬ - ĐẠI HỌC BÁCH KHOA TP.HCM
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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.

Page |1
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

- 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 ->
STM32F373 -> STM32F373C8Tx
Page |2
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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


Page |3
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

❖ 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

Page |4
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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
Page |5
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

stm32f3xx_hal_adc_ex.c
stm32f3xx_hal_cortex.c
stm32f3xx_hal_dac.c
stm32f3xx_hal_dac_ex.c
stm32f3xx_hal_dma.c
stm32f3xx_hal_flash.c
stm32f3xx_hal_flash_ex.c
stm32f3xx_hal_gpio.c
stm32f3xx_hal_i2c.c
stm32f3xx_hal_i2c_ex.c
stm32f3xx_hal_pcd.c
stm32f3xx_hal_pcd_ex.c
stm32f3xx_hal_pwr.c
stm32f3xx_hal_pwr_ex.c
stm32f3xx_hal_rcc.c
stm32f3xx_hal_rcc_ex.c
stm32f3xx_hal_tim.c
stm32f3xx_hal_tim_ex.c
stm32f3xx_hal_uart.c
stm32f3xx_hal_uart_ex.c
- Nhấn OK

Page |6
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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

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

Page |7
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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

Page |8
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

- 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/ST
M32F3xx/Include;./Drivers/CMSIS/Include
- Cuối cùng ta có cửa sổ như sau:

Page |9
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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

P a g e | 10
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

- 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.

P a g e | 11
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

- 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:
#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include "stm32f3xx_hal.h"
#include "driver.h"
#include "usb_device.h"
#include "usbd_custom_hid_if.h"

- Tiếp theo, khai báo các biến toàn cục như sau ở đầu chương trình:

P a g e | 12
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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:
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */


SystemClock_Config();

/* Initialize all configured peripherals */


GPIO_Init();
AI_Init();

P a g e | 13
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

DO_Init();
AO_Init();
Counter_Init();
MX_USB_DEVICE_Init();
Sample_Timer_Init();

while (1)
{
if(usb_tx_flag)
{
usb_tx_flag =0;
DI_value = DI_Read_All();
C0_value = Counter_Read();
AI_Read_All(AI_value);
/* DIN */
usb_tx_buffer[0] = DI_value;
/* counter */
usb_tx_buffer[1] = (uint8_t)(C0_value >> 24);
usb_tx_buffer[2] = (uint8_t)(C0_value >> 16);
usb_tx_buffer[3] = (uint8_t)(C0_value >> 8);
usb_tx_buffer[4] = (uint8_t)(C0_value);
/* AIN */
usb_tx_buffer[5] = (uint8_t)(AI_value[0] >> 24);
usb_tx_buffer[6] = (uint8_t)(AI_value[0] >> 16);
usb_tx_buffer[7] = (uint8_t)(AI_value[0] >> 8);
usb_tx_buffer[8] = (uint8_t)(AI_value[0]);
usb_tx_buffer[9] = (uint8_t)(AI_value[1] >> 24);
usb_tx_buffer[10] = (uint8_t)(AI_value[1] >> 16);
usb_tx_buffer[11] = (uint8_t)(AI_value[1] >> 8);
usb_tx_buffer[12] = (uint8_t)(AI_value[1]);

P a g e | 14
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

usb_tx_buffer[13] = (uint8_t)(AI_value[2] >> 24);


usb_tx_buffer[14] = (uint8_t)(AI_value[2] >> 16);
usb_tx_buffer[15] = (uint8_t)(AI_value[2] >> 8);
usb_tx_buffer[16] = (uint8_t)(AI_value[2]);

USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,usb_tx_buffer,17);
}
if (usb_rx_flag)
{
int i;
usb_rx_flag = 0;
switch (usb_rx_buffer[0])/* cmd id */
{
case 'N':/* DO, AO */
{
//DO
DO_Write_All(&usb_rx_buffer[1]);

//AO
AO_value[0] = ((float)usb_rx_buffer[9]*256+(float)usb_rx_buffer[10])/1000;
AO_value[1] = ((float)usb_rx_buffer[11]*256+(float)usb_rx_buffer[12])/1000;

AO_Write_All(AO_value);

//reset Counter
if (usb_rx_buffer[13] == 'R')
{
Counter_Reset();
}
break;

P a g e | 15
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

}
case 'F':/* pwm frequency */
{
for(i=0;i<3;i++)
{
DO_pwm_frequency[i]= (uint32_t)(usb_rx_buffer[i+1]);
}
DO_pwm_set_frequency(DO_pwm_frequency);
break;
}
case 'G':/* ADC 18 bit gain */
{
AI18_Set_Gain(usb_rx_buffer[1]);
break;
}
case 'T':/* sample time */
{
Ts_ms = ((int)usb_rx_buffer[1]<<8) + (int)usb_rx_buffer[2];
Sample_Timer_Set_Period(Ts_ms);
}
}
}
}
}

- Viết hàm USB_RX_Interrupt dưới hàm main:


void USB_RX_Interrupt(void)
{
int i;

P a g e | 16
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

USBD_CUSTOM_HID_HandleTypeDef
*myusb=(USBD_CUSTOM_HID_HandleTypeDef *)hUsbDeviceFS.pClassData;
//myusb->Report_buf[0]= numbers of byte data
for (i=0;i<myusb->Report_buf[0];i++)
{
usb_rx_buffer[i]=myusb->Report_buf[i+1];
}
usb_rx_flag = 1;
}

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


void Sample_Timer_Interrupt(void)
{
usb_tx_flag =1;
}

- 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 */
while(1)
{
}
/* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)

P a g e | 17
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

{
/* 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:

P a g e | 18
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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

P a g e | 19
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

- 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

P a g e | 20
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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
using LibUsbDotNet;
using LibUsbDotNet.Info;
using LibUsbDotNet.Main;

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

P a g e | 21
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

namespace usbHID
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

#region Declaring Global Variable


public static UsbDevice myUsbDevice, myUsbDevice_temp;
UsbEndpointReader reader;
UsbEndpointWriter writer;
IAsyncResult result;
#endregion Declaring Global Variable
}
}

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:

#region USB_DATA_RECEIVER_INIT
void USB_DATA_RECEIVER_INIT()
{
IUsbDevice wholeUsbDevice = myUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
wholeUsbDevice.SetConfiguration(1);
wholeUsbDevice.ClaimInterface(0);
}
//Open usb end point reader and writer
reader = myUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
writer = myUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);

//Set Interrupt service rountie for reader complete event


reader.DataReceived += (OnRxEndPointData);
reader.DataReceivedEnabled = true;
}
#endregion USB_DATA_RECEIVER_INIT

P a g e | 22
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

#region USB DATA RECEIVER INTERRUPT SERVICE ROUTINE


Action<byte[]> UsbReceiverAction;
private void OnRxEndPointData(object sender, EndpointDataEventArgs e)
{
UsbReceiverAction = UsbReceiverActionFunction;
if ((myUsbDevice.IsOpen) && (reader != null))
{
result = this.BeginInvoke(UsbReceiverAction, e.Buffer);
}
}
private void UsbReceiverActionFunction(byte[] input)
{
// giữ liệu nhận sẽ lưu trong chuỗi input và sẽ xử lý số liệu tại đây
}
#endregion USB DATA RECEIVER INTERRUPT SERVICE ROUTINE

#region USB EXIT


private void Usb_exit()
{
reader.DataReceivedEnabled = false;
reader.DataReceived -= (OnRxEndPointData);
this.EndInvoke(ketthuc);
reader.Dispose();
writer.Dispose();
if (myUsbDevice != null)
{
if (myUsbDevice.IsOpen)
{
IUsbDevice wholeUsbDevice = myUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
wholeUsbDevice.ReleaseInterface(0);
}
myUsbDevice.Close();

}
myUsbDevice = null;
UsbDevice.Exit();
}
}
#endregion USB EXIT

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

P a g e | 23
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

private void btnConnect_Click(object sender, EventArgs e)


{
if (btnConnect.Text == "Connect")
{
if (myUsbDevice == null)
{
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();
txtManufacturer.Text =
myUsbDevice.Info.ManufacturerString;
USB_DATA_RECEIVER_INIT();
btnConnect.Text = "Disconnect";
timerSend.Enabled = true;
}
}
}
if (myUsbDevice == null)
{
MessageBox.Show("Device Not Found !!!", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
Usb_exit();
btnConnect.Text = "Connect";
txtProductName.Text = "";
txtVendorId.Text = "";
txtProductId.Text = "";
txtManufacturer.Text = "";
txtPWM0.Text = "";
txtPWM1.Text = "";
txtPWM3.Text = "";
txtPWM6.Text = "";
txtPWM7.Text = "";
txtAI0.Text = "";
txtAI1.Text = "";
txtCounter0.Text = "";
timerSend.Enabled = false;
}
}

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

P a g e | 24
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

private void Form1_FormClosing(object sender, FormClosingEventArgs e)


{
if (MessageBox.Show("Are you want to exit ?", "Confirmation",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{

}
else
{
e.Cancel = true;
}
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)


{
try
{
Usb_exit();
Application.Exit();
}
catch
{

}
}

P a g e | 25
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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

Kết quả kết nối

P a g e | 26
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

Gửi nhận dữ liệu


a. Frame truyền 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.
Index 0 1 2 .. N
Meaning Length byte: N CMD ID byte: ‘N’, ‘T’, ‘F’, … Data bytes

b. Giao diện chương trình


- 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.

P a g e | 27
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

• 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.
c. Chương trình nhận
- Khai báo các biến sử dụng để truyền nhận dữ liệu ở đầu chương trình

P a g e | 28
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

// DIN
byte DIValue;
// DOUT
byte[] DODuty = new byte[8];
byte[] DOValue = new byte[8];
bool[] DOInPWMMode = new bool[8];
// PWM frequency
byte[] FValue = new byte[3];
// AIN gain
double AIGain;
// Sample time
Int16 TsValue;
// AOUT
byte[] AO0ByteValue = new byte[2];
byte[] AO1ByteValue = new byte[2];
// AIN
double[] AIValue = new double[3];
// Counter
Int32 counterValue;
byte resetCounterCmd;

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


/* GET VALUE */
// DIN
DIValue = input[0];

// Counter
byte[] counterValueTmp = new byte[4];
counterValueTmp[3] = input[1];
counterValueTmp[2] = input[2];
counterValueTmp[1] = input[3];
counterValueTmp[0] = input[4];
counterValue = BitConverter.ToInt32(counterValueTmp, 0);
if (counterValue > 32767)
counterValue = counterValue - 65536;
// AIN
int AI0IntValue;
int AI1IntValue;
int AI2IntValue;
byte[] AI0ByteValue = new byte[4];
byte[] AI1ByteValue = new byte[4];
byte[] AI2ByteValue = new byte[4];

AI0ByteValue[3] = input[5];
AI0ByteValue[2] = input[6];
AI0ByteValue[1] = input[7];
AI0ByteValue[0] = input[8];
AI1ByteValue[3] = input[9];
AI1ByteValue[2] = input[10];
AI1ByteValue[1] = input[11];
AI1ByteValue[0] = input[12];
AI2ByteValue[3] = input[13];
AI2ByteValue[2] = input[14];
AI2ByteValue[1] = input[15];
AI2ByteValue[0] = input[16];

P a g e | 29
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

AI0IntValue = BitConverter.ToInt32(AI0ByteValue, 0);


AI1IntValue = BitConverter.ToInt32(AI1ByteValue, 0);
AI2IntValue = BitConverter.ToInt32(AI2ByteValue, 0);
AIValue[0] = (Convert.ToDouble(AI0IntValue) / 4095)*3.3;
AIValue[1] = (Convert.ToDouble(AI1IntValue) / 4095)*3.3;
AIValue[2] = (Convert.ToDouble(AI2IntValue) / (AIGain * 131072)) *
2.048;

- Để hiển thị giá trị DI nhận được, ta sẽ thay đổi màu sắc của OvalShape
/* DISPLAY */
if (Convert.ToBoolean(DIValue & 0x01))
{
ovalDI0.FillColor = Color.Red;
}
else
{
ovalDI0.FillColor = Color.White;
}

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:
txtAI0.Text = AIValue[0].ToString("0.000");
txtAI1.Text = AIValue[1].ToString("0.000");
txtAI2.Text = AIValue[2].ToString("0.000");

txtCounter0.Text = counterValue.ToString();

- 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.
d. Chương trình gửi
- 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.
private void Form1_Load(object sender, EventArgs e)
{
timerSend.Interval = 200;
timerSend.Enabled = false;
txtTs.Text = "10";
txtF0.Text = "2";
txtF1.Text = "2";
txtF2.Text = "2";
cbEnablePID.Checked = false;
}

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

P a g e | 30
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

void USBWrite(byte[] buffer)


{
try
{
int bytesWritten;
if ((myUsbDevice.IsOpen) && (writer != null))
writer.Write(buffer, 1000, out bytesWritten);
}
catch (Exception err)
{
MessageBox.Show("Can Not Send Data To USB Device\nDetails: " + err,
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

- 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
if (DOInPWMMode[0]) // PWM mode
{
DOValue[0] = DODuty[0];
}
else // GPIO mode
{
if (chbDO0.Checked)
DOValue[0] = 100;
else
DOValue[0] = 0;
}

• 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
byte[] data_send = { 14, (byte)'N', DOValue[0], DOValue[1],
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;

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

P a g e | 31
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

private void txtAO0_TextChanged(object sender, EventArgs e)


{
int AOIntValue;
if (txtAO0.Text == "")
{
AOIntValue = 0;
}
else
{
double AODoubleValue = Convert.ToDouble(txtAO0.Text);
if (AODoubleValue > 3.3 || AODoubleValue < 0)
{
MessageBox.Show("Ngoài tầm, hãy nhập giá trị từ 0 đến 3.3",
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
else
{
AOIntValue = (Int16)(AODoubleValue * 1000);
}
}
AO0ByteValue[0] = (byte)(AOIntValue >> 8);
AO0ByteValue[1] = (byte)(AOIntValue);
}

- 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
DOInPWMMode[0] = chbPWM0.Checked;

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


if (txtPWM0.Text == "")
{
DODuty[0] = 0;
}
else
{
Int16 DODutyTmp = Convert.ToInt16(txtPWM0.Text);
if (DODutyTmp < 0 || DODutyTmp > 100)
{
MessageBox.Show("Ngoài tầm, hãy nhập giá trị từ 0 đến 100",
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
DODuty[0] = (byte)(DODutyTmp);
}
}

P a g e | 32
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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.
if (txtF0.Text == "")
{
MessageBox.Show("Hãy nhập giá trị từ 1 đến 255", "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
Int16 FValueTmp = Convert.ToInt16(txtF0.Text);
if (FValueTmp < 1 || FValueTmp > 255)
{
MessageBox.Show("Ngoài tầm, hãy nhập giá trị từ 1 đến 255",
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
FValue[0] = (byte)FValueTmp;
}
}

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


private void txtTs_TextChanged(object sender, EventArgs e)
{
if (txtTs.Text == "")
{
MessageBox.Show("Hãy nhập giá trị từ 50 đến 30000", "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
Int16 TsValueTmp = Convert.ToInt16(txtTs.Text);
if (TsValueTmp < 1 || TsValueTmp > 30000)
{
MessageBox.Show("Ngoài tầm, hãy nhập giá trị từ 1 đến 30000",
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
TsValue = TsValueTmp;
}
}
}

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

P a g e | 33
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

private void btnConfigFreq_Click(object sender, EventArgs e)


{
byte[] data_send = { 4, (byte)'F', FValue[0], FValue[1], FValue[2] };
USBWrite(data_send);
}

private void btnTs_Click(object sender, EventArgs e)


{
byte[] data_send = { 3, (byte)'T', 0, 0 };
data_send[2] = (byte)(TsValue >> 8);
data_send[3] = (byte)(TsValue);
USBWrite(data_send);
}
private void btnResetC0_Click(object sender, EventArgs e)
{
resetCounterCmd = (byte)'R';
}

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
private void cbGain_SelectedIndexChanged(object sender, EventArgs e)
{
switch (cbGain.Text)
{
case "x1":
AIGain = 1;
break;
case "x2":
AIGain = 2;
break;
case "x4":
AIGain = 4;
break;
}
byte[] data_send = { 2, (byte)'G', (byte)AIGain };
USBWrite(data_send);
}

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ơ
DC.

P a g e | 34
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

- Để đ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

/* CALCULATE PID */
currentPos = counterValue;
// Write your code here to calculate pidOutput from currentPos

/* OUTPUT PID VALUE */


byte[] data_send = { 14, (byte)'N', 0, 0, DOValue[2], DOValue[3], DOValue[4],
DOValue[5], DOValue[6], DOValue[7], AO0ByteValue[0], AO0ByteValue[1],
AO1ByteValue[0], AO1ByteValue[1], resetCounterCmd };
if (pidOutput > 0)
{
data_send[3] = (byte)pidOutput;
}
else
{
pidOutput = -pidOutput;
data_send[2] = (byte)pidOutput;
}
USBWrite(data_send);
resetCounterCmd = 0;

- 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.

P a g e | 35
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

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ơ.

P a g e | 36
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài

Bảng nhận xét, đánh giá của GV


Thông tin Sinh viên:
Nhóm: ____________________________________
Họ và Tên SV: ______________________________
MSSV: ____________________________________
Các Nhiệm vụ và nội dung thực hiện trong buổi thí nghiệm:
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Đánh giá của GV:

STT Tiêu chí Mức 1 Mức 2 Mức 3 Mức 4 Mức 5


1 Chuẩn bị Bài TN
2 Mức đô hoàn thành BTN

Mức độ nắm bắt nội dung thí


3 nghiệm
Mức độ giải quyết các bài toán
4 trực tiếp của GVHD
5 Nội dung báo cáo thí nghiệm
Mức độ trả lời các câu hỏi
6 trong BTN
Tính sáng tạo của giải thuật đề
7 xuất
Liên kết giữa các thành viên
8 trong nhóm
Các ý kiến khác:
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

P a g e | 37
1 2 3 4 5 6 7 8

MCU ANALOG I/O


U1A
PA0 10 18 PB0
PA0 PB0
PA1 11 19 PB1
PA1 PB1 J1 SWCLK
PA2 12 20
PA2 PB2
PA3 13 39 PB3 1
PA3 PB3
PA4 14 40 PB4 2 GND
PA4 PB4
PA5 15 41 PB5 3
PA5 PB5 SWDIO
PA6 16 42 PB6
PA6 PB6 SWD
VDDA
A PA8 29 43 PB7 A
PA9 30
PA8
PA9
PB7
PB8
45 PB8
VDDA PORT MAPPING
PA10 31 46 PB9 C1
PA10 PB9 2 1 C2
PA11 32 26 PB14 C3 AGND
PA11 PB14 U2A 2 1
PA12 33 27 PB15 1 2 OSC_IN 104 AGND
PA12 PB15 LM358
SWDIO 34 U2B 104
PA13 20p Y1 8MHz DIN_8 PB9 DOUT_1 TIM15_CH1 PB14
SWCLK 37 28 1 2 LM358
PA14 PD8 DIN_7 PB8 DOUT_2 TIM15_CH2 PB15
PA15 38 R1 R2

8
PA15 AI1 1 2 3 AI2 1 2 5 U3A nDIN_3 PE9 DOUT_3 PE8
5 OSC_IN R3 R4

8
PF0-OSC_IN 3 4 1 1 2 AIN_1 7 1 2 AIN_2 AOUT_1 3 LM358 DIN_4 PB5 DOUT_4 TIM16_CH1 PA6
2 6 OSC_OUT 100K 100K R5
PC13 PF1-OSC_OUT C4 2 6 1 1 2 AO1 DIN_5 PA15 DOUT_5 PA1
3 35 PF6 56R 56R

2
PC14-OSC32_IN PF6 1 2 OSC_OUT 2 DIN_2 PF7 DOUT_6 PA0
4 36 PF7 56R

2
PC15-OSC32_OUT PF7 R6 R7 DIN_6 PF6 DOUT_7 TIM2_CH4 PA3

4
20p 100K 100K C5 DIN_1 PA8 DOUT_8 TIM2_CH3 PA2
44 C6 D1 C7 D2
BOOT0 GND 102

1
PE8 21 3V3 102 102

1
Zener 3.3V

1
J2 Zener 3.3V
PE8 AGND
PE9 22 7 NRST 1
PE9 NRST AGND AIN_1 ADC_IN8 PB0 AOUT_1 DAC1_OUT1 PA4
2 AO1 AGND
AIN_2 ADC_IN9 PB1 AOUT_2 DAC1_OUT2 PA5

1
STM32F373CCT6 3 AO2
AGND AGND
R8 4 AGND
AGND AGND AGND AGND AGND
100k 5 AI1
SW1 SDA I2C2_SDA PA10 USB_DM PA11
NRST 6 AI2

1 2
VBAT U1B SCL I2C2_SCL PA9 USB_DP PA12

2
1
7 AI3
1
VBAT C8 8 AI4

3
4
VDD_IO VREF_SD+ 104
48 47 ENCA_1 TIM19_CH1 PB6 STM_TX USART2_TX PB3
2
VDD_1 VSS_1 GND Domino 8
17 ENCB_1 TIM19_CH2 PB7 STM_RX USART2_RX PB4
VDDSD VDD_2
25
VREFSD+ GND GND
24 23
VDDSD VSSSD/VREFSD-
VDDA
9 8 3V3
VDDA/VREF+ VSSA/VREF- U3B
U4 LM358
STM32F373CCT6 R9 10K AOUT_2 5
AI3 1 4 SDA 1 2 R10
VIN+ SDA 7 1 2 AO2
AI4 6 3 SCL 1 2
AGND VIN- SCL 6
56R DRILL 3MM

2
R11 10K
VDDA 5 2 C9
VDD_IO VDDA VDDSD VREF_SD+ VDD_IO VDDA VDD_IO 3V3 VDD VSS
102

1
L1 MCP3421A0T-E/CH

1
Bead
1

C10 C12
C11 C13 C15 C16 C17 C18 C19 C20 VDDA VDDSD AGND
C14 10u 16V 104
4.7u 10V AGND

2
104 1u 104 1u 104 1u 104
1

104
1

Tantalum
2

Tantalum
R12
1 2
H1 H2 H3 H4
0R VDDA VREF_SD+
AGND
GND AGND AGND AGND
GND AGND

B B

DIGITAL INPUT & COUNTER 3V3 DIGITAL OUTPUT


5V
1

GND_DI
5V
R13
C21 10k NOTE
1
1

2 1 J3
GND nDIN_3
3 2

R14 R15 1 GND_DI


J4 104 10K 10k 2 GND_DI
1 R16 2K2 Q1 5V 5V
R17 56R DIN_3 1 2 1 3 DI1_24V VCC_DO
2
2

2 1 2 CNT1 ENCA1 2SC1815 C22 104


4 DI1_5V U5 J5
3 1 2 CNT2 ENCB1 1 2 C23 104
5 DI2_24V 1 20 GND 1 2 1 DOUT1 DOUT2 DOUT3 DOUT4 DOUT5 DOUT6 DOUT7 DOUT8
4 DIR VCC
2

R18 56R 6 DI2_5V DOUT_1 2 19 2


1

1
5V 5V 5V 5V 5V 5V 5V 5V A0 OE GND_DO
7 DI3_24V DOUT_2 3 18 DOUT1 3 DO1
Counter/ENC C24 C25 A1 B0 R19 R20 R21 R22 R23 R24 R25 R26
8 DI3_5V DOUT_3 4 17 DOUT2 4 DO2
102 102 A2 B1 1k5 1k5 1k5 1k5 1k5 1k5 1k5 1k5
2

GND 9 DI4_24V DOUT_4 5 16 DOUT3 5 DO3


A3 B2

2
1

1
10 DI4_5V DOUT_5 6 15 DOUT4 6 DO4
GND A4 B3
GND GND 11 DI5_24V R27 R28 R29 R30 R31 R32 R33 R34 DOUT_6 7 14 DOUT5 7 DO5
5V 5V A5 B4

1
12 DI5_5V 1k5 1k5 1k5 1k5 1k5 1k5 1k5 1k5 DOUT_7 8 13 DOUT6 8 DO6
A6 B5
U6 C26 104 U7 C27 104 13 DI6_24V DOUT_8 9 12 DOUT7 9 DO7 D3 D4 D5 D6 D7 D8 D9 D10
2

A7 B6
DIN1 1 14 1 2 DIN8 1 14 1 2 14 DI6_5V 10 11 DOUT8 10 DO8

2
1A VCC GND 1A VCC GND GND B7
DIN_1 2 13 DIN6 DIN_8 2 13 ENCB1 15 DI7_24V
1

1Y 6A 1Y 6A DOUT
DIN2 3 12 DIN_6 DIN7 3 12 ENCB_1 16 DI7_5V 74HCT245D
2A 6Y 2A 6Y D11 D12 D13 D14 D15 D16 D17 D18
DIN_2 4 11 DIN5 DIN_7 4 11 ENCA1 17 DI8_24V
2Y 5A 2Y 5A
2

DIN3 5 10 DIN_5 5 10 ENCA_1 18 DI8_5V GND


3A 5Y 3A 5Y
DIN_3 6 9 DIN4 6 9 GND GND GND GND GND GND GND GND
3Y 4A 3Y 4A Domino 18 DIN1 DIN2 DIN3 DIN4 DIN5 DIN6 DIN7 DIN8
7 8 DIN_4 7 8
GND 4Y GND 4Y
74HC14 74HC14
GND GND

5V 5V 5V 5V
5V VCC_DO 5V VCC_DO 5V VCC_DO 5V VCC_DO
1

R35 2k2 R36 2k2 R37 2k2 R38 2k2


1

2
DI1_24V 1 2 R39 DI2_24V 1 2 R40 DI3_24V 1 2 R41 DI4_24V 1 2 R42
2K 2K 2K 2K R43 R44 R45 R46 R47 R48 R49 R50
R51 330 R52 330 R53 330 R54 330 330 2K 330 2K 330 2K 330 2K
2

DI1_5V 1 2 1 4 DIN1 DI2_5V 1 2 1 4 DIN2 DI3_5V 1 2 1 4 DIN3 DI4_5V 1 2 1 4 DIN4

1
2

2
1 4 DO1 1 4 DO2 1 4 DO3 1 4 DO4

2 3 2 3 2 3 2 3
U8 U9 U10 U11 DOUT1 2 3 DOUT2 2 3 DOUT3 2 3 DOUT4 2 3
U12 U13 U14 U15
C GND_DI GND GND_DI GND GND_DI GND GND_DI GND C
GND_DO GND_DO GND_DO GND_DO

5V 5V 5V 5V 5V VCC_DO 5V VCC_DO 5V VCC_DO 5V VCC_DO


1

2
R55 2k2 R56 2k2 R57 2k2 R58 2k2 R64 R66 R68 R70
DI5_24V 1 2 R59 DI6_24V 1 2 R60 DI7_24V 1 2 R61 DI8_24V 1 2 R62 R63 R65 R67 R69
2K 2K 2K 2K 330 2K 330 2K 330 2K 330 2K
R71 330 R72 330 R73 330 R74 330
1

1
2

2
DI5_5V 1 2 1 4 DIN5 DI6_5V 1 2 1 4 DIN6 DI7_5V 1 2 1 4 DIN7 DI8_5V 1 2 1 4 DIN8 1 4 DO5 1 4 DO6 1 4 DO7 1 4 DO8

2 3 2 3 2 3 2 3 DOUT5 2 3 DOUT6 2 3 DOUT7 2 3 DOUT8 2 3


U16 U17 U18 U19 U20 U21 U22 U23
GND_DI GND GND_DI GND GND_DI GND GND_DI GND GND_DO GND_DO GND_DO GND_DO

POWER SUPPLY USB RS232


5V_USB

IC1 MAX3232CDR
2

5V 3V3 RX_232 13 12 STM_RX J6


5V_DC C28 R1IN R1OUT
5V_DC 3V3 TX_232 14 11 STM_TX 1
104 T1OUT T1IN
1

8 9 6
U24 LM1117-3V3 R2IN R2OUT
U25 LM7805 1 F1 7 10 TX_232 2
2 U26 T2OUT T2IN
ADJ/G

1 3 2 3 OUT 7
2

+DC 1 IN OUT IN 1 4
5V_USB 3 0 R75 GND GND VCC GND 1 2 1 4 1 2 RX_232 3
SMD FUSE 1.1A TAB C1+ C2+
2

3
GND 8
S1 1.5K 2 3 P1 C29 104 C30 104
1

-DC 2
R76 I/O 1 I/O 2 3 5 4
1

GND

VCC
J7 C31 C32
1

C33
1

C1- C2-
2

C34 C35 C36 C37 470 R77 0R Vcc 1 2 6 2 1 2 9


104 10u 16V 104 USB_DM 1 2 PRTR5V0U2X GND VS- VS+ GND
USB

100u 50V 104 47u 16V 104


1 1

D- 5
2

Tantalum USB_DP 1 2 C38 104 C39 104


2

Tantalum D+ 3V3
15

16

GND DB9 Connector


D19 R78 0R
USB GND
2

GND GND GND GND GND GND GND GND GND GND
1

C40
GND 104
2

GND HMI RS232


D D
GND

Title USB Card A&C Research Lab


HCMUT
Size: D Number: Revision: rev 1
Date: 4/18/2018 Time: 12:15:39 AM Sheet 1 of 1
File: D:\hoc hanh\electronic\project\others\card_DLDKMT\CardUSBv2_2\CardUSB_v1.SchDoc

1 2 3 4 5 6 7 8

You might also like