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@0:af731d8a8d2c, 2011-02-11 (annotated)
- Committer:
- OTBsolar
- Date:
- Fri Feb 11 14:57:24 2011 +0000
- Revision:
- 0:af731d8a8d2c
- Child:
- 1:3759c5f6cf76
BETA
Who changed what in which revision?
User | Revision | Line number | New 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 | } |