Dual Brushless Motor ESC, 10-62V, up to 50A per motor. Motors ganged or independent, multiple control input methods, cycle-by-cycle current limit, speed mode and torque mode control. Motors tiny to kW. Speed limit and other parameters easily set in firmware. As used in 'The Brushless Brutalist' locomotive - www.jons-workshop.com. See also Model Engineer magazine June-October 2019.
Dependencies: mbed BufferedSerial Servo PCT2075 FastPWM
Update 17th August 2020 Radio control inputs completed
Diff: 24LC64_eeprom.cpp
- Revision:
- 0:435bf84ce48a
- Child:
- 1:0fabe6fdb55b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/24LC64_eeprom.cpp Thu Mar 01 11:29:28 2018 +0000
@@ -0,0 +1,109 @@
+#include "mbed.h"
+//#include "rtos.h"
+#include "BufferedSerial.h"
+extern BufferedSerial pc;
+extern I2C i2c;
+ // Code for 24LC64 eeprom
+ // Code based on earlier work using memory FM24W256, also at i2c address 0xa0;
+
+const int addr_rd = 0xa1; // set bit 0 for read, clear bit 0 for write
+const int addr_wr = 0xa0; // set bit 0 for read, clear bit 0 for write
+const int ACK = 1;
+
+bool ack_poll () { // wait short while for any previous memory operation to complete
+ const int poll_tries = 40;
+ int poll_count = 0;
+ bool i2cfree = false;
+ while (poll_count++ < poll_tries && !i2cfree) {
+ i2c.start ();
+ if (i2c.write(addr_wr) == ACK)
+ i2cfree = true;
+ else
+// Thread::wait(1); // 1ms
+ wait (1);
+ }
+// pc.printf ("ack_poll, count = %d, i2cfree = %s\r\n", poll_count, i2cfree ? "true" : "false");
+ return i2cfree;
+}
+
+bool set_24LC64_internal_address (int start_addr) {
+ if (!ack_poll())
+ {
+ pc.printf ("Err in set_24LC64_internal_address, no ACK writing device address byte\r\n");
+ i2c.stop();
+ return false;
+ }
+ int err = 0;
+ if (i2c.write(start_addr >> 8) != ACK) err++;
+ if (i2c.write(start_addr & 0xff) != ACK) err++;
+ if (err) {
+ pc.printf ("In set_24LC64_internal_address, Believe Device present, failed in writing 2 mem addr bytes %d\r\n", err);
+ i2c.stop();
+ return false;
+ }
+ return true;
+}
+
+bool wr_24LC64 (int start_addr, char * source, int length) {
+ int err = 0;
+ if(length < 1 || length > 32) {
+ pc.printf ("Length out of range %d in wr_24LC64\r\n", length);
+ return false;
+ }
+ if (!set_24LC64_internal_address (start_addr)) {
+ pc.printf ("In wr_24LC64, Believe Device present, failed in writing 2 mem addr bytes %d\r\n", err);
+ return false;
+ }
+ while(length--)
+ err += ACK - i2c.write(*source++);
+ i2c.stop();
+ if (err) {
+ pc.printf ("in wr_24LC64, device thought good, mem addr write worked, failed writing string\r\n");
+ return false;
+ }
+ pc.printf ("In wr_24LC64 No Errors Found!\r\n");
+ return true;
+}
+
+bool rd_24LC64 (int start_addr, char * dest, int length) {
+ int acknak = ACK;
+ if(length < 1)
+ return false;
+ if (!set_24LC64_internal_address (start_addr)) {
+ pc.printf ("In rd_24LC64, failed to set_ramaddr\r\n");
+ return false;
+ }
+ i2c.start();
+ if (i2c.write(addr_rd) != ACK) {
+ pc.printf ("Errors in rd_24LC64 sending addr_rd\r\n");
+ return false;
+ }
+ while(length--) {
+ if(length == 0)
+ acknak = 0;
+ *dest++ = i2c.read(acknak);
+ }
+ i2c.stop();
+ return true;
+}
+
+int check_24LC64 () { // Call from near top of main() to init i2c bus
+ i2c.frequency(400000); // Speed 400000 max.
+ int last_found = 0, q; // Note address bits 3-1 to match addr pins on device
+ for (int i = 0; i < 255; i += 2) { // Search for devices at all possible i2c addresses
+ i2c.start();
+ q = i2c.write(i); // may return error code 2 when no start issued
+ switch (q) {
+ case ACK:
+ pc.printf ("I2C device found at 0x%x\r\n", i);
+ last_found = i;
+ case 2: // Device not seen at this address
+ break;
+ default:
+ pc.printf ("Unknown error %d in check_24LC64\r\n", q);
+ break;
+ }
+ }
+ i2c.stop();
+ return last_found;
+}