for hank

Dependencies:   mbed-STM32F103C8T6_new

Revision:
6:a9cc2c424cf9
Parent:
4:864bb8bde75c
diff -r ced3875acdd5 -r a9cc2c424cf9 main.cpp
--- a/main.cpp	Sat Apr 18 13:04:49 2020 +0000
+++ b/main.cpp	Tue Apr 21 10:46:19 2020 +0000
@@ -5,6 +5,151 @@
 #include "stdio.h"
 #include "stdlib.h"
 
+DigitalOut MOTOA1(PB_4);
+DigitalOut MOTOB1(PB_5);
+
+DigitalOut MOTOA2(PB_8);
+DigitalOut MOTOB2(PB_9);
+
+AnalogIn SensorCurrent(PA_0);
+
+void motor1_move(uint8_t dir);
+void motor2_move(uint8_t dir);
+
+void system_init();
+
+uint8_t sensor_cnt,cal_cnt, cal_cnt2, cur_cnt, tar_cnt;
+//uint8_t dir;
+float sense_value;
+uint8_t ov_flag, init_flag, motor1_ready_flag, motor2_ready_flag, sensor_flag, ready_flag;
+uint8_t open_flag,close_flag;
+float m_val = 0;
+
+void sensor_capture_cb(void){
+    sensor_cnt++;
+    cur_cnt++;
+}
+
+void Power_thread(){/*detect current*/
+    char len[50];
+  while(true){
+    Thread::wait(500); /*unit millisec*/
+    sense_value = SensorCurrent.read();
+    if((sense_value>0.5)&&sensor_flag){
+        sprintf(len, "position:%d", position);
+        debug_uart.write("Power_thread: sense_value = %0.4f > 0.5 \r\n", sense_value);
+        ov_flag = 1;
+    }   
+  }
+}
+
+void Motor1_thread(void const *argument){/*detect current*/
+    while(true){
+        Thread::wait(300); /*unit millisec*/
+        if(!init_flag){
+            while(1){
+                if(motor2_ready_flag){break;}else{
+                    wait(1);debug_uart.printf("Motor1_thread: --------------------------------- \r\n");
+                }
+            }
+            motor2_ready_flag = 0;
+            sensor_cnt = 0;
+            motor1_move(MOVING_FORWARD);
+            wait(1);
+            sensor_flag = 1; /*enable current monitoring*/
+            while(!ov_flag){debug_uart.printf("Motor1_thread: waiting for ov_flag = 1 \r\n"); wait(1);}
+            motor1_move(STOP);
+            //debug_uart.printf("overcurrent detected \r\n");     
+            ov_flag = 0;
+            motor2_ready_flag = 0;
+            cal_cnt = sensor_cnt;
+            //debug_uart.printf("calibration done \r\n");     
+            debug_uart.printf("Motor1_thread: calibrated cnt is %d \r\n", cal_cnt);  
+            wait(1);
+            //debug_uart.printf("back to origianl position, motor1_ready_flag = 1\r\n"); 
+            motor1_ready_flag = 1;
+            while(1){
+                if(motor2_ready_flag){break;}else{
+                    wait(1);debug_uart.printf("Motor1_thread: --------------------------------- \r\n");
+                }
+            }
+            motor2_ready_flag = 0;
+            sensor_cnt = 0;
+            //sensor_flag = 0;
+            motor1_move(MOVING_BACKWARD);
+            debug_uart.printf("Motor1_thread: target position is %d\r\n", cal_cnt-10);
+            while(1){
+                //if((sensor_cnt>(cal_cnt-5))||ov_flag){break;}else{wait_ms(10);}
+                if(sensor_cnt>(cal_cnt-5)){break;}else{wait_ms(10);}
+            }
+            motor1_move(STOP);
+            #if 0
+            if(ov_flag){
+                debug_uart.printf("Motor1_thread: over current happens\r\n");
+                cal_cnt2 = sensor_cnt;
+                debug_uart.printf("Motor1_thread: cal_cnt2 = %d\r\n", cal_cnt2);
+                sensor_cnt = 0;
+                ov_flag = 0;            
+            }else{
+                debug_uart.printf("Motor1_thread: arrive position %d \r\n", sensor_cnt); 
+            }
+            #endif
+            debug_uart.printf("Motor1_thread: arrive position %d \r\n", sensor_cnt); 
+            wait(1);
+            motor1_ready_flag = 1;
+            debug_uart.printf("Motor1_thread: motor1 thread done\r\n");
+        }
+    }
+}
+
+void Motor2_thread(void const *argument){/*detect current*/
+    uint8_t sta1,sta2;
+    DigitalIn Stopper1(PA_13);
+    DigitalIn Stopper2(PA_15);
+
+    while(true){
+        Thread::wait(300); /*unit millisec*/
+        if(!init_flag){
+            wait(1);
+            debug_uart.printf("Motor2_thread: motor2 move up\r\n");    
+            motor2_move(MOVING_UP);
+            while(Stopper1){;}
+            motor2_move(STOP);
+            debug_uart.printf("Motor2_thread: Up stopper triggered \r\n");        
+            motor2_ready_flag = 1;
+            wait(1);
+            while(1){
+                if(motor1_ready_flag){break;}else{
+                    wait(1);debug_uart.printf("Motor2_thread: --------------------------------- \r\n"); 
+                }
+            }
+            motor1_ready_flag = 0;
+            motor2_move(MOVING_DOWN);
+            while(Stopper2){;}
+            motor2_move(STOP);
+            debug_uart.printf("Motor2_thread: Down stopper triggered \r\n");      
+            motor2_ready_flag = 1;
+            while(1){
+                if(motor1_ready_flag){break;}else{
+                    wait(1);debug_uart.printf("Motor2_thread: --------------------------------- \r\n"); 
+                }
+            }
+            debug_uart.printf("Motor2_thread: motor2 move to center\r\n"); 
+            ov_flag = 0;
+            ready_flag = 1;
+            motor2_move(MOVING_UP);
+            wait(2.3);
+            motor2_move(STOP);
+            ready_flag = 0;
+            debug_uart.printf("Motor2_thread: motor2 thread done\r\n");
+            debug_uart.printf("Main_thread: mean current is =%2.4f \r\n", m_val);  
+            init_flag = 1;          
+        }
+    }
+}
+
+
+
 DigitalOut led1(PC_13);
 
 //Serial pc(PB_10,PB_11);
@@ -160,5 +305,81 @@
         }
         wait(3);
     }
+    
+    
+       system_init();  
+    InterruptIn Hall1(PA_14);
+    //InterruptIn Hall2(PB_3);    
+    Hall1.fall(callback(sensor_capture_cb)); // Attach ISR to handle button press event
+    //Hall2.fall(callback(sensor_capture_cb)); // Attach ISR to handle button press event
+    debug_uart.printf("Hall sensor init done\r\n");
 
+    Thread thread1(Power_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); /*check the real-time current*/
+    //debug_uart.printf("thread1~~~~~~~~~~~~~~~~\r\n");
+    Thread thread2(Motor1_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); /*check the real-time current*/
+    //debug_uart.printf("thread2~~~~~~~~~~~~~~~~\r\n");
+    Thread thread3(Motor2_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); /*check the real-time current*/
+    //debug_uart.printf("thread3~~~~~~~~~~~~~~~~\r\n");
+    
+    debug_uart.printf("three threads created\r\n");
+
+    while(1){        
+        //debug_uart.printf("~~~~~~~~~~~~~~\r\n");
+        if(ready_flag){
+            m_val += sense_value;   
+            if(sense_value>0.5){
+                motor2_move(STOP);              
+            }
+        }
+        //sense_value = SensorCurrent.read(); 
+        //if(sense_value > 0.7){
+            //debug_uart.printf("Main_thread: WARNING WARNING WARNING current data is higher than 0.7\r\n");
+        //}
+    }
+
+}
+
+void motor1_move(uint8_t dir){/*main motor*/
+  if(dir==1){/*forward*/
+    MOTOA1 = 0;
+    MOTOB1 = 1;
+  }else if(dir==2){/*backward*/
+    MOTOA1 = 1;
+    MOTOB1 = 0;
+  }else{ /*stop*/
+    MOTOA1 = 0;
+    MOTOB1 = 0;
+  }
+}
+
+void motor2_move(uint8_t dir){/*assistant motor*/
+  if(dir==1){/*up*/
+    MOTOA2 = 0;
+    MOTOB2 = 1;
+  }else if(dir==2){/*down*/
+    MOTOA2 = 1;
+    MOTOB2 = 0;
+  }else{ /*stop*/
+    MOTOA2 = 0;
+    MOTOB2 = 0;
+  }
+}
+
+void system_init(){
+  debug_uart.baud(115200);
+  MOTOA1 = 0;
+  MOTOB1 = 0;
+  MOTOA2 = 0;
+  MOTOB2 = 0;
+  init_flag = 0;
+  motor1_ready_flag = 0;
+  motor2_ready_flag = 0;
+  sense_value = 0;
+  sensor_flag = 0;
+  ready_flag = 0; 
+  debug_uart.printf("*******************************\r\n");
+  debug_uart.printf("**********LAIWU TECH***********\r\n");  
+  debug_uart.printf("*******************************\r\n");
+  debug_uart.printf("system init done, wait 3 seconds to start\r\n");
+  wait(3);
 }
\ No newline at end of file