You are on page 1of 13

ĐẠI HỌC BÁCH KHOA – ĐHQG-HCM

KHOA CƠ KHÍ

BỘ MÔN CƠ ĐIỆN TỬ

THÍ NGHIỆM VI ĐIỀU KHIỂN

BUỔI 4: TRUYỀN THÔNG CAN


L07 --- NHÓM A --- HK222

Giảng viên hướng dẫn: ThS. LƯƠNG THANH NHẬT

Sinh viên thực hiện Mã số sinh viên

Hồ Đình Bách 2010145

Phạm Hoàng Khanh 2011381

Nguyễn Văn Vũ Lân 2013606

Bùi Sơn Nhật Minh 2011605

Lê Nhựt Trường 2014911

Thành phố Hồ Chí Minh - 2023


CƠ SỞ LÝ THUYẾT
I. Kết nối phần cứng
Board UMB1P.0-15376 V 1.0
Động cơ DC giảm tốc độ
Module điều khiển động cơ DC L298N

Hình 1 – Module giao tiếp CAN MCP2515

Hình 2 – Sơ đồ nguyên lý
Hình 3 – Sơ đồ giao tiếp phần cứng

Hình 4 – Kết nối module CAN với board MCU


Kết nối các node với nhau bằng 2 dây theo mô hình CAN_H <–> CAN_H,
CAN_L <–> CAN_L . Mỗi board module CAN cung cấp 2 cặp cổng CAN_H và CAN_L.

Hình 5 – Kết nối mạng 2 node CAN


II. Hướng dẫn lập trình

Hình 6 – Các module sử dụng trong dự án điều khiển động cơ

Hình 7 – Cấu hình Pin Manager Gird View của dự án

Hình 8 – Cấu hình SPI Module của dự án


Hình 9 – Cấu hình EUSART Module của dự án

Hình 10 – Cấu hình Interrupt module của dự án


Hình 11 – Cấu hình I/O của dự án
THÍ NGHIỆM VÀ KẾT QUẢ
Bài 1. Giao tiếp CAN giữa 2 kit vi điều khiển
Lần lượt nhấn nút 1, 2, 3 ở kit số 1 thì LED 1, 2, 3 ở kit số 2 sáng tương ứng.
Code
#include "mcc_generated_files/mcc.h"
#include <string.h>
#define RESET_INS 0b11000000
#define READ 0b00000011
#define WRITE 0b00000010
#define READ_STATUS 0b10100000
#define RX_STATUS 0b10110000
#define BIT_MODIFY 0b00000101
#define READ_RX_BUFFER_SID0 0b10010000
#define READ_RX_BUFFER_DT0 0b10010010
#define READ_RX_BUFFER_DT1 0b10010110
#define READ_RX_BUFFER_SID1 0b10010100
#define LOAD_TX_BUFFER_SID0 0b01000000
#define LOAD_TX_BUFFER_DT0 0b01000001
#define LOAD_TX_BUFFER_SID1 0b01000010
#define LOAD_TX_BUFFER_DT1 0b01000011
#define LOAD_TX_BUFFER_SID2 0b01000100
#define LOAD_TX_BUFFER_DT2 0b01000101
#define REQUEST_TO_SEND_TXBUFF0 0b10000001
#define REQUEST_TO_SEND_TXBUFF1 0b10000010
#define REQUEST_TO_SEND_TXBUFF2 0b10000100
#define BIT_MODIFY 0b00000101
uint8_t press = 0;
uint8_t receive = 0;
uint8_t sendframe1[8] = "abcdefgh";
uint8_t sendframe2[8] = "ijklmnop";
uint8_t sendframe3[8] = "qrstuvwx";
uint8_t receiveframe[9]={0,0,0,0,0,0,0,0,0};
volatile uint8_t receive_flag = 0;
uint8_t receive_pre = 0;

void Reset_sensor (void)


{
SPI1_Open(SPI1_DEFAULT);
CS_SetLow();
SPI1_ExchangeByte(RESET_INS);
CS_SetHigh();
SPI1_Close();
}

void Set_sensor (uint8_t reg, uint8_t data)


{
SPI1_Open(SPI1_DEFAULT);
CS_SetLow();
SPI1_ExchangeByte(WRITE);
SPI1_ExchangeByte(reg);
SPI1_ExchangeByte(data);
CS_SetHigh();
SPI1_Close();
}

void Read_sensor (uint8_t reg, uint8_t *data)


{
SPI1_Open(SPI1_DEFAULT);
CS_SetLow();
SPI1_ExchangeByte(READ);
SPI1_ExchangeByte(reg);
*data = SPI1_ExchangeByte(0x00);
CS_SetHigh();
SPI1_Close();
}

void Bit_Modify(uint8_t Address, uint8_t mask, uint8_t dataset)


{
SPI1_Open(SPI1_DEFAULT);
CS_SetLow();
SPI1_ExchangeByte(BIT_MODIFY);
SPI1_ExchangeByte(Address);
SPI1_ExchangeByte(mask);
SPI1_ExchangeByte(dataset);
CS_SetHigh();
SPI1_Close();
}

void REQUEST_TO_SEND_BUFF (uint8_t buff)


{
uint8_t bufftemp;
switch (buff)
{
case 0:
bufftemp = REQUEST_TO_SEND_TXBUFF0;
break;
case 1:
bufftemp = REQUEST_TO_SEND_TXBUFF1;
break;
case 2:
bufftemp = REQUEST_TO_SEND_TXBUFF2;
break;
default:
break;
}
SPI1_Open(SPI1_DEFAULT);
CS_SetLow();
SPI1_ExchangeByte(bufftemp);
CS_SetHigh();
SPI1_Close();
}

void Send_messenger (uint8_t *data, uint8_t buff, uint8_t length)


{
Set_sensor(0x30, 0x03); // Clear TXREQ
Set_sensor(0x35, length);
for(uint8_t i = 0 ; i<length ;i++)
{
Set_sensor(0x36 + i,*data);
data++;
}
REQUEST_TO_SEND_BUFF(buff);
}

void Sensor_Init (void)


{
// Reset_sensor();
Set_sensor(0x30, 0x00); // Clear TXREQ
Set_sensor(0x31, 0xAA); // Use ID TX type Standard
Set_sensor(0x32, 0xA0); // ID : 0b10101010101
Set_sensor(0x35, 0x08); // Transmitt data frame, data lenght 8 byte
for(uint8_t i=0;i < 8;i++)
{
Set_sensor(0x36 + i,i);
}
Set_sensor(0x00, 0xAA); // Use ID RX type Standard
Set_sensor(0x01, 0xA0); // ID : 0b10101010101
Set_sensor(0x20, 0xFF); // Use MASK full bits
Set_sensor(0x21, 0xE0);
Set_sensor(0x2B, 0x01); // Use Interrupt Buffer RX0
Set_sensor(0x2A, 0x0F); // Tq = 0.000004s
Set_sensor(0x0F, 0x07); // Sets Normal Operation mode
}

void receive_led(void)
{
LED3_Toggle();
receive_flag = ~receive_flag;
}

void main(void)
{
SYSTEM_Initialize();
Reset_sensor();
Sensor_Init ();
cSTBY_SetLow();
IOCCF7_SetInterruptHandler(receive_led);
printf("hello\n");
while (1)
{
CLRWDT();
if(receive_flag != receive_pre)
{
receive_pre = receive_flag;
uint8_t DLC = 0;
Bit_Modify( 0x2C, 0b00000001, 0x00);
Read_sensor(0x65,&DLC);
for(uint8_t i=0; i < (DLC&0x0F);i++)
{
Read_sensor(0x66 + i, &receiveframe[i]);
}
}
if(SW1_GetValue()==0 && press == 0)
{
Send_messenger(sendframe1,0,8);
press = 1;
}
else if(SW2_GetValue()==0 && press == 0)
{
Send_messenger(sendframe2,0,8);
press = 1;
}
else if (SW3_GetValue()==0 && press == 0)
{
Send_messenger(sendframe3,0,8);
press = 1;
}
else if(SW1_GetValue()== 1 && SW2_GetValue() == 1 && SW3_GetValue() == 1)
{
press=0;
}
if(strcmp((char*)receiveframe,"abcdefgh")==0)
{
LED1_SetHigh();
LED2_SetLow();
LED3_SetLow();
}
else if (strcmp((char*)receiveframe,"ijklmnop")==0)
{
LED1_SetLow();
LED2_SetHigh();
LED3_SetLow();
}
else if (strcmp((char*)receiveframe,"qrstuvwx")==0)
{
LED1_SetLow();
LED2_SetLow();
LED3_SetHigh();
}
}
}

You might also like