From 390bf9ad86db418872c7842bf042f9fea22ce476 Mon Sep 17 00:00:00 2001 From: Florent Duchon Date: Sun, 24 Mar 2013 15:37:42 +0100 Subject: digital/beacon: add lol-v2 unitary tests programs --- digital/beacon/tests/motor/motor.c | 139 +++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 digital/beacon/tests/motor/motor.c (limited to 'digital/beacon/tests/motor/motor.c') diff --git a/digital/beacon/tests/motor/motor.c b/digital/beacon/tests/motor/motor.c new file mode 100644 index 00000000..e8eae9f4 --- /dev/null +++ b/digital/beacon/tests/motor/motor.c @@ -0,0 +1,139 @@ +/* motor.c */ +/* Motor control. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include "print.h" +#include "motor.h" + +motor_s motor; + +/* This function initializes the motor control output */ +void motor_init(void) +{ + /* Select ouptut */ + DDRB |= (1<= MOTOR_SPEED_MAX) + OCR0A = MOTOR_SPEED_MAX; + else if(value <= MOTOR_SPEED_STOP) + OCR0A = MOTOR_SPEED_STOP; + else + OCR0A = value; +} + +/* This function returns the motor speed in raw format */ +uint8_t motor_get_speed_raw() +{ + return OCR0A; +} + +/* This function returns the motor state */ +TMotor_state motor_get_state(void) +{ + if(OCR0A > MOTOR_SPEED_MIN) + return MOTOR_IN_ROTATION; + else + return MOTOR_STOPPED; +} + +/* This function starts or stops the motor according to the current state */ +void motor_start_stop_control(void) +{ + if(motor_get_state() == MOTOR_IN_ROTATION) + { + motor_stop(); + } + else + { + motor_start(); + } +} + +/* This function sets the target speed */ +void motor_set_target_speed(uint8_t value) +{ + motor.target_speed = value; +} + +/* This function returns the target speed */ +uint8_t motor_get_target_speed() +{ + return motor.target_speed; +} + +/* This function control the motor speed accroding to target speed requested */ +void motor_control_speed(uint16_t time) +{ + int16_t diff = 0; + int16_t correction = 0; + + diff = motor_get_target_speed() - time; + + if(diff > 15) + correction = motor_get_speed_raw() - 5; + else if (diff < -15) + correction = motor_get_speed_raw() + 5; + else + correction = motor_get_speed_raw(); + + motor_set_speed(correction); + +} + +ISR(TIMER0_COMPA_vect) +{ +} \ No newline at end of file -- cgit v1.2.3