This repository has been archived by the owner on Oct 11, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
h-bridge.c
91 lines (79 loc) · 2.27 KB
/
h-bridge.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* Copyright (C) 2010 Richard Barlow
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <io.h>
#include "h-bridge.h"
#include "leds.h"
#define M_BL (1<<0)
#define M_TL (1<<4)
#define M_BR (1<<3)
#define M_TR (1<<1)
#define M_OUTPUTS (M_BL | M_TL | M_BR | M_TR)
static h_bridge_state_t state;
void h_bridge_init(void) {
/* Set H-bridge to be off by default */
h_bridge_set(M_OFF);
P4OUT &= ~M_OUTPUTS;
P4DIR |= M_OUTPUTS;
}
void h_bridge_set(h_bridge_state_t s) {
/* All state changes first disable the PWM output then the
* low-side output. Enabling is done in reverse. */
switch (s) {
default:
case M_OFF:
/* Disable both high-side PWM FETs */
P4SEL &= ~(M_TL | M_TR);
/* Disable both low-side FETs */
P4OUT &= ~(M_BL | M_BR);
/* Disable both LEDs */
led_pwm(LED_M_FWD, 0);
led_pwm(LED_M_REV, 0);
break;
case M_FWD:
/* Disable 'reverse' FETs */
P4SEL &= ~M_TR;
P4OUT &= ~M_BL;
/* Enable 'forward' FETs */
P4OUT |= M_BR;
P4SEL |= M_TL;
/* Disable 'reverse' LED, enable 'forward' LED */
led_pwm(LED_M_REV, 0);
led_pwm(LED_M_FWD, 1);
break;
case M_REV:
/* Disable 'forward' FETs */
P4SEL &= ~M_TL;
P4OUT &= ~M_BR;
/* Enable 'reverse' FETs */
P4OUT |= M_BL;
P4SEL |= M_TR;
/* Disable 'forward' LED, enable 'reverse' LED */
led_pwm(LED_M_FWD, 0);
led_pwm(LED_M_REV, 1);
break;
case M_BRAKE:
/* Disable both high-side PWM FETs */
P4SEL &= ~(M_TL | M_TR);
/* Enable both low-side FETs */
P4OUT |= (M_BL | M_BR);
/* Disable both LEDs */
led_pwm(LED_M_FWD, 0);
led_pwm(LED_M_REV, 0);
break;
}
state = s;
}
h_bridge_state_t h_bridge_get(void) {
return state;
}