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.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
OTBsolar
Date:
Fri Feb 11 14:57:24 2011 +0000
Child:
1:3759c5f6cf76
Commit message:
BETA

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Feb 11 14:57:24 2011 +0000
@@ -0,0 +1,167 @@
+#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;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Feb 11 14:57:24 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9a9732ce53a1