2018.07.26

Dependencies:   QEI mbed-rtos mbed

Revision:
0:b1136bf48c38
Child:
1:86705c6e0ab7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/4_main.cpp	Tue Feb 16 16:35:29 2016 +0000
@@ -0,0 +1,242 @@
+/**********************************************************
+ * Project: B2 (1F-1)
+ * Title:   CrExp B2 Motor Ctrl Main
+ * Target:  LPCXpresso824-Max
+ * Author:  zinsor
+ * Date(Latest update) 2015.12.21(Mon)
+ * --------------------------------------------------------
+ * Article
+ * 
+ * --------------------------------------------------------
+ *
+ *           LPCXpresso 824-MAX
+ *          +---------USB---------+
+ *          |                     |
+ *          |                     |
+ *          |                     | 
+ *          |                     |
+ *          |                     | SCL  P0_10 D15 -> IIC SCL
+ *          |   ##   ###     ##   | SDA  P0_11 D14 -> IIC SDA
+ *          |  #  # #   #   # #   |            AVDD
+ * N/A      |  #  #     #   # #   |            GND
+ * +3V3     |   ##     #   #  #   | SCK  P0_24 D13         
+ * NRST     |  #  #   #    #  #   | MISO P0_25 D12
+ * +3V3     |  #  #  #  # ######  | MOSI P0_26 D11 -> Resolver B
+ * +5V      |   ##  #####     #   | SSEL P0_15 D10 -> Resolver A
+ * GND      |                     |      P0_27 D9
+ * GND      |                     |      P0_13 D8 
+ * N/A      |                     |      P0_17 D7 
+ *          |                     |      P0_16 D6
+ * A0 P0_6  |                     | PWM  P0_28 D5
+ * A1 P0_14 |                     | PWM  P0_18 D4
+ * A2 P0_23 |                     | PWM  P0_12 D3
+ * A3 P0_22 |                     | PWM  P0_19 D2
+ * A4 P0_21 |                     | TX   P0_4  D1
+ * A5 P0_20 |                     | RX   P0_0  D0
+ *          +---------------------+
+ *
+ ***************************************/
+ 
+#include "mbed.h"
+#include "rtos.h"
+#include "QEI.h"
+#include "common.h"
+#include <math.h>
+
+// Hardware setting
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+QEI wheel( P0_15, P0_26, NC, ROTATE_PER_RESOLUTION, QEI::X2_ENCODING );
+/*
+  Dram r = 60mm
+  Cable fai = 3
+  
+  (60+3)*3.14 = 197.82mm ==> 2^12*4 = 4096 * 4 = 16384 pulse
+    1(mm) = 82.82(pulse)
+    0.01208(mm) = 1(pulse) 
+
+*/
+DigitalOut led1(LED1);  // Red
+DigitalOut led2(LED2);  // Green
+DigitalOut led3(LED3);  // Blue
+
+I2CSlave slave(P0_11, P0_10); //I2C SDA SCL
+
+int i2c_saddress = 0;
+
+void led_demo(){
+    int i;
+    for( i = 0; i < 20; i++ ) {
+        led1 = LED_ON;
+        led2 = LED_OFF;
+        led3 = LED_OFF;
+        wait_ms(20);
+        led1 = LED_OFF;
+        led2 = LED_OFF;
+        led3 = LED_OFF;
+        wait_ms(20);
+        led1 = LED_OFF;
+        led2 = LED_ON;
+        led3 = LED_OFF;
+        wait_ms(20);
+        led1 = LED_OFF;
+        led2 = LED_OFF;
+        led3 = LED_OFF;
+        wait_ms(20);
+        led1 = LED_OFF;
+        led2 = LED_OFF;
+        led3 = LED_ON;
+        wait_ms(20);
+        led1 = LED_OFF;
+        led2 = LED_OFF;
+        led3 = LED_OFF;
+        wait_ms(20);
+    }
+//    wait_ms(3000);
+}
+
+// ========================================================================
+//  Thread: Resolver Control Task
+// ========================================================================
+void ResolverCtrl_task(void const *) {
+
+
+}
+
+// ========================================================================
+//  Thread: Main Controller Interface Task
+//      Get Command from Main controller and do the task.
+// ========================================================================
+void MainCtrl_Interface_task(void const *) {
+    
+    char buf[10];   // command buffer
+    char msg[] = "C000000";
+    char res_msg[] = "Slave!";
+    char res_msg2[] = "Bravo!";
+    
+    int flg_readCurrent = 0;
+    
+    int pulse;
+    int16_t distance;
+
+    uint16_t    dram_diameter;
+    uint16_t    ccable_diameter;
+    uint8_t     rresolution; 
+    
+    int tmp;
+    
+    slave.address(i2c_saddress);
+    
+    DEBUG_PRINT_L1("*** Start Resolver thread ***\n");
+     
+    /* 
+     * I2C Access 
+     */
+    while(1) {
+    //    DEBUG_PRINT_L1(".");        
+        int i = slave.receive();
+        slave.read(buf, NumberOfI2CCommand);
+    //    DEBUG_PRINT_L1("?");        
+    //    DEBUG_PRINT_L1("Slave Received\r\n");
+        switch (i) {
+            case I2CSlave::NoData:
+            //    DEBUG_PRINT_L1("the slave has not been addressed\r\n");
+            //    read_motor_current(2);
+                break;
+            case I2CSlave::ReadAddressed:
+                /* Master is reading winch current position here */
+             //   DEBUG_PRINT_L1("the master has requested a read from this slave\r\n");
+                pulse = wheel.getPulses();
+
+                distance = (int16_t)( pulse * ( (double)( ((dram_diameter+ccable_diameter)/100) * PAI / (pow(2.0, (double)rresolution)*4 ) ) ) );
+            //    distance = (int16_t)( pulse * ( REAL_THREAD_DIAMETER * PAI / ROTATION_PULSE_PER_1ROUND ));
+
+                DEBUG_PRINT_L1("Bd4> PULSE: %07d, ", pulse);
+                DEBUG_PRINT_L1("DISTANCE: %04d (mm)", distance);
+                res_msg2[0] = distance & 0xFF;
+                res_msg2[1] = (distance >> 8)&0xFF;
+                slave.write(res_msg2, 2); // Includes null char
+                tmp = (res_msg2[1] < 8)&0xFF00 | res_msg2[0]&0xFF;
+                DEBUG_PRINT_L1("\tSend data : %04d(%02x,%02x)\n", tmp, res_msg2[1], res_msg2[0]);
+                break;
+            case I2CSlave::WriteGeneral:
+                DEBUG_PRINT_L1("Bd4> the master is writing to all slave\r\n"); 
+                slave.read(buf, NumberOfI2CCommand);
+                DEBUG_PRINT_L1("Bd4> Read G: %s\r\n", buf);
+                break;
+            case I2CSlave::WriteAddressed:
+                /* ******************************************* */
+                /* Add setting data set operation in this area */
+                /* ******************************************* */
+                
+                
+                if( buf[1] == 'Z'){
+                    wheel.reset();
+                }
+                else{
+                    dram_diameter = ( buf[2] << 8 ); 
+                    dram_diameter |= buf[3];
+                    ccable_diameter = ( buf[4] << 8 ); 
+                    ccable_diameter |= buf[5];
+                    rresolution = buf[6];
+                    
+                    DEBUG_PRINT_L1("Bd4> ===========================================\n");
+                    DEBUG_PRINT_L1("Bd4> Dram Diameter           : %d\t(mm)\n", dram_diameter/100);
+                    DEBUG_PRINT_L1("Bd4> CCable Diameter         : %d\t(mm)\n", ccable_diameter/100);
+                    DEBUG_PRINT_L1("Bd4> Resolver Resolution     : %d\t(bit)\n", rresolution);
+                    DEBUG_PRINT_L1("Bd4> -------------------------------------------\n", rresolution);
+                    DEBUG_PRINT_L1("Bd4> Real Diameter           : %d\t(mm)\n", (dram_diameter+ccable_diameter)/100);
+                    DEBUG_PRINT_L1("Bd4> Rotation Pulse / 1round : %d\t(pulse)\n", (int)(pow(2.0, (double)rresolution)*4));
+                    DEBUG_PRINT_L1("Bd4> Distance / 1pulse       : %lf\t(mm)\n",  (double)( ((dram_diameter+ccable_diameter)/100) * PAI / (pow(2.0, (double)rresolution)*4 ) ) );                   
+                    DEBUG_PRINT_L1("Bd4> ===========================================\n");
+                    
+                    pulse = wheel.getPulses();
+                    DEBUG_PRINT_L1("Bd4> PULSE: %07d, ", pulse);
+                //    DEBUG_PRINT_L1("Bd4> >DISTANCE: %04d (mm)\n", (int)( pulse * ( REAL_THREAD_DIAMETER * PAI / ROTATION_PULSE_PER_1ROUND )));
+                    DEBUG_PRINT_L1("DISTANCE: %04d (mm)\n", (int)( pulse * ( (double)( ((dram_diameter+ccable_diameter)/100) * PAI / (pow(2.0, (double)rresolution)*4 ) ) ) ) );
+                    DEBUG_PRINT_L1("Bd4> ---------------------------------------\n");
+                }
+                break;
+        }
+        Thread::wait(1);
+    }
+}
+// ========================================================================
+//  Main Function
+// ========================================================================
+int main() {
+    int32_t counter = 0;
+    
+    pc.baud(115200);
+    
+    i2c_saddress = Target_IIC_ADDR;     // defined at header
+
+    DEBUG_PRINT_L0("> Board type: Resolver Counter controller(0x%02x)\r\n",i2c_saddress );
+
+    i2c_saddress <<= 1;
+    
+    led_demo();
+        
+    DEBUG_PRINT_L0("\r\n");
+    DEBUG_PRINT_L0("Bd4> +--------------------------------------\r\n");
+    DEBUG_PRINT_L0("Bd4> | B2 CrExp Resolver Pulse Counter Main \r\n");
+    DEBUG_PRINT_L0("Bd4> | Letest update: %s\r\n", LatestUpDate);
+    DEBUG_PRINT_L0("Bd4> | Program Revision: %s\r\n", ProgramRevision);
+    DEBUG_PRINT_L0("Bd4> | Author: %s\r\n", Author);
+    DEBUG_PRINT_L0("Bd4> | Copyright(C) 2015 %s Allright Reserved\r\n", Company);
+    DEBUG_PRINT_L0("Bd4> +--------------------------------------\r\n");
+    
+    Thread resolverControlTask1(MainCtrl_Interface_task, NULL, osPriorityNormal, 128 * 4);   
+    wheel.reset();
+   
+    while(1){
+
+        counter++;
+        if( counter >= 50 ){
+            led3 = !led3;   // Blue
+            counter = 0;
+        }
+        Thread::wait(5);
+    }
+}