Professional Documents
Culture Documents
TN DLDKMT 4
TN DLDKMT 4
TN DLDKMT 4
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.
Page |4
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài
- Click vào biểu tượng trên thanh công cụ, một cửa sổ hiện ra
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
Page |7
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài
- 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
Page |9
Bài TN4: Lập trình card USB Biên soạn: TS. Nguyễn Trọng Tài
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
- 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();
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
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);
}
}
}
}
}
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;
}
#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
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
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 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;
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();
}
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);
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
}
myUsbDevice = null;
UsbDevice.Exit();
}
}
#endregion USB EXIT
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
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
}
else
{
e.Cancel = true;
}
}
}
}
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
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
- 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:
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;
// 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
- Để 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
- 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;
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
- 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.
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 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
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
- 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
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
P a g e | 37
1 2 3 4 5 6 7 8
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
GND_DI
5V
R13
C21 10k NOTE
1
1
2 1 J3
GND nDIN_3
3 2
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
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
5V 5V 5V 5V
5V VCC_DO 5V VCC_DO 5V VCC_DO 5V VCC_DO
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
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
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
IC1 MAX3232CDR
2
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
D- 5
2
Tantalum D+ 3V3
15
16
GND GND GND GND GND GND GND GND GND GND
1
C40
GND 104
2
1 2 3 4 5 6 7 8