opener-6
Dependencies: TextLCD_HelloWorld2 TextLCD mbed
Fork of TextLCD_HelloWorld2 by
main.cpp@5:93f48c84e645, 2018-04-16 (annotated)
- Committer:
- Martin1000
- Date:
- Mon Apr 16 12:09:03 2018 +0000
- Revision:
- 5:93f48c84e645
- Parent:
- 4:a3e4bb2053cb
door 6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Martin1000 | 5:93f48c84e645 | 1 | |
Martin1000 | 5:93f48c84e645 | 2 | // DOOR OPENER version 1.4 (Opener-6) |
Martin1000 | 5:93f48c84e645 | 3 | // |
Martin1000 | 5:93f48c84e645 | 4 | // |
Martin1000 | 5:93f48c84e645 | 5 | // program and related hardware serve to test the "door opener" |
Martin1000 | 5:93f48c84e645 | 6 | // general function: |
Martin1000 | 5:93f48c84e645 | 7 | // |
Martin1000 | 5:93f48c84e645 | 8 | // open and close via buttons or automatically |
Martin1000 | 5:93f48c84e645 | 9 | // motor stops when endposition is reached (or current to high) |
Martin1000 | 5:93f48c84e645 | 10 | // duty cycle, ramp- time and pause time for automatic |
Martin1000 | 5:93f48c84e645 | 11 | // are adjustable via potentiometers |
Martin1000 | 5:93f48c84e645 | 12 | // |
Martin1000 | 5:93f48c84e645 | 13 | // current, cycles, ramp- time, pause- time will be displayed |
Martin1000 | 5:93f48c84e645 | 14 | // |
Martin1000 | 5:93f48c84e645 | 15 | // |
Martin1000 | 5:93f48c84e645 | 16 | // |
Martin1000 | 5:93f48c84e645 | 17 | // include the following functions: |
Martin1000 | 5:93f48c84e645 | 18 | // read the digital inputs button open |
Martin1000 | 5:93f48c84e645 | 19 | // button close |
Martin1000 | 5:93f48c84e645 | 20 | // proximity switch open |
Martin1000 | 5:93f48c84e645 | 21 | // proximity switch close |
Martin1000 | 5:93f48c84e645 | 22 | // auto_on |
Martin1000 | 5:93f48c84e645 | 23 | // |
Martin1000 | 5:93f48c84e645 | 24 | // read the analog inputs motor_current |
Martin1000 | 5:93f48c84e645 | 25 | // duty_cycle 10..100% |
Martin1000 | 5:93f48c84e645 | 26 | // ramp_time 0.1...9.9 sec |
Martin1000 | 5:93f48c84e645 | 27 | // pause_time 1.0..99.9 sec |
Martin1000 | 5:93f48c84e645 | 28 | // |
Martin1000 | 5:93f48c84e645 | 29 | // set the outputs myled |
Martin1000 | 5:93f48c84e645 | 30 | // out_status_led |
Martin1000 | 5:93f48c84e645 | 31 | // out_led_open |
Martin1000 | 5:93f48c84e645 | 32 | // out_led_close |
Martin1000 | 5:93f48c84e645 | 33 | // pwm_close |
Martin1000 | 5:93f48c84e645 | 34 | // pwm_open |
Martin1000 | 5:93f48c84e645 | 35 | // motor enable |
Martin1000 | 5:93f48c84e645 | 36 | // --------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 37 | // first date : 26-07-2017 |
Martin1000 | 5:93f48c84e645 | 38 | // last change : 10-11-2017 |
Martin1000 | 5:93f48c84e645 | 39 | // name : Hillebrand, Martin (Iserlohn) |
Martin1000 | 5:93f48c84e645 | 40 | // target : FRDM K64F (from NXP) |
Martin1000 | 5:93f48c84e645 | 41 | // software : mbed (online) |
Martin1000 | 5:93f48c84e645 | 42 | // programming : USB direct to SDA- interface |
Martin1000 | 5:93f48c84e645 | 43 | // --------------------------------------------- |
wim | 0:a75049de1a82 | 44 | |
wim | 0:a75049de1a82 | 45 | #include "mbed.h" |
wim | 0:a75049de1a82 | 46 | #include "TextLCD.h" |
Martin1000 | 5:93f48c84e645 | 47 | |
Martin1000 | 5:93f48c84e645 | 48 | #define OPEN 1 |
Martin1000 | 5:93f48c84e645 | 49 | #define CLOSE 2 |
Martin1000 | 5:93f48c84e645 | 50 | |
Martin1000 | 5:93f48c84e645 | 51 | // variable declaration |
Martin1000 | 5:93f48c84e645 | 52 | // ==================== |
Martin1000 | 5:93f48c84e645 | 53 | |
Martin1000 | 5:93f48c84e645 | 54 | int old_value = 0; // for single shot putty- output |
Martin1000 | 5:93f48c84e645 | 55 | int new_value = 0; // dto. |
Martin1000 | 5:93f48c84e645 | 56 | |
Martin1000 | 5:93f48c84e645 | 57 | float duty_open = 0; // duty cycle in direction open |
Martin1000 | 5:93f48c84e645 | 58 | float duty_close = 0; // duty cycle in direction close |
Martin1000 | 5:93f48c84e645 | 59 | |
Martin1000 | 5:93f48c84e645 | 60 | double motor_current = 0; // current from motor controller CT |
Martin1000 | 5:93f48c84e645 | 61 | |
Martin1000 | 5:93f48c84e645 | 62 | int button_open = 0; // following variables contains the |
Martin1000 | 5:93f48c84e645 | 63 | int button_close = 0; // input values, but logical correct |
Martin1000 | 5:93f48c84e645 | 64 | int endpos_open = 0; // e. g. button_open = 1 activ |
Martin1000 | 5:93f48c84e645 | 65 | int endpos_close = 0; // switch_auto = 1, when auto is ON |
Martin1000 | 5:93f48c84e645 | 66 | int switch_auto = 0; // |
Martin1000 | 5:93f48c84e645 | 67 | int time_flag = 0; // flag for resetting timer |
Martin1000 | 5:93f48c84e645 | 68 | |
Martin1000 | 5:93f48c84e645 | 69 | int dir = 0; |
Martin1000 | 5:93f48c84e645 | 70 | int off_flag = 0; |
Martin1000 | 5:93f48c84e645 | 71 | int auto_status = 0; |
Martin1000 | 5:93f48c84e645 | 72 | int auto_cycle = 0; |
Martin1000 | 5:93f48c84e645 | 73 | int k = 0; |
Martin1000 | 5:93f48c84e645 | 74 | int start_move = 0; |
Martin1000 | 5:93f48c84e645 | 75 | int flag_9 = 0; |
Martin1000 | 5:93f48c84e645 | 76 | |
Martin1000 | 5:93f48c84e645 | 77 | |
Martin1000 | 5:93f48c84e645 | 78 | |
Martin1000 | 5:93f48c84e645 | 79 | float current_motor = 0; // |
Martin1000 | 5:93f48c84e645 | 80 | double duty_cycle_percent = 0; // |
Martin1000 | 5:93f48c84e645 | 81 | double duty_cycle_current = 0; // |
Martin1000 | 5:93f48c84e645 | 82 | |
Martin1000 | 5:93f48c84e645 | 83 | double pause_time = 0; // |
Martin1000 | 5:93f48c84e645 | 84 | double ramp_time = 0; |
Martin1000 | 5:93f48c84e645 | 85 | double voltage3v3 = 0; // analog values refer |
Martin1000 | 5:93f48c84e645 | 86 | double m_old_value = 0; |
Martin1000 | 5:93f48c84e645 | 87 | double m_new_value = 0; |
Martin1000 | 5:93f48c84e645 | 88 | double elapsed_time = 0; // elapsed time since t.start() |
Martin1000 | 5:93f48c84e645 | 89 | double timeout_x_time = 0; // elapsed time for timeout |
Martin1000 | 5:93f48c84e645 | 90 | double gradient = 0; // gradient for solving |
Martin1000 | 5:93f48c84e645 | 91 | double timeouttime = 60; // fix value for reaching the endposition |
Martin1000 | 5:93f48c84e645 | 92 | |
Martin1000 | 5:93f48c84e645 | 93 | |
Martin1000 | 5:93f48c84e645 | 94 | Timer t; |
Martin1000 | 5:93f48c84e645 | 95 | Timer x; |
Martin1000 | 5:93f48c84e645 | 96 | |
Martin1000 | 5:93f48c84e645 | 97 | // function declaration |
Martin1000 | 5:93f48c84e645 | 98 | // ==================== |
Martin1000 | 5:93f48c84e645 | 99 | |
Martin1000 | 5:93f48c84e645 | 100 | void initialize(void); |
Martin1000 | 5:93f48c84e645 | 101 | void state_to_usb(void); |
Martin1000 | 5:93f48c84e645 | 102 | void read_inputs(void); |
Martin1000 | 5:93f48c84e645 | 103 | void monitor_output(void); |
Martin1000 | 5:93f48c84e645 | 104 | void endpos_led(void); |
Martin1000 | 5:93f48c84e645 | 105 | void motor_manual(int); |
Martin1000 | 5:93f48c84e645 | 106 | void motor_auto(int); |
Martin1000 | 5:93f48c84e645 | 107 | void automatic(void); |
Martin1000 | 5:93f48c84e645 | 108 | void motor_off(void); |
Martin1000 | 5:93f48c84e645 | 109 | void motor_off_auto(void); |
Martin1000 | 5:93f48c84e645 | 110 | |
Martin1000 | 5:93f48c84e645 | 111 | void manual_mode(void); |
Martin1000 | 5:93f48c84e645 | 112 | void lcd_output_start(void); // display after reset |
Martin1000 | 5:93f48c84e645 | 113 | void lcd_output_setting(void); // setting mode |
Martin1000 | 5:93f48c84e645 | 114 | void lcd_output_manual(void); // auto, waiting for close door |
Martin1000 | 5:93f48c84e645 | 115 | void lcd_output_auto0(void); // auto, close, waiting for start |
Martin1000 | 5:93f48c84e645 | 116 | void lcd_output_auto1(void); // |
Martin1000 | 5:93f48c84e645 | 117 | void lcd_output_auto2(void); |
Martin1000 | 5:93f48c84e645 | 118 | void lcd_output_auto3(void); |
Martin1000 | 5:93f48c84e645 | 119 | |
Martin1000 | 5:93f48c84e645 | 120 | |
Martin1000 | 5:93f48c84e645 | 121 | // define inputs and outputs |
Martin1000 | 5:93f48c84e645 | 122 | // ========================= |
Martin1000 | 5:93f48c84e645 | 123 | |
Martin1000 | 5:93f48c84e645 | 124 | DigitalOut myled(LED1); // internal Test- LED |
Martin1000 | 5:93f48c84e645 | 125 | PwmOut pwm_open(PTD2); // PWM- signal for direction open |
Martin1000 | 5:93f48c84e645 | 126 | PwmOut pwm_close(PTD0); // PWM- signal for direction close |
Martin1000 | 5:93f48c84e645 | 127 | |
Martin1000 | 5:93f48c84e645 | 128 | DigitalOut out_enable(PTC4); // enable motor driver |
Martin1000 | 5:93f48c84e645 | 129 | DigitalOut out_led_open(PTC16); // indicator in button open |
Martin1000 | 5:93f48c84e645 | 130 | DigitalOut out_led_close(PTC17); // indicator in button close |
Martin1000 | 5:93f48c84e645 | 131 | DigitalOut out_led_status(PTB9); // led status |
wim | 4:a3e4bb2053cb | 132 | |
Martin1000 | 5:93f48c84e645 | 133 | DigitalIn in_btn_open(PTD1); // button open |
Martin1000 | 5:93f48c84e645 | 134 | DigitalIn in_btn_close(PTD3); // button close |
Martin1000 | 5:93f48c84e645 | 135 | DigitalIn in_end_pos_open(PTB23); // signal endposition open |
Martin1000 | 5:93f48c84e645 | 136 | DigitalIn in_end_pos_close(PTA1); // signal endposition close |
Martin1000 | 5:93f48c84e645 | 137 | DigitalIn in_sw_auto(PTC12); // switch to start auto sequence |
Martin1000 | 5:93f48c84e645 | 138 | |
Martin1000 | 5:93f48c84e645 | 139 | |
Martin1000 | 5:93f48c84e645 | 140 | AnalogIn a_in_motor(PTC10); // A5- motor current |
Martin1000 | 5:93f48c84e645 | 141 | AnalogIn a_in_duty(PTC11); // A4- duty cycle analog |
Martin1000 | 5:93f48c84e645 | 142 | AnalogIn a_in_ramp(PTB11); // A3- ramp analog value 0.1..9.9 seconds |
Martin1000 | 5:93f48c84e645 | 143 | AnalogIn a_in_pause(PTB10); // A2- pause analog value0.0..99.9 seconds |
Martin1000 | 5:93f48c84e645 | 144 | AnalogIn a_in_3v3(PTB3); // A1- reference voltage 3,3 volt |
Martin1000 | 5:93f48c84e645 | 145 | |
Martin1000 | 5:93f48c84e645 | 146 | |
wim | 0:a75049de1a82 | 147 | |
Martin1000 | 5:93f48c84e645 | 148 | /* |
Martin1000 | 5:93f48c84e645 | 149 | AnalogIn a_in_motor(PTB2); // A0- motor current |
Martin1000 | 5:93f48c84e645 | 150 | AnalogIn a_in_duty(PTB3); // A1- duty cycle analog |
Martin1000 | 5:93f48c84e645 | 151 | AnalogIn a_in_ramp(PTB10); // A2- ramp analog value 0.1..9.9 seconds |
Martin1000 | 5:93f48c84e645 | 152 | AnalogIn a_in_pause(PTB11); // A3- pause analog value0.0..99.9 seconds |
Martin1000 | 5:93f48c84e645 | 153 | AnalogIn a_in_3v3(PTC11); // A4- reference voltage 3,3 volt |
Martin1000 | 5:93f48c84e645 | 154 | |
Martin1000 | 5:93f48c84e645 | 155 | */ |
Martin1000 | 5:93f48c84e645 | 156 | Serial pc(USBTX, USBRX); // Host PC Communication channels tx, rx |
Martin1000 | 5:93f48c84e645 | 157 | I2C i2c_lcd(PTE25,PTE24); // SDA, SCL for K64 |
Martin1000 | 5:93f48c84e645 | 158 | |
Martin1000 | 5:93f48c84e645 | 159 | TextLCD_I2C lcd(&i2c_lcd, 0x27<<1, TextLCD::LCD20x4); |
wim | 0:a75049de1a82 | 160 | |
Martin1000 | 5:93f48c84e645 | 161 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 162 | void lcd_output_start(void) |
Martin1000 | 5:93f48c84e645 | 163 | { |
Martin1000 | 5:93f48c84e645 | 164 | wait(0.5); |
Martin1000 | 5:93f48c84e645 | 165 | lcd.setBacklight(TextLCD::LightOn); // LCD backlight on |
Martin1000 | 5:93f48c84e645 | 166 | lcd.cls(); |
Martin1000 | 5:93f48c84e645 | 167 | lcd.printf("- door opener v4.6 -"); // LCD Headline |
Martin1000 | 5:93f48c84e645 | 168 | } |
Martin1000 | 5:93f48c84e645 | 169 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 170 | void lcd_output_setting(void) |
Martin1000 | 5:93f48c84e645 | 171 | { |
Martin1000 | 5:93f48c84e645 | 172 | lcd.locate(0,0); |
Martin1000 | 5:93f48c84e645 | 173 | lcd.printf("--- setting mode ---"); |
Martin1000 | 5:93f48c84e645 | 174 | lcd.locate(0,1); |
Martin1000 | 5:93f48c84e645 | 175 | lcd.printf("duty cycle = %3.0f %% ",duty_cycle_percent); |
Martin1000 | 5:93f48c84e645 | 176 | lcd.locate(0,2); |
Martin1000 | 5:93f48c84e645 | 177 | lcd.printf("ramp time = %3.1f s ",ramp_time); |
Martin1000 | 5:93f48c84e645 | 178 | lcd.locate(0,3); |
Martin1000 | 5:93f48c84e645 | 179 | if (pause_time >=10.0) |
Martin1000 | 5:93f48c84e645 | 180 | { |
Martin1000 | 5:93f48c84e645 | 181 | lcd.printf("pause time = %3.1f s ",pause_time); |
Martin1000 | 5:93f48c84e645 | 182 | } |
Martin1000 | 5:93f48c84e645 | 183 | else |
Martin1000 | 5:93f48c84e645 | 184 | { |
Martin1000 | 5:93f48c84e645 | 185 | lcd.printf("pause time = %3.1f s ",pause_time); |
Martin1000 | 5:93f48c84e645 | 186 | } |
Martin1000 | 5:93f48c84e645 | 187 | } |
Martin1000 | 5:93f48c84e645 | 188 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 189 | void lcd_output_manual(void) |
Martin1000 | 5:93f48c84e645 | 190 | { |
Martin1000 | 5:93f48c84e645 | 191 | |
Martin1000 | 5:93f48c84e645 | 192 | if (button_open || button_close) |
Martin1000 | 5:93f48c84e645 | 193 | { |
Martin1000 | 5:93f48c84e645 | 194 | k++; |
Martin1000 | 5:93f48c84e645 | 195 | if (k >8) |
Martin1000 | 5:93f48c84e645 | 196 | { |
Martin1000 | 5:93f48c84e645 | 197 | lcd.cls(); |
Martin1000 | 5:93f48c84e645 | 198 | lcd.locate(0,0); |
Martin1000 | 5:93f48c84e645 | 199 | lcd.printf("--- manuel mode ---\n"); |
Martin1000 | 5:93f48c84e645 | 200 | motor_current = (double)a_in_motor*1000.0; |
Martin1000 | 5:93f48c84e645 | 201 | lcd.locate(0,2); |
Martin1000 | 5:93f48c84e645 | 202 | lcd.printf("Current = %6.1f mA\n",motor_current); |
Martin1000 | 5:93f48c84e645 | 203 | lcd.locate(0,3); |
Martin1000 | 5:93f48c84e645 | 204 | lcd.printf("duty = %5.0f %%\n",duty_cycle_current); |
Martin1000 | 5:93f48c84e645 | 205 | k = 0; |
Martin1000 | 5:93f48c84e645 | 206 | } |
Martin1000 | 5:93f48c84e645 | 207 | } |
Martin1000 | 5:93f48c84e645 | 208 | } |
Martin1000 | 5:93f48c84e645 | 209 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 210 | void lcd_output_auto0(void) |
Martin1000 | 5:93f48c84e645 | 211 | { |
Martin1000 | 5:93f48c84e645 | 212 | k++; |
Martin1000 | 5:93f48c84e645 | 213 | if (k >8) |
Martin1000 | 5:93f48c84e645 | 214 | { |
Martin1000 | 5:93f48c84e645 | 215 | |
Martin1000 | 5:93f48c84e645 | 216 | lcd.cls(); |
Martin1000 | 5:93f48c84e645 | 217 | lcd.locate(0,0); |
Martin1000 | 5:93f48c84e645 | 218 | lcd.printf("-- automatic mode --\n"); |
Martin1000 | 5:93f48c84e645 | 219 | lcd.locate(0,1); |
Martin1000 | 5:93f48c84e645 | 220 | lcd.printf("status = %d\n", auto_status); |
Martin1000 | 5:93f48c84e645 | 221 | motor_current = (double)a_in_motor*1000.0; |
Martin1000 | 5:93f48c84e645 | 222 | lcd.locate(0,2); |
Martin1000 | 5:93f48c84e645 | 223 | lcd.printf("door is open"); |
Martin1000 | 5:93f48c84e645 | 224 | lcd.locate(0,3); |
Martin1000 | 5:93f48c84e645 | 225 | lcd.printf("close door!\n"); |
Martin1000 | 5:93f48c84e645 | 226 | k = 0; |
Martin1000 | 5:93f48c84e645 | 227 | } |
Martin1000 | 5:93f48c84e645 | 228 | } |
Martin1000 | 5:93f48c84e645 | 229 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 230 | void lcd_output_auto1(void) |
Martin1000 | 5:93f48c84e645 | 231 | { |
Martin1000 | 5:93f48c84e645 | 232 | k++; |
Martin1000 | 5:93f48c84e645 | 233 | if (k >8) |
Martin1000 | 5:93f48c84e645 | 234 | { |
Martin1000 | 5:93f48c84e645 | 235 | |
Martin1000 | 5:93f48c84e645 | 236 | lcd.cls(); |
Martin1000 | 5:93f48c84e645 | 237 | lcd.locate(0,0); |
Martin1000 | 5:93f48c84e645 | 238 | lcd.printf("-- automatic mode --\n"); |
Martin1000 | 5:93f48c84e645 | 239 | lcd.locate(0,1); |
Martin1000 | 5:93f48c84e645 | 240 | lcd.printf("status = %d\n", auto_status); |
Martin1000 | 5:93f48c84e645 | 241 | motor_current = (double)a_in_motor*1000.0; |
Martin1000 | 5:93f48c84e645 | 242 | lcd.locate(0,2); |
Martin1000 | 5:93f48c84e645 | 243 | lcd.printf("door is closed"); |
Martin1000 | 5:93f48c84e645 | 244 | lcd.locate(0,3); |
Martin1000 | 5:93f48c84e645 | 245 | lcd.printf("waiting for start! "); |
Martin1000 | 5:93f48c84e645 | 246 | k = 0; |
Martin1000 | 5:93f48c84e645 | 247 | } |
Martin1000 | 5:93f48c84e645 | 248 | } |
Martin1000 | 5:93f48c84e645 | 249 | |
Martin1000 | 5:93f48c84e645 | 250 | |
Martin1000 | 5:93f48c84e645 | 251 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 252 | void lcd_output_auto2(void) |
Martin1000 | 5:93f48c84e645 | 253 | { |
wim | 4:a3e4bb2053cb | 254 | |
Martin1000 | 5:93f48c84e645 | 255 | k++; |
Martin1000 | 5:93f48c84e645 | 256 | if (k >8) |
Martin1000 | 5:93f48c84e645 | 257 | { |
Martin1000 | 5:93f48c84e645 | 258 | |
Martin1000 | 5:93f48c84e645 | 259 | lcd.cls(); |
Martin1000 | 5:93f48c84e645 | 260 | lcd.locate(0,0); |
Martin1000 | 5:93f48c84e645 | 261 | lcd.printf("-- automatic mode --\n"); |
Martin1000 | 5:93f48c84e645 | 262 | lcd.locate(0,1); |
Martin1000 | 5:93f48c84e645 | 263 | if (dir == OPEN) |
Martin1000 | 5:93f48c84e645 | 264 | { |
Martin1000 | 5:93f48c84e645 | 265 | lcd.printf("status = %d OPEN \n", auto_status); |
wim | 4:a3e4bb2053cb | 266 | } |
Martin1000 | 5:93f48c84e645 | 267 | if (dir == CLOSE) |
Martin1000 | 5:93f48c84e645 | 268 | { |
Martin1000 | 5:93f48c84e645 | 269 | lcd.printf("status = %d CLOSE\n", auto_status); |
Martin1000 | 5:93f48c84e645 | 270 | } |
Martin1000 | 5:93f48c84e645 | 271 | motor_current = (double)a_in_motor*1000.0; |
Martin1000 | 5:93f48c84e645 | 272 | lcd.locate(0,2); |
Martin1000 | 5:93f48c84e645 | 273 | lcd.printf("running, cycle %d ",auto_cycle); |
wim | 3:f238b4f7874f | 274 | |
Martin1000 | 5:93f48c84e645 | 275 | lcd.locate(0,3); |
Martin1000 | 5:93f48c84e645 | 276 | lcd.printf("Current = %6.1f mA\r\n",motor_current); |
Martin1000 | 5:93f48c84e645 | 277 | k = 0; |
wim | 4:a3e4bb2053cb | 278 | } |
wim | 4:a3e4bb2053cb | 279 | } |
wim | 3:f238b4f7874f | 280 | |
wim | 3:f238b4f7874f | 281 | |
Martin1000 | 5:93f48c84e645 | 282 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 283 | void lcd_output_auto3(void) |
Martin1000 | 5:93f48c84e645 | 284 | { |
Martin1000 | 5:93f48c84e645 | 285 | k++; |
Martin1000 | 5:93f48c84e645 | 286 | if (k >8) |
Martin1000 | 5:93f48c84e645 | 287 | { |
Martin1000 | 5:93f48c84e645 | 288 | |
Martin1000 | 5:93f48c84e645 | 289 | lcd.cls(); |
Martin1000 | 5:93f48c84e645 | 290 | lcd.locate(0,0); |
Martin1000 | 5:93f48c84e645 | 291 | lcd.printf("-- automatic mode --\n"); |
Martin1000 | 5:93f48c84e645 | 292 | lcd.locate(0,1); |
Martin1000 | 5:93f48c84e645 | 293 | lcd.printf("status = %d\n", auto_status); |
Martin1000 | 5:93f48c84e645 | 294 | motor_current = (double)a_in_motor*1000.0; |
Martin1000 | 5:93f48c84e645 | 295 | lcd.locate(0,2); |
Martin1000 | 5:93f48c84e645 | 296 | lcd.printf("running, cycle %d\r\n",auto_cycle); |
wim | 0:a75049de1a82 | 297 | |
Martin1000 | 5:93f48c84e645 | 298 | lcd.locate(0,3); |
Martin1000 | 5:93f48c84e645 | 299 | lcd.printf("Pause: %3.1f of %3.1f s\r\n",elapsed_time, pause_time); |
Martin1000 | 5:93f48c84e645 | 300 | k = 0; |
Martin1000 | 5:93f48c84e645 | 301 | } |
Martin1000 | 5:93f48c84e645 | 302 | } |
Martin1000 | 5:93f48c84e645 | 303 | |
Martin1000 | 5:93f48c84e645 | 304 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 305 | void monitor_output(void) |
Martin1000 | 5:93f48c84e645 | 306 | { |
Martin1000 | 5:93f48c84e645 | 307 | m_old_value = duty_cycle_percent + ramp_time + pause_time; |
Martin1000 | 5:93f48c84e645 | 308 | |
Martin1000 | 5:93f48c84e645 | 309 | if (abs(m_new_value - m_old_value) > 1.0) |
Martin1000 | 5:93f48c84e645 | 310 | { |
Martin1000 | 5:93f48c84e645 | 311 | pc.printf("\r\n"); |
Martin1000 | 5:93f48c84e645 | 312 | pc.printf("----------------------------\r\n"); |
Martin1000 | 5:93f48c84e645 | 313 | pc.printf("duty cycle = %3.1f Prozent \r\n", duty_cycle_percent); |
Martin1000 | 5:93f48c84e645 | 314 | pc.printf("ramp time = %3.1f Sekunden \r\n", ramp_time); |
Martin1000 | 5:93f48c84e645 | 315 | pc.printf("pause time = %4.1f Sekunden \r\n", pause_time); |
Martin1000 | 5:93f48c84e645 | 316 | wait(0.1); |
Martin1000 | 5:93f48c84e645 | 317 | } |
Martin1000 | 5:93f48c84e645 | 318 | m_new_value = m_old_value; |
Martin1000 | 5:93f48c84e645 | 319 | } |
Martin1000 | 5:93f48c84e645 | 320 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 321 | void read_inputs(void) // and calculate |
Martin1000 | 5:93f48c84e645 | 322 | { |
Martin1000 | 5:93f48c84e645 | 323 | button_open = !in_btn_open; |
Martin1000 | 5:93f48c84e645 | 324 | button_close = !in_btn_close; |
Martin1000 | 5:93f48c84e645 | 325 | |
Martin1000 | 5:93f48c84e645 | 326 | endpos_open = !in_end_pos_open; |
Martin1000 | 5:93f48c84e645 | 327 | endpos_close = !in_end_pos_close; |
Martin1000 | 5:93f48c84e645 | 328 | switch_auto = !in_sw_auto; |
Martin1000 | 5:93f48c84e645 | 329 | |
Martin1000 | 5:93f48c84e645 | 330 | |
Martin1000 | 5:93f48c84e645 | 331 | |
Martin1000 | 5:93f48c84e645 | 332 | voltage3v3 = (float)a_in_3v3; |
Martin1000 | 5:93f48c84e645 | 333 | |
Martin1000 | 5:93f48c84e645 | 334 | duty_cycle_percent = (double)(a_in_duty*100.0f/voltage3v3); |
Martin1000 | 5:93f48c84e645 | 335 | if (duty_cycle_percent > 100.0) duty_cycle_percent = 100.0; |
Martin1000 | 5:93f48c84e645 | 336 | if (duty_cycle_percent < 10.0) duty_cycle_percent = 10.0; |
Martin1000 | 5:93f48c84e645 | 337 | |
Martin1000 | 5:93f48c84e645 | 338 | ramp_time = (double)(a_in_ramp*9.9f/voltage3v3); |
Martin1000 | 5:93f48c84e645 | 339 | if (ramp_time <0.1) ramp_time = 0.1; |
Martin1000 | 5:93f48c84e645 | 340 | if (ramp_time >9.9) ramp_time = 9.9; |
Martin1000 | 5:93f48c84e645 | 341 | |
Martin1000 | 5:93f48c84e645 | 342 | pause_time = (double)(a_in_pause*99.9f/voltage3v3); |
Martin1000 | 5:93f48c84e645 | 343 | if (pause_time <1.0) pause_time = 1.0; |
Martin1000 | 5:93f48c84e645 | 344 | if (pause_time >99.9) pause_time = 99.9; |
Martin1000 | 5:93f48c84e645 | 345 | |
Martin1000 | 5:93f48c84e645 | 346 | if (!button_open && !button_close && !switch_auto) |
Martin1000 | 5:93f48c84e645 | 347 | { |
Martin1000 | 5:93f48c84e645 | 348 | lcd_output_setting(); |
Martin1000 | 5:93f48c84e645 | 349 | } |
Martin1000 | 5:93f48c84e645 | 350 | } |
Martin1000 | 5:93f48c84e645 | 351 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 352 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 353 | //----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 354 | void initialize(void) |
Martin1000 | 5:93f48c84e645 | 355 | { |
Martin1000 | 5:93f48c84e645 | 356 | out_led_status = 1; |
Martin1000 | 5:93f48c84e645 | 357 | out_enable = 1; |
Martin1000 | 5:93f48c84e645 | 358 | pwm_close.period(1.0/1000); |
Martin1000 | 5:93f48c84e645 | 359 | pwm_open.period(1.0/1000); |
Martin1000 | 5:93f48c84e645 | 360 | } |
Martin1000 | 5:93f48c84e645 | 361 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 362 | void endpos_led(void) |
Martin1000 | 5:93f48c84e645 | 363 | { |
Martin1000 | 5:93f48c84e645 | 364 | if (endpos_open) // switching ON of the "end pos"-led in the button OPEN |
Martin1000 | 5:93f48c84e645 | 365 | { |
Martin1000 | 5:93f48c84e645 | 366 | out_led_open = 1; |
Martin1000 | 5:93f48c84e645 | 367 | } else |
Martin1000 | 5:93f48c84e645 | 368 | { |
Martin1000 | 5:93f48c84e645 | 369 | out_led_open = 0; |
Martin1000 | 5:93f48c84e645 | 370 | } |
Martin1000 | 5:93f48c84e645 | 371 | //===================================================================== |
Martin1000 | 5:93f48c84e645 | 372 | if (endpos_close) // switching ON "end pos"-led in the button CLOSE |
Martin1000 | 5:93f48c84e645 | 373 | { |
Martin1000 | 5:93f48c84e645 | 374 | out_led_close = 1; |
Martin1000 | 5:93f48c84e645 | 375 | } else |
Martin1000 | 5:93f48c84e645 | 376 | { |
Martin1000 | 5:93f48c84e645 | 377 | out_led_close = 0; |
Martin1000 | 5:93f48c84e645 | 378 | } |
Martin1000 | 5:93f48c84e645 | 379 | } |
Martin1000 | 5:93f48c84e645 | 380 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 381 | void state_to_usb(void) |
Martin1000 | 5:93f48c84e645 | 382 | { |
Martin1000 | 5:93f48c84e645 | 383 | new_value = (int)(button_open * 1 + button_close * 2 + endpos_open * |
Martin1000 | 5:93f48c84e645 | 384 | 4 + endpos_close * 8 + switch_auto * 16 + auto_status *32); |
Martin1000 | 5:93f48c84e645 | 385 | |
Martin1000 | 5:93f48c84e645 | 386 | if (new_value!= old_value) |
Martin1000 | 5:93f48c84e645 | 387 | { // state of inputs if new values different from former values |
Martin1000 | 5:93f48c84e645 | 388 | |
Martin1000 | 5:93f48c84e645 | 389 | pc.printf("----------------------\r\n"); |
Martin1000 | 5:93f48c84e645 | 390 | pc.printf("Button Open %d \r\n", (int)button_open); |
Martin1000 | 5:93f48c84e645 | 391 | pc.printf("Button Close %d \r\n", (int)button_close); |
Martin1000 | 5:93f48c84e645 | 392 | pc.printf("End Position Open %d \r\n", (int)endpos_open); |
Martin1000 | 5:93f48c84e645 | 393 | pc.printf("End Position Close %d \r\n", (int)endpos_close); |
Martin1000 | 5:93f48c84e645 | 394 | pc.printf("Switch Auto %d \r\n", (int)switch_auto); |
Martin1000 | 5:93f48c84e645 | 395 | pc.printf("auto status %d \r\n", (int)auto_status); |
Martin1000 | 5:93f48c84e645 | 396 | |
Martin1000 | 5:93f48c84e645 | 397 | |
Martin1000 | 5:93f48c84e645 | 398 | old_value = new_value; |
Martin1000 | 5:93f48c84e645 | 399 | } |
Martin1000 | 5:93f48c84e645 | 400 | out_led_status = !out_led_status; |
Martin1000 | 5:93f48c84e645 | 401 | wait(0.05); |
Martin1000 | 5:93f48c84e645 | 402 | } |
Martin1000 | 5:93f48c84e645 | 403 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 404 | void automatic(void) |
Martin1000 | 5:93f48c84e645 | 405 | { |
Martin1000 | 5:93f48c84e645 | 406 | switch (auto_status) |
Martin1000 | 5:93f48c84e645 | 407 | { |
Martin1000 | 5:93f48c84e645 | 408 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 409 | case 0: |
Martin1000 | 5:93f48c84e645 | 410 | lcd_output_auto0(); |
Martin1000 | 5:93f48c84e645 | 411 | if (endpos_close) |
Martin1000 | 5:93f48c84e645 | 412 | { |
Martin1000 | 5:93f48c84e645 | 413 | auto_status = 1; |
Martin1000 | 5:93f48c84e645 | 414 | } |
Martin1000 | 5:93f48c84e645 | 415 | break; |
Martin1000 | 5:93f48c84e645 | 416 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 417 | case 1: |
Martin1000 | 5:93f48c84e645 | 418 | lcd_output_auto1(); |
Martin1000 | 5:93f48c84e645 | 419 | if (endpos_close && button_open) |
Martin1000 | 5:93f48c84e645 | 420 | { |
Martin1000 | 5:93f48c84e645 | 421 | auto_status = 2; // forward to status 2 |
Martin1000 | 5:93f48c84e645 | 422 | } |
Martin1000 | 5:93f48c84e645 | 423 | if (!endpos_close) // back to status 0 |
Martin1000 | 5:93f48c84e645 | 424 | { |
Martin1000 | 5:93f48c84e645 | 425 | auto_status = 0; |
Martin1000 | 5:93f48c84e645 | 426 | } |
Martin1000 | 5:93f48c84e645 | 427 | break; |
Martin1000 | 5:93f48c84e645 | 428 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 429 | case 2: |
Martin1000 | 5:93f48c84e645 | 430 | lcd_output_auto1(); |
Martin1000 | 5:93f48c84e645 | 431 | if (endpos_close && !button_open) // release start button |
Martin1000 | 5:93f48c84e645 | 432 | { |
Martin1000 | 5:93f48c84e645 | 433 | auto_status = 3; |
Martin1000 | 5:93f48c84e645 | 434 | } |
Martin1000 | 5:93f48c84e645 | 435 | if (!endpos_close) // back to status 0 |
Martin1000 | 5:93f48c84e645 | 436 | { |
Martin1000 | 5:93f48c84e645 | 437 | auto_status = 0; |
Martin1000 | 5:93f48c84e645 | 438 | } |
Martin1000 | 5:93f48c84e645 | 439 | break; |
Martin1000 | 5:93f48c84e645 | 440 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 441 | case 3: |
Martin1000 | 5:93f48c84e645 | 442 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 443 | if (endpos_close && !button_open) // release start button |
Martin1000 | 5:93f48c84e645 | 444 | { |
Martin1000 | 5:93f48c84e645 | 445 | wait(0.3); |
Martin1000 | 5:93f48c84e645 | 446 | auto_status = 4; |
Martin1000 | 5:93f48c84e645 | 447 | start_move = 1; //? |
Martin1000 | 5:93f48c84e645 | 448 | time_flag = 0; |
Martin1000 | 5:93f48c84e645 | 449 | } |
Martin1000 | 5:93f48c84e645 | 450 | break; |
Martin1000 | 5:93f48c84e645 | 451 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 452 | case 4: |
Martin1000 | 5:93f48c84e645 | 453 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 454 | motor_auto(OPEN); // motor runs until |
Martin1000 | 5:93f48c84e645 | 455 | // a.) position is open |
Martin1000 | 5:93f48c84e645 | 456 | // b.) auto switch turned off |
Martin1000 | 5:93f48c84e645 | 457 | // c.) timeout reached |
Martin1000 | 5:93f48c84e645 | 458 | // |
Martin1000 | 5:93f48c84e645 | 459 | start_move = 0; |
Martin1000 | 5:93f48c84e645 | 460 | if (!endpos_close) // motor leave endpos close |
Martin1000 | 5:93f48c84e645 | 461 | { |
Martin1000 | 5:93f48c84e645 | 462 | x.reset(); |
Martin1000 | 5:93f48c84e645 | 463 | x.start(); |
Martin1000 | 5:93f48c84e645 | 464 | timeout_x_time = 0; |
Martin1000 | 5:93f48c84e645 | 465 | |
Martin1000 | 5:93f48c84e645 | 466 | auto_status = 5; |
Martin1000 | 5:93f48c84e645 | 467 | |
Martin1000 | 5:93f48c84e645 | 468 | } |
Martin1000 | 5:93f48c84e645 | 469 | break; |
Martin1000 | 5:93f48c84e645 | 470 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 471 | case 5: |
Martin1000 | 5:93f48c84e645 | 472 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 473 | motor_auto(OPEN); // motor runs until |
Martin1000 | 5:93f48c84e645 | 474 | // a.) position is open |
Martin1000 | 5:93f48c84e645 | 475 | // b.) auto switch turned off |
Martin1000 | 5:93f48c84e645 | 476 | // c.) timeout reached |
Martin1000 | 5:93f48c84e645 | 477 | // |
Martin1000 | 5:93f48c84e645 | 478 | |
Martin1000 | 5:93f48c84e645 | 479 | timeout_x_time = x.read(); |
Martin1000 | 5:93f48c84e645 | 480 | if (timeout_x_time > timeouttime) |
Martin1000 | 5:93f48c84e645 | 481 | { |
Martin1000 | 5:93f48c84e645 | 482 | motor_off_auto(); |
Martin1000 | 5:93f48c84e645 | 483 | out_led_status = 1; |
Martin1000 | 5:93f48c84e645 | 484 | |
Martin1000 | 5:93f48c84e645 | 485 | } |
Martin1000 | 5:93f48c84e645 | 486 | |
Martin1000 | 5:93f48c84e645 | 487 | |
Martin1000 | 5:93f48c84e645 | 488 | |
Martin1000 | 5:93f48c84e645 | 489 | |
Martin1000 | 5:93f48c84e645 | 490 | |
Martin1000 | 5:93f48c84e645 | 491 | |
Martin1000 | 5:93f48c84e645 | 492 | if (endpos_open) // motor reach open position |
Martin1000 | 5:93f48c84e645 | 493 | { |
Martin1000 | 5:93f48c84e645 | 494 | motor_off_auto(); |
Martin1000 | 5:93f48c84e645 | 495 | auto_status = 6; |
Martin1000 | 5:93f48c84e645 | 496 | } |
Martin1000 | 5:93f48c84e645 | 497 | break; |
Martin1000 | 5:93f48c84e645 | 498 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 499 | case 6: |
Martin1000 | 5:93f48c84e645 | 500 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 501 | time_flag = 0; |
Martin1000 | 5:93f48c84e645 | 502 | if (endpos_open) // |
Martin1000 | 5:93f48c84e645 | 503 | { |
Martin1000 | 5:93f48c84e645 | 504 | auto_status = 7; |
Martin1000 | 5:93f48c84e645 | 505 | } |
Martin1000 | 5:93f48c84e645 | 506 | break; |
Martin1000 | 5:93f48c84e645 | 507 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 508 | case 7: |
Martin1000 | 5:93f48c84e645 | 509 | lcd_output_auto3(); |
Martin1000 | 5:93f48c84e645 | 510 | if (!time_flag) |
Martin1000 | 5:93f48c84e645 | 511 | { |
Martin1000 | 5:93f48c84e645 | 512 | t.reset(); |
Martin1000 | 5:93f48c84e645 | 513 | t.start(); |
Martin1000 | 5:93f48c84e645 | 514 | time_flag = 1; |
Martin1000 | 5:93f48c84e645 | 515 | elapsed_time = 0; |
Martin1000 | 5:93f48c84e645 | 516 | } |
Martin1000 | 5:93f48c84e645 | 517 | elapsed_time = t.read(); |
Martin1000 | 5:93f48c84e645 | 518 | if (elapsed_time > pause_time) |
Martin1000 | 5:93f48c84e645 | 519 | { |
Martin1000 | 5:93f48c84e645 | 520 | auto_status = 8; |
Martin1000 | 5:93f48c84e645 | 521 | time_flag = 0; |
Martin1000 | 5:93f48c84e645 | 522 | } |
Martin1000 | 5:93f48c84e645 | 523 | break; |
Martin1000 | 5:93f48c84e645 | 524 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 525 | case 8: |
Martin1000 | 5:93f48c84e645 | 526 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 527 | motor_auto(CLOSE); // motor runs until |
Martin1000 | 5:93f48c84e645 | 528 | // a.) position is open |
Martin1000 | 5:93f48c84e645 | 529 | // b.) auto switch turned off |
Martin1000 | 5:93f48c84e645 | 530 | // c.) timeout reached |
Martin1000 | 5:93f48c84e645 | 531 | if (!endpos_open) |
Martin1000 | 5:93f48c84e645 | 532 | { |
Martin1000 | 5:93f48c84e645 | 533 | auto_status = 9; |
Martin1000 | 5:93f48c84e645 | 534 | } |
Martin1000 | 5:93f48c84e645 | 535 | break; |
Martin1000 | 5:93f48c84e645 | 536 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 537 | case 9: |
Martin1000 | 5:93f48c84e645 | 538 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 539 | motor_auto(CLOSE); // motor runs until |
Martin1000 | 5:93f48c84e645 | 540 | // a.) position is open |
Martin1000 | 5:93f48c84e645 | 541 | // b.) auto switch turned off |
Martin1000 | 5:93f48c84e645 | 542 | // c.) timeout reached |
Martin1000 | 5:93f48c84e645 | 543 | if (endpos_close) |
Martin1000 | 5:93f48c84e645 | 544 | { |
Martin1000 | 5:93f48c84e645 | 545 | motor_off_auto(); |
Martin1000 | 5:93f48c84e645 | 546 | auto_status = 10; |
Martin1000 | 5:93f48c84e645 | 547 | time_flag = 0; |
Martin1000 | 5:93f48c84e645 | 548 | auto_cycle++; |
Martin1000 | 5:93f48c84e645 | 549 | if (auto_cycle > 100000) auto_cycle = 0; |
Martin1000 | 5:93f48c84e645 | 550 | } |
Martin1000 | 5:93f48c84e645 | 551 | break; |
Martin1000 | 5:93f48c84e645 | 552 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 553 | case 10: |
Martin1000 | 5:93f48c84e645 | 554 | lcd_output_auto3(); |
Martin1000 | 5:93f48c84e645 | 555 | if (!time_flag) |
Martin1000 | 5:93f48c84e645 | 556 | { |
Martin1000 | 5:93f48c84e645 | 557 | t.reset(); |
Martin1000 | 5:93f48c84e645 | 558 | t.start(); |
Martin1000 | 5:93f48c84e645 | 559 | time_flag = 1; |
Martin1000 | 5:93f48c84e645 | 560 | elapsed_time = 0; |
Martin1000 | 5:93f48c84e645 | 561 | } |
Martin1000 | 5:93f48c84e645 | 562 | elapsed_time = t.read(); |
Martin1000 | 5:93f48c84e645 | 563 | if (elapsed_time > pause_time) |
Martin1000 | 5:93f48c84e645 | 564 | { |
Martin1000 | 5:93f48c84e645 | 565 | auto_status = 11; |
Martin1000 | 5:93f48c84e645 | 566 | time_flag = 0; |
Martin1000 | 5:93f48c84e645 | 567 | } |
Martin1000 | 5:93f48c84e645 | 568 | break; |
Martin1000 | 5:93f48c84e645 | 569 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 570 | case 11: |
Martin1000 | 5:93f48c84e645 | 571 | lcd_output_auto2(); |
Martin1000 | 5:93f48c84e645 | 572 | if (endpos_close) |
Martin1000 | 5:93f48c84e645 | 573 | { |
Martin1000 | 5:93f48c84e645 | 574 | auto_status = 2; |
Martin1000 | 5:93f48c84e645 | 575 | } |
Martin1000 | 5:93f48c84e645 | 576 | break; |
Martin1000 | 5:93f48c84e645 | 577 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 578 | default: |
Martin1000 | 5:93f48c84e645 | 579 | break; |
Martin1000 | 5:93f48c84e645 | 580 | } |
Martin1000 | 5:93f48c84e645 | 581 | } |
Martin1000 | 5:93f48c84e645 | 582 | // ----------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 583 | void motor_manual(int direction) |
Martin1000 | 5:93f48c84e645 | 584 | { |
Martin1000 | 5:93f48c84e645 | 585 | if (!time_flag) |
Martin1000 | 5:93f48c84e645 | 586 | { |
Martin1000 | 5:93f48c84e645 | 587 | t.reset(); |
Martin1000 | 5:93f48c84e645 | 588 | t.start(); |
Martin1000 | 5:93f48c84e645 | 589 | time_flag = 1; |
Martin1000 | 5:93f48c84e645 | 590 | elapsed_time = 0; |
Martin1000 | 5:93f48c84e645 | 591 | } |
Martin1000 | 5:93f48c84e645 | 592 | elapsed_time = t.read(); |
Martin1000 | 5:93f48c84e645 | 593 | gradient = (duty_cycle_percent-10.0f)/ramp_time; |
Martin1000 | 5:93f48c84e645 | 594 | |
Martin1000 | 5:93f48c84e645 | 595 | if (elapsed_time < ramp_time) |
Martin1000 | 5:93f48c84e645 | 596 | { |
Martin1000 | 5:93f48c84e645 | 597 | duty_cycle_current = 10.0 + elapsed_time * gradient; |
Martin1000 | 5:93f48c84e645 | 598 | } |
Martin1000 | 5:93f48c84e645 | 599 | else |
Martin1000 | 5:93f48c84e645 | 600 | { |
Martin1000 | 5:93f48c84e645 | 601 | duty_cycle_current = duty_cycle_percent; |
Martin1000 | 5:93f48c84e645 | 602 | } |
Martin1000 | 5:93f48c84e645 | 603 | if (direction == OPEN) |
Martin1000 | 5:93f48c84e645 | 604 | { |
Martin1000 | 5:93f48c84e645 | 605 | pwm_open.write(duty_cycle_current/100.0f); |
Martin1000 | 5:93f48c84e645 | 606 | } |
Martin1000 | 5:93f48c84e645 | 607 | if (direction == CLOSE) |
Martin1000 | 5:93f48c84e645 | 608 | { |
Martin1000 | 5:93f48c84e645 | 609 | pwm_close.write(duty_cycle_current/100.0f); |
Martin1000 | 5:93f48c84e645 | 610 | } |
Martin1000 | 5:93f48c84e645 | 611 | lcd_output_manual(); |
Martin1000 | 5:93f48c84e645 | 612 | } |
Martin1000 | 5:93f48c84e645 | 613 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 614 | void motor_auto(int direction) |
Martin1000 | 5:93f48c84e645 | 615 | { |
Martin1000 | 5:93f48c84e645 | 616 | dir = direction; |
Martin1000 | 5:93f48c84e645 | 617 | |
Martin1000 | 5:93f48c84e645 | 618 | if (!time_flag) |
Martin1000 | 5:93f48c84e645 | 619 | { |
Martin1000 | 5:93f48c84e645 | 620 | t.reset(); |
Martin1000 | 5:93f48c84e645 | 621 | t.start(); |
Martin1000 | 5:93f48c84e645 | 622 | time_flag = 1; |
Martin1000 | 5:93f48c84e645 | 623 | elapsed_time = 0; |
Martin1000 | 5:93f48c84e645 | 624 | } |
Martin1000 | 5:93f48c84e645 | 625 | |
Martin1000 | 5:93f48c84e645 | 626 | elapsed_time = t.read(); |
Martin1000 | 5:93f48c84e645 | 627 | gradient = (duty_cycle_percent-10.0f)/ramp_time; |
Martin1000 | 5:93f48c84e645 | 628 | |
Martin1000 | 5:93f48c84e645 | 629 | if (elapsed_time < ramp_time) |
Martin1000 | 5:93f48c84e645 | 630 | { |
Martin1000 | 5:93f48c84e645 | 631 | duty_cycle_current = 10.0 + elapsed_time * gradient; |
Martin1000 | 5:93f48c84e645 | 632 | } |
Martin1000 | 5:93f48c84e645 | 633 | else |
Martin1000 | 5:93f48c84e645 | 634 | { |
Martin1000 | 5:93f48c84e645 | 635 | duty_cycle_current = duty_cycle_percent; |
Martin1000 | 5:93f48c84e645 | 636 | } |
Martin1000 | 5:93f48c84e645 | 637 | if (direction == OPEN) |
Martin1000 | 5:93f48c84e645 | 638 | { |
Martin1000 | 5:93f48c84e645 | 639 | pwm_open.write(duty_cycle_current/100.0f); |
Martin1000 | 5:93f48c84e645 | 640 | } |
Martin1000 | 5:93f48c84e645 | 641 | if (direction == CLOSE) |
Martin1000 | 5:93f48c84e645 | 642 | { |
Martin1000 | 5:93f48c84e645 | 643 | pwm_close.write(duty_cycle_current/100.0f); |
Martin1000 | 5:93f48c84e645 | 644 | } |
Martin1000 | 5:93f48c84e645 | 645 | } |
Martin1000 | 5:93f48c84e645 | 646 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 647 | void motor_off_auto(void) |
Martin1000 | 5:93f48c84e645 | 648 | { |
Martin1000 | 5:93f48c84e645 | 649 | duty_cycle_current = 0; |
Martin1000 | 5:93f48c84e645 | 650 | pwm_close.write(0); |
Martin1000 | 5:93f48c84e645 | 651 | pwm_open.write(0); |
Martin1000 | 5:93f48c84e645 | 652 | } |
Martin1000 | 5:93f48c84e645 | 653 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 654 | void motor_off(void) |
Martin1000 | 5:93f48c84e645 | 655 | { |
Martin1000 | 5:93f48c84e645 | 656 | duty_cycle_current = 0; |
Martin1000 | 5:93f48c84e645 | 657 | pwm_close.write(0); |
Martin1000 | 5:93f48c84e645 | 658 | pwm_open.write(0); |
Martin1000 | 5:93f48c84e645 | 659 | lcd_output_manual(); |
Martin1000 | 5:93f48c84e645 | 660 | } |
Martin1000 | 5:93f48c84e645 | 661 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 662 | void manual_mode(void) |
Martin1000 | 5:93f48c84e645 | 663 | { |
Martin1000 | 5:93f48c84e645 | 664 | auto_status = 0; |
Martin1000 | 5:93f48c84e645 | 665 | //----------------------------------- |
Martin1000 | 5:93f48c84e645 | 666 | if(button_open && !endpos_open) |
Martin1000 | 5:93f48c84e645 | 667 | { |
Martin1000 | 5:93f48c84e645 | 668 | motor_manual(OPEN); |
Martin1000 | 5:93f48c84e645 | 669 | off_flag = 0; |
Martin1000 | 5:93f48c84e645 | 670 | } |
Martin1000 | 5:93f48c84e645 | 671 | //----------------------------------- |
Martin1000 | 5:93f48c84e645 | 672 | if(button_close && !endpos_close) |
Martin1000 | 5:93f48c84e645 | 673 | { |
Martin1000 | 5:93f48c84e645 | 674 | motor_manual(CLOSE); |
Martin1000 | 5:93f48c84e645 | 675 | off_flag = 0; |
Martin1000 | 5:93f48c84e645 | 676 | } |
Martin1000 | 5:93f48c84e645 | 677 | //----------------------------------- |
Martin1000 | 5:93f48c84e645 | 678 | if (off_flag) |
Martin1000 | 5:93f48c84e645 | 679 | { |
Martin1000 | 5:93f48c84e645 | 680 | motor_off(); |
Martin1000 | 5:93f48c84e645 | 681 | off_flag = 0; |
Martin1000 | 5:93f48c84e645 | 682 | time_flag = 0; |
Martin1000 | 5:93f48c84e645 | 683 | } |
Martin1000 | 5:93f48c84e645 | 684 | } |
Martin1000 | 5:93f48c84e645 | 685 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 686 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 687 | // ---------------------------------------------------------------------------- |
Martin1000 | 5:93f48c84e645 | 688 | int main() |
Martin1000 | 5:93f48c84e645 | 689 | { |
Martin1000 | 5:93f48c84e645 | 690 | initialize(); |
Martin1000 | 5:93f48c84e645 | 691 | lcd_output_start(); |
Martin1000 | 5:93f48c84e645 | 692 | while (1) |
Martin1000 | 5:93f48c84e645 | 693 | { |
Martin1000 | 5:93f48c84e645 | 694 | read_inputs(); |
Martin1000 | 5:93f48c84e645 | 695 | state_to_usb(); |
Martin1000 | 5:93f48c84e645 | 696 | monitor_output(); |
Martin1000 | 5:93f48c84e645 | 697 | endpos_led(); |
Martin1000 | 5:93f48c84e645 | 698 | |
Martin1000 | 5:93f48c84e645 | 699 | off_flag = 1; // to prevent display flicker |
Martin1000 | 5:93f48c84e645 | 700 | |
Martin1000 | 5:93f48c84e645 | 701 | if (!switch_auto) // manual mode |
Martin1000 | 5:93f48c84e645 | 702 | { |
Martin1000 | 5:93f48c84e645 | 703 | manual_mode(); |
Martin1000 | 5:93f48c84e645 | 704 | } |
Martin1000 | 5:93f48c84e645 | 705 | if (switch_auto) // auto mode |
Martin1000 | 5:93f48c84e645 | 706 | { |
Martin1000 | 5:93f48c84e645 | 707 | automatic(); |
Martin1000 | 5:93f48c84e645 | 708 | } |
Martin1000 | 5:93f48c84e645 | 709 | } |
Martin1000 | 5:93f48c84e645 | 710 | } |