With this program you can configure and run a CAN compatible (also LSS protocol compatible) motor through the mbed\'s CANbus. Further more it gives a basic template that lets you create your own CAN messages. I\'ve implemented a configuration and a running example that the program runs through. Also there\'s 2 kinds of loops it can go into after it\'s ran through it\'s configuration and/or speed setting. It can continuously ask for the motor\'s status (node guarding kind of thing) OR it can continuously ask for the motor\'s position. Make sure you have a if, (elsif), else structure so the counter doesn\'t run out of control. I\'ve tried to put as many comments in as I could. I hope it helps you in understanding the basics of CAN and running devices. I\'m new to it myself, so any critisism is welcome. Enjoy.
main.cpp
- Committer:
- OTBsolar
- Date:
- 2011-02-11
- Revision:
- 0:af731d8a8d2c
- Child:
- 1:3759c5f6cf76
File content as of revision 0:af731d8a8d2c:
#include "mbed.h" #include "CAN.h" Ticker ticker; DigitalOut led1(LED1); DigitalOut led2(LED2); CAN can1(p9, p10); // rd, td CAN can2(p30, p29); int counter = 0; char data[8]; CANMessage msg; void send() { if(counter==0) { //--------Global Start nodes data[0] = (char)(0x01); // NMT Start RemoteNode data[1] = (char)(0x00); // Global data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(0000,data,2))) { printf("Startup sent \n"); } led1 = !led1; counter ++; } else if(counter==1) { //--------LSS Configure mode data[0] = (char)(0x04); // LSS Set Mode data[1] = (char)(0x01); // Mode Configure data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,2))) { printf("LSS Config mode sent \n"); } led1 = !led1; counter ++; } else if(counter==2) { //--------LSS Set Node_ID data[0] = (char)(0x11); // LSS Set Node_ID data[1] = (char)(0x01); // to Node_ID: 01 data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,2))) { printf("LSS Set Node_ID to 0x01 sent \n"); } led1 = !led1; counter ++; } else if(counter==3) { //--------LSS Save Config data[0] = (char)(0x17); // LSS Save Config data[1] = (char)(0x00); data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,1))) { printf("LSS Save Config sent \n"); } led1 = !led1; counter ++; } else if(counter==4) { //--------LSS Set Baudrate data[0] = (char)(0x13); // LSS Set Baudrate data[1] = (char)(0x00); // data[2] = (char)(0x02); // Baudrate index (500kb/s) data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,3))) { printf("LSS Config mode sent \n"); } led1 = !led1; counter ++; } /*else if(counter==5) ( //--------LSS Set Bit timing data[0] = (char)(0x15); // LSS Set Bit timing data[1] = (char)(0x00); // Mode Configure data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,2))) { printf("LSS Config mode sent \n"); } led1 = !led1; counter ++; }*/ else if(counter==5) { //--------LSS Operation Mode data[0] = (char)(0x04); // LSS Set Mode data[1] = (char)(0x00); // Mode operation data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,2))) { printf("LSS Operation mode sent \n"); } led1 = !led1; counter ++; } else { //--------Inquire IDNode_ID data[0] = (char)(0x5E); data[1] = (char)(0x00); data[2] = (char)(0x00); data[3] = (char)(0x00); data[4] = (char)(0x00); data[5] = (char)(0x00); data[6] = (char)(0x00); data[7] = (char)(0x00); if(can1.write(CANMessage(2021,data,1))) { printf("Status check sent \n"); } led1 = !led1; counter = 10; } } int main() { can2.frequency(500000); //500kbit/s can1.frequency(500000); ticker.attach(&send, 1); //Send every second while(1) { if(can2.read(msg)) { printf("Message read with ID: %d\n", msg.id); printf("Data: %x", msg.data[0]); printf(" %x", msg.data[1]); printf(" %x", msg.data[2]); printf(" %x", msg.data[3]); printf(" %x", msg.data[4]); printf(" %x", msg.data[5]); printf(" %x", msg.data[6]); printf(" %x\n", msg.data[7]); printf("Length: %d", msg.len); printf(", Type: %d", msg.type); printf(", Format: %d\n\n", msg.format); led2 = !led2; } } }