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

Committer:
OTBsolar
Date:
Fri Feb 11 14:57:24 2011 +0000
Revision:
0:af731d8a8d2c
Child:
1:3759c5f6cf76
BETA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
OTBsolar 0:af731d8a8d2c 1 #include "mbed.h"
OTBsolar 0:af731d8a8d2c 2 #include "CAN.h"
OTBsolar 0:af731d8a8d2c 3
OTBsolar 0:af731d8a8d2c 4 Ticker ticker;
OTBsolar 0:af731d8a8d2c 5 DigitalOut led1(LED1);
OTBsolar 0:af731d8a8d2c 6 DigitalOut led2(LED2);
OTBsolar 0:af731d8a8d2c 7 CAN can1(p9, p10); // rd, td
OTBsolar 0:af731d8a8d2c 8 CAN can2(p30, p29);
OTBsolar 0:af731d8a8d2c 9
OTBsolar 0:af731d8a8d2c 10 int counter = 0;
OTBsolar 0:af731d8a8d2c 11 char data[8];
OTBsolar 0:af731d8a8d2c 12 CANMessage msg;
OTBsolar 0:af731d8a8d2c 13
OTBsolar 0:af731d8a8d2c 14
OTBsolar 0:af731d8a8d2c 15 void send() {
OTBsolar 0:af731d8a8d2c 16 if(counter==0) {
OTBsolar 0:af731d8a8d2c 17 //--------Global Start nodes
OTBsolar 0:af731d8a8d2c 18 data[0] = (char)(0x01); // NMT Start RemoteNode
OTBsolar 0:af731d8a8d2c 19 data[1] = (char)(0x00); // Global
OTBsolar 0:af731d8a8d2c 20 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 21 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 22 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 23 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 24 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 25 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 26 if(can1.write(CANMessage(0000,data,2))) {
OTBsolar 0:af731d8a8d2c 27 printf("Startup sent \n");
OTBsolar 0:af731d8a8d2c 28 }
OTBsolar 0:af731d8a8d2c 29 led1 = !led1;
OTBsolar 0:af731d8a8d2c 30 counter ++;
OTBsolar 0:af731d8a8d2c 31 }
OTBsolar 0:af731d8a8d2c 32 else if(counter==1) {
OTBsolar 0:af731d8a8d2c 33 //--------LSS Configure mode
OTBsolar 0:af731d8a8d2c 34 data[0] = (char)(0x04); // LSS Set Mode
OTBsolar 0:af731d8a8d2c 35 data[1] = (char)(0x01); // Mode Configure
OTBsolar 0:af731d8a8d2c 36 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 37 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 38 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 39 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 40 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 41 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 42 if(can1.write(CANMessage(2021,data,2))) {
OTBsolar 0:af731d8a8d2c 43 printf("LSS Config mode sent \n");
OTBsolar 0:af731d8a8d2c 44 }
OTBsolar 0:af731d8a8d2c 45 led1 = !led1;
OTBsolar 0:af731d8a8d2c 46 counter ++;
OTBsolar 0:af731d8a8d2c 47 }
OTBsolar 0:af731d8a8d2c 48 else if(counter==2) {
OTBsolar 0:af731d8a8d2c 49 //--------LSS Set Node_ID
OTBsolar 0:af731d8a8d2c 50 data[0] = (char)(0x11); // LSS Set Node_ID
OTBsolar 0:af731d8a8d2c 51 data[1] = (char)(0x01); // to Node_ID: 01
OTBsolar 0:af731d8a8d2c 52 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 53 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 54 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 55 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 56 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 57 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 58 if(can1.write(CANMessage(2021,data,2))) {
OTBsolar 0:af731d8a8d2c 59 printf("LSS Set Node_ID to 0x01 sent \n");
OTBsolar 0:af731d8a8d2c 60 }
OTBsolar 0:af731d8a8d2c 61 led1 = !led1;
OTBsolar 0:af731d8a8d2c 62 counter ++;
OTBsolar 0:af731d8a8d2c 63 }
OTBsolar 0:af731d8a8d2c 64 else if(counter==3) {
OTBsolar 0:af731d8a8d2c 65 //--------LSS Save Config
OTBsolar 0:af731d8a8d2c 66 data[0] = (char)(0x17); // LSS Save Config
OTBsolar 0:af731d8a8d2c 67 data[1] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 68 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 69 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 70 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 71 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 72 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 73 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 74 if(can1.write(CANMessage(2021,data,1))) {
OTBsolar 0:af731d8a8d2c 75 printf("LSS Save Config sent \n");
OTBsolar 0:af731d8a8d2c 76 }
OTBsolar 0:af731d8a8d2c 77 led1 = !led1;
OTBsolar 0:af731d8a8d2c 78 counter ++;
OTBsolar 0:af731d8a8d2c 79 }
OTBsolar 0:af731d8a8d2c 80 else if(counter==4) {
OTBsolar 0:af731d8a8d2c 81 //--------LSS Set Baudrate
OTBsolar 0:af731d8a8d2c 82 data[0] = (char)(0x13); // LSS Set Baudrate
OTBsolar 0:af731d8a8d2c 83 data[1] = (char)(0x00); //
OTBsolar 0:af731d8a8d2c 84 data[2] = (char)(0x02); // Baudrate index (500kb/s)
OTBsolar 0:af731d8a8d2c 85 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 86 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 87 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 88 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 89 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 90 if(can1.write(CANMessage(2021,data,3))) {
OTBsolar 0:af731d8a8d2c 91 printf("LSS Config mode sent \n");
OTBsolar 0:af731d8a8d2c 92 }
OTBsolar 0:af731d8a8d2c 93 led1 = !led1;
OTBsolar 0:af731d8a8d2c 94 counter ++;
OTBsolar 0:af731d8a8d2c 95 }
OTBsolar 0:af731d8a8d2c 96 /*else if(counter==5) (
OTBsolar 0:af731d8a8d2c 97 //--------LSS Set Bit timing
OTBsolar 0:af731d8a8d2c 98 data[0] = (char)(0x15); // LSS Set Bit timing
OTBsolar 0:af731d8a8d2c 99 data[1] = (char)(0x00); // Mode Configure
OTBsolar 0:af731d8a8d2c 100 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 101 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 102 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 103 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 104 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 105 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 106 if(can1.write(CANMessage(2021,data,2))) {
OTBsolar 0:af731d8a8d2c 107 printf("LSS Config mode sent \n");
OTBsolar 0:af731d8a8d2c 108 }
OTBsolar 0:af731d8a8d2c 109 led1 = !led1;
OTBsolar 0:af731d8a8d2c 110 counter ++;
OTBsolar 0:af731d8a8d2c 111 }*/
OTBsolar 0:af731d8a8d2c 112 else if(counter==5) {
OTBsolar 0:af731d8a8d2c 113 //--------LSS Operation Mode
OTBsolar 0:af731d8a8d2c 114 data[0] = (char)(0x04); // LSS Set Mode
OTBsolar 0:af731d8a8d2c 115 data[1] = (char)(0x00); // Mode operation
OTBsolar 0:af731d8a8d2c 116 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 117 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 118 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 119 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 120 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 121 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 122 if(can1.write(CANMessage(2021,data,2))) {
OTBsolar 0:af731d8a8d2c 123 printf("LSS Operation mode sent \n");
OTBsolar 0:af731d8a8d2c 124 }
OTBsolar 0:af731d8a8d2c 125 led1 = !led1;
OTBsolar 0:af731d8a8d2c 126 counter ++;
OTBsolar 0:af731d8a8d2c 127 }
OTBsolar 0:af731d8a8d2c 128 else {
OTBsolar 0:af731d8a8d2c 129 //--------Inquire IDNode_ID
OTBsolar 0:af731d8a8d2c 130 data[0] = (char)(0x5E);
OTBsolar 0:af731d8a8d2c 131 data[1] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 132 data[2] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 133 data[3] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 134 data[4] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 135 data[5] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 136 data[6] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 137 data[7] = (char)(0x00);
OTBsolar 0:af731d8a8d2c 138 if(can1.write(CANMessage(2021,data,1))) {
OTBsolar 0:af731d8a8d2c 139 printf("Status check sent \n");
OTBsolar 0:af731d8a8d2c 140 }
OTBsolar 0:af731d8a8d2c 141 led1 = !led1;
OTBsolar 0:af731d8a8d2c 142 counter = 10;
OTBsolar 0:af731d8a8d2c 143 }
OTBsolar 0:af731d8a8d2c 144 }
OTBsolar 0:af731d8a8d2c 145
OTBsolar 0:af731d8a8d2c 146 int main() {
OTBsolar 0:af731d8a8d2c 147 can2.frequency(500000); //500kbit/s
OTBsolar 0:af731d8a8d2c 148 can1.frequency(500000);
OTBsolar 0:af731d8a8d2c 149 ticker.attach(&send, 1); //Send every second
OTBsolar 0:af731d8a8d2c 150 while(1) {
OTBsolar 0:af731d8a8d2c 151 if(can2.read(msg)) {
OTBsolar 0:af731d8a8d2c 152 printf("Message read with ID: %d\n", msg.id);
OTBsolar 0:af731d8a8d2c 153 printf("Data: %x", msg.data[0]);
OTBsolar 0:af731d8a8d2c 154 printf(" %x", msg.data[1]);
OTBsolar 0:af731d8a8d2c 155 printf(" %x", msg.data[2]);
OTBsolar 0:af731d8a8d2c 156 printf(" %x", msg.data[3]);
OTBsolar 0:af731d8a8d2c 157 printf(" %x", msg.data[4]);
OTBsolar 0:af731d8a8d2c 158 printf(" %x", msg.data[5]);
OTBsolar 0:af731d8a8d2c 159 printf(" %x", msg.data[6]);
OTBsolar 0:af731d8a8d2c 160 printf(" %x\n", msg.data[7]);
OTBsolar 0:af731d8a8d2c 161 printf("Length: %d", msg.len);
OTBsolar 0:af731d8a8d2c 162 printf(", Type: %d", msg.type);
OTBsolar 0:af731d8a8d2c 163 printf(", Format: %d\n\n", msg.format);
OTBsolar 0:af731d8a8d2c 164 led2 = !led2;
OTBsolar 0:af731d8a8d2c 165 }
OTBsolar 0:af731d8a8d2c 166 }
OTBsolar 0:af731d8a8d2c 167 }