|
5 | 5 | /* end-effector driver |
6 | 6 | * |
7 | 7 | */ |
| 8 | + |
8 | 9 | /*************** servo mode ****************/ |
9 | 10 | float duty_ms = 1.51; |
10 | 11 | static void servo_init(void){ |
@@ -500,23 +501,107 @@ static int getAnalogPinValue(unsigned int pin) |
500 | 501 | /* pump |
501 | 502 | * |
502 | 503 | */ |
| 504 | +#define VALVE_ON_TIMES_MAX 10 |
| 505 | + |
| 506 | +pump_state_t pump_state = PUMP_STATE_OFF; |
| 507 | + |
| 508 | +void pump_set_state(pump_state_t state) |
| 509 | +{ |
| 510 | + if (state >= PUMP_STATE_COUNT) |
| 511 | + return; |
| 512 | + |
| 513 | + pump_state = state; |
| 514 | +} |
| 515 | +pump_state_t pump_get_state() |
| 516 | +{ |
| 517 | + return pump_state; |
| 518 | +} |
| 519 | + |
| 520 | + |
503 | 521 | void pump_on(void){ |
504 | 522 | DDRG |= 0x10; // PG4 PUMP_D5_N |
505 | 523 | DDRG |= 0x20; // PG5 PUMP_D5 |
506 | 524 |
|
507 | 525 | PORTG |= 0x10; |
508 | 526 | PORTG &= (~0x20); |
| 527 | + |
| 528 | + |
| 529 | + pump_set_state(PUMP_STATE_ON); |
509 | 530 | } |
510 | 531 |
|
511 | 532 | void pump_off(void){ |
512 | | - DDRG |= 0x10; // PG4 PUMP_D5_N |
513 | | - DDRG |= 0x20; // PG5 PUMP_D5 |
| 533 | + if (pump_get_state() == PUMP_STATE_ON) |
| 534 | + { |
| 535 | + |
| 536 | + DDRG |= 0x10; // PG4 PUMP_D5_N |
| 537 | + DDRG |= 0x20; // PG5 PUMP_D5 |
| 538 | + |
| 539 | + PORTG &= (~0x10); |
| 540 | + PORTG |= 0x20; |
| 541 | + |
| 542 | + |
| 543 | + pump_set_state(PUMP_STATE_VALVE_ON); |
| 544 | + } |
| 545 | +} |
| 546 | +void pump_tick(void) |
| 547 | +{ |
| 548 | + static uint8_t valve_on_times = 0; |
| 549 | + #define HARD_MASK ( 1<<6 | 1<<5 | 1<<4 | 1<<3 ) |
| 550 | + |
| 551 | + |
| 552 | + switch (pump_state) |
| 553 | + { |
| 554 | + case PUMP_STATE_OFF: |
| 555 | + valve_on_times = 0; |
| 556 | + break; |
| 557 | + |
| 558 | + case PUMP_STATE_ON: |
| 559 | + valve_on_times = 0; |
| 560 | + break; |
| 561 | + |
| 562 | + case PUMP_STATE_VALVE_ON: |
| 563 | + valve_on_times++; |
| 564 | + PORTG |= 0x20; |
| 565 | + |
| 566 | + if ( (PINJ & HARD_MASK) >0x00) |
| 567 | + { |
| 568 | + if (valve_on_times >= VALVE_ON_TIMES_MAX*10) |
| 569 | + { |
| 570 | + valve_on_times = 0; |
| 571 | + PORTG &= (~0x20); |
| 572 | + pump_state = PUMP_STATE_OFF; |
| 573 | + |
| 574 | + } |
| 575 | + } |
| 576 | + else |
| 577 | + { |
| 578 | + |
| 579 | + delay_ms(50); |
| 580 | + if (valve_on_times >= VALVE_ON_TIMES_MAX) |
| 581 | + { |
| 582 | + valve_on_times = 0; |
| 583 | + pump_state = PUMP_STATE_OFF; |
| 584 | + } |
| 585 | + else |
| 586 | + { |
| 587 | + pump_state = PUMP_STATE_VALVE_OFF; |
| 588 | + } |
| 589 | + |
| 590 | + } |
| 591 | + break; |
| 592 | + |
| 593 | + case PUMP_STATE_VALVE_OFF: |
| 594 | + PORTG &= (~0x20); |
| 595 | + delay_ms(50); |
| 596 | + pump_state = PUMP_STATE_VALVE_ON; |
| 597 | + |
| 598 | + break; |
514 | 599 |
|
515 | | - PORTG &= (~0x10); |
516 | | - PORTG |= 0x20; |
517 | 600 |
|
| 601 | + } |
518 | 602 | } |
519 | 603 |
|
| 604 | + |
520 | 605 | uint8_t get_pump_status(void){ |
521 | 606 | if( (PORTG & 0x10) == 0x00 ){ return 0; } |
522 | 607 | uint16_t value = analogRead(A9); |
|
0 commit comments