2 * Copyright Droids Corporation (2009)
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Revision : $Id: actuator.c,v 1.4 2009-04-24 19:30:41 zer0 Exp $
23 #include <aversive/pgmspace.h>
24 #include <aversive/wait.h>
25 #include <aversive/error.h>
30 #include <encoders_spi.h>
33 #include <scheduler.h>
34 #include <clock_time.h>
38 #include <control_system_manager.h>
39 #include <blocking_detection_manager.h>
44 #include "../common/i2c_commands.h"
54 static volatile uint8_t spickle_state = OFF;
55 static volatile uint32_t spickle_pos_up = 35000;
56 static volatile uint32_t spickle_pos_down = 0;
57 static volatile uint32_t spickle_delay_up = 500;
58 static volatile uint32_t spickle_delay_down = 2000;
59 static volatile uint32_t delay = 0;
60 static volatile int32_t spickle_k1 = 500, spickle_k2 = 20;
61 static volatile int32_t spickle_cmd = 0;
63 /* init spickle position at beginning */
64 static void spickle_autopos(void)
66 pwm_ng_set(LEFT_SPICKLE_PWM, -500);
68 pwm_ng_set(LEFT_SPICKLE_PWM, 0);
69 encoders_spi_set_value(LEFT_SPICKLE_ENCODER, 0);
72 /* set CS command for spickle */
73 void spickle_set(void *mot, int32_t cmd)
75 static int32_t oldpos_left, oldpos_right;
76 int32_t oldpos, pos, maxcmd, speed;
78 if (mot == LEFT_SPICKLE_PWM) {
79 pos = encoders_spi_get_value(LEFT_SPICKLE_ENCODER);
83 pos = encoders_spi_get_value(RIGHT_SPICKLE_ENCODER);
84 oldpos = oldpos_right;
88 if (speed > 0 && cmd < 0)
90 else if (speed < 0 && cmd > 0)
94 maxcmd = spickle_k1 + spickle_k2 * speed;
98 else if (cmd < -maxcmd)
101 pwm_ng_set(mot, cmd);
103 if (mot == LEFT_SPICKLE_PWM)
109 void spickle_set_coefs(uint32_t k1, uint32_t k2)
115 void spickle_set_delays(uint32_t delay_up, uint32_t delay_down)
117 spickle_delay_up = delay_up;
118 spickle_delay_down = delay_down;
121 void spickle_set_pos(uint32_t pos_up, uint32_t pos_down)
123 spickle_pos_up = pos_up;
124 spickle_pos_down = pos_down;
127 void spickle_dump_params(void)
129 printf_P(PSTR("coef %ld %ld\r\n"), spickle_k1, spickle_k2);
130 printf_P(PSTR("pos %ld %ld\r\n"), spickle_pos_up, spickle_pos_down);
131 printf_P(PSTR("delay %ld %ld\r\n"), spickle_delay_up, spickle_delay_down);
134 void spickle_up(void)
137 cs_set_consign(&cobboard.left_spickle.cs, spickle_pos_up);
140 void spickle_down(void)
143 cs_set_consign(&cobboard.left_spickle.cs, spickle_pos_down);
146 void spickle_stop(void)
151 void spickle_auto(void)
153 spickle_state = WAIT_SENSOR;
154 cs_set_consign(&cobboard.left_spickle.cs, spickle_pos_up);
157 /* for spickle auto mode */
158 static void spickle_cb(__attribute__((unused)) void *dummy)
160 static uint8_t prev = 0;
163 val = sensor_get(S_LCOB);
165 switch (spickle_state) {
170 delay = spickle_delay_up;
171 spickle_state = SENSOR_OK;
176 cs_set_consign(&cobboard.left_spickle.cs, spickle_pos_down);
177 spickle_state = WAIT_DOWN;
178 delay = spickle_delay_down;
183 cs_set_consign(&cobboard.left_spickle.cs, spickle_pos_up);
184 spickle_state = WAIT_SENSOR;
193 void spickle_init(void)
197 scheduler_add_periodical_event_priority(spickle_cb, NULL,
198 1000L / SCHEDULER_UNIT,