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 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 bài thí nghiệm, xem sơ đồ mạch trước lên lớp C GIỚI THIỆU MÔ HÌNH THÍ NGHIỆM Kit thí nghiệm cho bố trí Hình Hình 1: Sơ đồ bố trí kit thí nghiệm Kít thí nghiệm chia thành 12 khu vực: - Khu vực – CPU: là khu vực bố trí card USB Khu vực – 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 – 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 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 – ENCODER: là khu vực bố trí tín hiệu ngõ vào xung tốc độ cao Khu vực – 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 – DO: là khu vực bố trí các LED hiển thị ngõ số Khu vực – AO: là khu vực bố trí các ngõ điều khiển ANALOG Khu vực – PWM-PTO: là khu vực bố trí các ngõ xung tốc độ cao PWM và PTO cho phép điều khiển động tốc độ, vị trí động DC, SERVO, Bước Khu vực - 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 cửa sổ Hình 2: Cửa sổ tạo project 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 Device->Startup, Variant Device chọn là Standalone hình dưới: Hình 4: Cửa sổ chọn package 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 Drivers vào folder chứa project - Sau hoàn thành các bước trên, folder chứa project bao gồm các folder hình đây: Hình 5: Folder chứa project Hình 6: Các file 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 folder Inc - Click vào biểu tượng công cụ, cửa sổ Hình 8: Cửa sổ quản lí file project Tạo group 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 folder Src - Tạo group Middlewares/USB_Device_Library và add các file c 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 group Application/User Hình 10: Các file 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 group Driver/Src ❖ Add đường dẫn tới file header các define: - Nhấn vào biểu tượng công cụ, cửa sổ hình 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ổ sau: - Copy dòng vào mục Define USE_HAL_DRIVER,STM32F373xC - Tiếp tục copy dòng 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 ta có cửa sổ sau: Page |9 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 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 hồn chỉnh Kết 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 liệu a Frame truyền nhận liệu - Frame truyền nhận dữ liệu bao gồm 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 N Meaning Length byte: N CMD ID byte: ‘N’, ‘T’, ‘F’, … Data bytes - - b Giao diện chương trình Từ Toolbox, thêm vào các Button, Textbox, ComboBox, Checkbox, OvalShape, Label để tạo thành giao diện sau Kéo đối tượng Timer từ Toolbox vào giao diện, đặt thuộc tính Name Timer là TimerSend Thay đổi thuộc tính Name các đối tượng 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ụ 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 để thị DI0-DI7: ovalDI0- ovalDI7 • Textbox hiển thị AI0-AI2: txtAI0, txtAI1, txtAI2 • ComboBox để cài đặt gain module ADC: cbGain Click vào thuộc tính Items cửa sổ Properties, cửa sổ 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 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] AI0ByteValue[2] AI0ByteValue[1] AI0ByteValue[0] AI1ByteValue[3] AI1ByteValue[2] AI1ByteValue[1] AI1ByteValue[0] AI2ByteValue[3] AI2ByteValue[2] AI2ByteValue[1] AI2ByteValue[0] = = = = = = = = = = = = input[5]; input[6]; input[7]; input[8]; input[9]; input[10]; input[11]; input[12]; input[13]; input[14]; input[15]; 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 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ị các chân DI, AI, quay động để thay đổi giá trị counter và kiểm tra lại chương trình 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ẽ đặt ngắt Timer, ta config Timer và giá trị ban đầu các Textbox 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ả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 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, nhập giá trị từ đế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 máy tinh và kiểm tra các đèn LED DO USBcard Nối chân AO1 với AI1, AO2 với AI2 panel và kiểm tra giá trị 𝑉𝐴𝐼𝑁 ≈ - 𝑉𝑂𝑈𝑇 Ta viết đoạn chương trình sau 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 kiện chbPWM1_CheckedChanged, chbPWM3_CheckedChanged, chbPWM6_CheckedChanged, chbPWM7_CheckedChanged - Ta viết đoạn chương trình sau hàm ngắt txtPWM0_TextChanged if (txtPWM0.Text == "") { DODuty[0] = 0; } else { Int16 DODutyTmp = Convert.ToInt16(txtPWM0.Text); if (DODutyTmp < || DODutyTmp > 100) { MessageBox.Show("Ngoài tầm, nhập giá trị từ đế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 kiện txtPWM1_TextChanged txtPWM3_TextChanged, txtPWM6_TextChanged, txtPWM7_TextChanged Sinh viên click vào checkbox PWM, thay đổi số textbox PWM và quan sát độ sáng đèn DO USBcard - Ta viết đoạn chương trình sau hàm ngắt txtF0_TextChanged if (txtF0.Text == "") { MessageBox.Show("Hãy nhập giá trị từ đến 255", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { Int16 FValueTmp = Convert.ToInt16(txtF0.Text); if (FValueTmp < || FValueTmp > 255) { MessageBox.Show("Ngoài tầm, nhập giá trị từ đế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 kiện txtF1_TextChanged, txtF2_TextChanged - Ta viết hàm ngắt cho 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 < || TsValueTmp > 30000) { MessageBox.Show("Ngoài tầm, nhập giá trị từ đến 30000", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { TsValue = TsValueTmp; } } } - Ta viết chương trình xử lí 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, }; 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ị textbox AIN Quay động về vị trí và nhấn Reser Counter, kiểm tra giá trị counter bằng Ta viết chương trình xử lí 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 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 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ơ, panel ta nối chân DO0 với PULSE1, DO1 với PULSE2 mơ hình động • PULSE2 = và PULSE1 = : Mơ tơ quay thuận • PULSE2 = và PULSE1 = : Mô tơ quay nghịch • PULSE2 = và PULSE1 = PULSE2 = và PULSE1 = : Dừng Comment đoạn chương trình hàm ngắt TimerSend_Tick Cài đặt giá trị PWM0, là KHz, tần số lấy mẫu 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 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 USBcard và máy tính các thí nghiệm và Báo cáo chương trình PID điều khiển vị trí động 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á GV Thơng tin Sinh viên: Nhóm: Họ Tên SV: MSSV: Các Nhiệm vụ nội dung thực buổi thí nghiệm: Đánh giá GV: STT Tiêu chí Chuẩn bị Bài TN Mức hồn thành BTN Mức Mức Mức Mức Mức Mức độ nắm bắt nội dung thí nghiệm Mức độ giải toán trực tiếp GVHD Nội dung báo cáo thí nghiệm Mức độ trả lời câu hỏi BTN Tính sáng tạo giải thuật đề xuất Liên kết thành viên nhóm Các ý kiến khác: P a g e | 37 MCU ANALOG I/O U1A PB7 PB8 PB9 PB14 PB15 SWCLK GND SWDIO SWD VDDA 44 J2 NRST VDD_1 VDD_2 24 VDDA/VREF+ 2 C6 102 R4 AIN_2 D1 Zener 3.3V AOUT_1 U3A LM358 GND C7 102 AGND AGND AGND AGND VDD_IO 3V3 AI3 AI4 VDDA AGND R12 TIM2_CH4 TIM2_CH3 PB14 PB15 PE8 PA6 PA1 PA0 PA3 PA2 DAC1_OUT1 DAC1_OUT2 PA4 PA5 AIN_1 AIN_2 ADC_IN8 ADC_IN9 PB0 PB1 AOUT_1 AOUT_2 SDA SCL I2C2_SDA I2C2_SCL PA10 PA9 USB_DM USB_DP ENCA_1 ENCB_1 TIM19_CH1 TIM19_CH2 PB6 PB7 STM_TX STM_RX TIM16_CH1 PA11 PA12 USART2_TX USART2_RX PB3 PB4 VIN+ VIN- SDA SCL VDD VSS SDA SCL 1 R9 10K 2 AOUT_2 R10 56R R11 10K AO2 VDDA VREF_SD+ DRILL 3MM C9 102 1 VDDSD C20 104 C12 104 AGND AGND 0R AGND C10 10u 16V Tantalum VDDA 2 C19 1u GND TIM15_CH1 TIM15_CH2 U3B LM358 MCP3421A0T-E/CH Bead C18 104 C17 1u C16 104 C15 1u C14 104 2 C13 104 1 L1 C11 4.7u 10V Tantalum DOUT_1 DOUT_2 DOUT_3 DOUT_4 DOUT_5 DOUT_6 DOUT_7 DOUT_8 GND VDDA AO1 C5 102 PB9 PB8 PE9 PB5 PA15 PF7 PF6 PA8 AGND AGND AGND U4 VDD_IO 56R D2 Zener 3.3V 3V3 VREF_SD+ R5 DIN_8 DIN_7 nDIN_3 DIN_4 DIN_5 DIN_2 DIN_6 DIN_1 AGND AGND AI1 AI2 AI3 AI4 AGND 56R R7 100K VSSA/VREF- VDDSD 100K AGND AO1 AO2 AGND VDDA AIN_1 56R STM32F373CCT6 VDD_IO R2 AI2 R3 104 Domino GND 25 23 VREFSD+ VSSSD/VREFSD- VDDSD VDDA C8 104 VREF_SD+ 47 VSS_1 1 VBAT SW1 NRST 48 17 AGND NRST 3V3 R8 100k VDD_IO R6 100K GND U1B VDDSD 100K STM32F373CCT6 VBAT R1 OSC_OUT 20p C2 2 U2B LM358 C4 AGND 1 104 AI1 OSC_IN OSC_OUT PF6 PF7 C1 Y1 8MHz 1 20p 35 36 U2A LM358 OSC_IN 2 C3 A PORT MAPPING VDDA 2 PD8 PE8 PE9 43 45 46 26 27 J1 PB3 PB4 PB5 PB6 28 BOOT0 21 22 PB0 PB1 PB7 PB8 PB9 PB14 PB15 PF0-OSC_IN PC13 PF1-OSC_OUT PC14-OSC32_IN PF6 PC15-OSC32_OUT PF7 PE8 PE9 PA8 PA9 PA10 PA11 PA12 PA13 PA14 PA15 18 19 20 39 40 41 42 29 30 31 32 33 34 37 38 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PA8 PA9 PA10 PA11 PA12 SWDIO SWCLK PA15 PA0 PA1 PA2 PA3 PA4 PA5 PA6 10 11 12 13 14 15 16 A PA0 PA1 PA2 PA3 PA4 PA5 PA6 H1 GND H2 H3 H4 AGND AGND AGND B B DIGITAL INPUT & COUNTER GND_DI 74HC14 DOUT8 DOUT7 DOUT6 DOUT5 DOUT4 DOUT3 DOUT2 1 DOUT1 GND_DO D4 D6 D7 D8 R26 1k5 2 R25 1k5 1 D5 R24 1k5 D9 D10 D3 R23 1k5 R22 1k5 R21 1k5 R20 1k5 R19 1k5 DO1 DO2 DO3 DO4 DO5 DO6 DO7 DO8 2 C23 104 1 10 DOUT1 DOUT2 DOUT3 DOUT4 DOUT5 DOUT6 DOUT7 DOUT8 GND GND GND GND GND GND GND GND DOUT 74HCT245D D18 DIN7 VCC_DO J5 GND DIN6 5V C22 104 2 2 D17 D16 20 19 18 17 16 15 14 13 12 11 DIN5 R34 1k5 VCC OE B0 B1 B2 B3 B4 B5 B6 B7 DIN4 1 1 D15 D14 5V R33 1k5 DIR A0 A1 A2 A3 A4 A5 A6 A7 GND DIN3 D13 5V R32 1k5 10 DOUT_1 DOUT_2 DOUT_3 DOUT_4 DOUT_5 DOUT_6 DOUT_7 DOUT_8 DIN2 2 D12 DIN1 Domino 18 1 D11 5V R31 1k5 GND C27 104 ENCB1 ENCB_1 ENCA1 ENCA_1 14 13 12 11 10 VCC 6A 6Y 5A 5Y 4A 4Y 5V R30 1k5 1A 1Y 2A 2Y 3A 3Y GND 5V R29 1k5 1 5V R28 1k5 DIN8 DIN_8 DIN7 DIN_7 5V R27 1k5 U7 GND 5V GND 5V C25 102 GND U5 C26 104 DIN6 DIN_6 DIN5 DIN_5 DIN4 DIN_4 14 13 12 11 10 VCC 6A 6Y 5A 5Y 4A 4Y GND NOTE 5V Q1 2SC1815 1A 1Y 2A 2Y 3A 3Y GND R16 2K2 2 U6 5V C24 102 GND Counter/ENC GND DIN8 74HC14 GND 5V 5V GND GND DO1 DOUT1 U11 GND_DI GND_DI U12 GND DIN5 U16 DIN6 R73 330 R61 2K U17 GND_DI GND DIN7 DI8_24V DI8_5V R74 330 U18 GND_DI GND DIN8 R63 330 GND_DI GND U20 GND_DI POWER SUPPLY DO5 DOUT5 U19 GND 2 R62 2K R65 330 USB 2 C 5V R68 2K R67 330 GND_DO VCC_DO DO6 VCC_DO R70 2K R69 330 DO7 DOUT7 U21 GND_DO U15 5V R66 2K DOUT6 DO4 DOUT4 GND_DO VCC_DO DI7_5V DI7_24V 1 R60 2K R64 2K R50 2K U14 5V R72 330 VCC_DO R49 330 DO3 DOUT3 GND_DO VCC_DO DI6_5V R58 2k2 U13 5V DI6_24V 5V R59 2K R57 2k2 2 R71 330 1 DI5_5V R56 2k2 2 DI5_24V R55 2k2 5V DO2 DOUT2 GND_DO 5V 5V R48 2K U10 GND_DI 5V VCC_DO R47 330 U9 GND 5V R46 2K U8 GND_DI VCC_DO R45 330 2 C 5V R44 2K R43 330 DIN4 R42 2K R54 330 2 VCC_DO DI4_5V DIN3 2 R53 330 DI3_5V DIN2 R38 2k2 2 DI4_24V R52 330 R41 2K DI2_5V R37 2k2 DIN1 DI3_24V R40 2K R36 2k2 1 R51 330 DI2_24V DI1_5V R39 2K 5V 5V R35 2k2 2 5V DI1_24V GND DIN1 DIN_1 DIN2 DIN_2 DIN3 DIN_3 DIN_3 CNT1 ENCA1 CNT2 ENCB1 R18 56R GND_DI GND_DI DI1_24V DI1_5V 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 R17 56R 2 10 11 12 13 14 15 16 17 18 2 1 J3 nDIN_3 1 R13 10k R15 10k R14 10K 104 J4 DIGITAL OUTPUT 3V3 5V 5V C21 GND DO8 DOUT8 U22 U23 GND_DO GND_DO GND_DO RS232 5V_USB GND GND GND GND GND GND GND GND I/O I/O GND P1 Vcc DD+ GND PRTR5V0U2X R78 0R C29 104 GND C1+ C1VS- C2+ C2VS+ C38 104 USB 12 11 10 3V3 J6 STM_RX STM_TX TX_232 RX_232 C30 104 GND C39 104 DB9 Connector GND GND GND R77 0R 2 VCC VCC USB_DM USB_DP D19 GND 15 R76 470 C33 104 MAX3232CDR R1IN R1OUT T1OUT T1IN R2IN R2OUT T2OUT T2IN 16 R75 GND 1.5K C32 10u 16V Tantalum C31 104 C37 104 13 14 U26 ADJ/G S1 SMD FUSE 1.1A LM1117-3V3 OUT IN TAB C36 47u 16V Tantalum C35 104 1 5V_USB 1 C34 100u 50V 2 -DC J7 IN OUT GND +DC U24 F1 RX_232 TX_232 C28 104 3V3 GND IC1 3V3 5V_DC LM7805 USB 5V 5V_DC U25 C40 GND 104 GND HMI RS232 D D GND Title USB Card Size: D Number: A&C Research Lab HCMUT Revision: rev Date: 4/18/2018 Time: 12:15:39 AM Sheet of File: D:\hoc hanh\electronic\project\others\card_DLDKMT\CardUSBv2_2\CardUSB_v1.SchDoc ... CHUẨN BỊ THÍ NGHIỆM • Sinh viên đọc kỹ các yêu cầu bài thí nghiệm, xem sơ đồ mạch trước lên lớp C GIỚI THIỆU MƠ HÌNH THÍ NGHIỆM Kit thí nghiệm cho bố trí Hình Hình 1: Sơ đồ bố trí kit thí nghiệm. .. USBWrite(data_send); } III Bài thí nghiệm 3: Điều khiển vị trí động 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 DC P a g e | 34 Bài TN4: Lập... 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