Project

General

Profile

Statistics
| Revision:

root / trunk / code / lib / src / libdragonfly / battery.c @ 241

History | View | Annotate | Download (3.78 KB)

1
/**
2
 * Copyright (c) 2007 Colony Project
3
 * 
4
 * Permission is hereby granted, free of charge, to any person
5
 * obtaining a copy of this software and associated documentation
6
 * files (the "Software"), to deal in the Software without
7
 * restriction, including without limitation the rights to use,
8
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
9
 * copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following
11
 * conditions:
12
 * 
13
 * The above copyright notice and this permission notice shall be
14
 * included in all copies or substantial portions of the Software.
15
 * 
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
 * OTHER DEALINGS IN THE SOFTWARE.
24
 **/
25

    
26

    
27
/**
28
 * @file battery.c
29
 * @brief Implementation for reading battery level
30
 *
31
 * Contains functions for reading the battery level.
32
 *
33
 * @author Colony Project, CMU Robotics Club
34
 **/
35

    
36
#include "battery.h"
37
#include "analog.h"
38

    
39
//Constants for Battery
40
//Constants determined experimentally 2/9/2007 - James Kong
41
//See Battery8_data.xls for experiment data
42
#define BATTERY_NEXT_READ_PRESCALAR 5
43
#define MAX_LOW_COUNT 5
44

    
45
//global variables
46
int battery_low_count;
47

    
48
/**
49
 * @defgroup battery Battery
50
 * @brief Functions for reading battery voltage.
51
 * 
52
 * Contains functions for checking the current
53
 * voltage of the battery. Include battery.h to
54
 * access these functions.
55
 *
56
 * @{
57
 **/
58

    
59
/**
60
 * Returns the voltage of the battery as an analog8
61
 * reading. 128 is approximately 5 volts. analog_init
62
 * must be called before using this function.
63
 *
64
 * @return the voltage of the battery as an analog8
65
 * reading
66
 *
67
 * @see analog_init, battery, analog8
68
 **/
69
int battery8(void)
70
{
71
  return analog8(BATT_PORT);
72
}
73

    
74
/**
75
 * Returns the voltage of the battery in deciVolts.
76
 * analog_init must be called before using this function.
77
 *
78
 * @return the voltage of the battery in deciVolts.
79
 *
80
 * @see analog_init, battery8
81
 **/
82
int battery(void)
83
{
84
  /* 5 volts is the max, 255 is the max 8bit number , *2 for the divider */
85
        return analog8(BATT_PORT) * 500 >>7;
86
}
87

    
88

    
89
/**
90
 * Checks if the battery is low. analog_init must be called before
91
 * this function can be used. This function waits for several low
92
 * battery readings in a row to avoid false positives.
93
 *
94
 * @return 1 if the battery is low, 0 otherwise
95
 *
96
 * @see analog_init
97
 **/
98
char battery_low(void)
99
{
100
  static char next_read = 0;
101
  static char ret = 0;
102
  
103
  int batt_reading = battery8();
104

    
105
  if(next_read == 0) {
106
    if(batt_reading > BATTERY_LOWV)
107
    {
108
        ret = 0;
109
        battery_low_count = 0;
110
    }
111
    else
112
    {
113
        battery_low_count++;
114
        if( battery_low_count >= MAX_LOW_COUNT )
115
        {
116
            ret = 1;
117
            battery_low_count = 0;
118
        }
119
    }
120
    
121
    next_read = BATTERY_NEXT_READ_PRESCALAR;
122
  }
123
  else next_read--;
124
  
125
  return ret;
126
}
127

    
128
/**
129
 * Averages n_samples battery8 readings. This function may
130
 * take a while to complete, and is only made available
131
 * for convenience. analog_init must be called before this
132
 * function may be used.
133
 *
134
 * @param n_samples the number of times to sample the battery voltage
135
 *
136
 * @return the average reading for the battery voltage, where 128
137
 * is approximately 5 Volts.
138
 *
139
 * @see analog_init, battery
140
 **/
141
int battery8_avg(int n_samples)
142
{
143
  int i;
144
  long int sum = 0;
145
  
146
  for(i = 0; i < n_samples; i++) {
147
    sum += battery8();
148
  }
149
  
150
  return (int)(sum / n_samples);
151
}
152

    
153
/** @} **/ //end defgroup
154