fw: Implement battery voltage readout
This commit is contained in:
parent
475c9cdd4a
commit
9e9e2ff5c4
@ -3,7 +3,7 @@ CFLAGS=-g -Wall -Wno-multichar -Wno-overflow -mcall-prologues -mmcu=$(MCU) -O2 -
|
||||
LDFLAGS=-Wl,-gc-sections -Wl,-relax
|
||||
CC=avr-gcc
|
||||
TARGET=main
|
||||
OBJECT_FILES=main.o input.o systick.o oled-display/font.o oled-display/i2c.o oled-display/lcd.o
|
||||
OBJECT_FILES=main.o batmon.o input.o systick.o oled-display/font.o oled-display/i2c.o oled-display/lcd.o
|
||||
|
||||
all: $(TARGET).hex
|
||||
|
||||
|
25
firmware/batmon.c
Normal file
25
firmware/batmon.c
Normal file
@ -0,0 +1,25 @@
|
||||
#include <avr/io.h>
|
||||
#include "batmon.h"
|
||||
|
||||
void batmon_init()
|
||||
{
|
||||
ADCSRA = (1 << ADPS2) | (1 << ADPS1); // 125 kHz ADC clock
|
||||
ADMUX = ADC_CHANNEL | (1 << REFS0) | (1 << REFS1) | (1 << ADLAR); // Internal 1.2V bandgap, left adj.
|
||||
ADCSRB = 0; // Manual start
|
||||
#if ADC_CHANNEL < 7
|
||||
DIDR0 = (1 << ADC_CHANNEL); // Disconnect digital channel
|
||||
#endif
|
||||
|
||||
// Enable voltage divider
|
||||
PORT_ADCC(DDR) |= PIN_ADCC;
|
||||
PORT_ADCC(PORT) &= ~PIN_ADCC;
|
||||
|
||||
// Enable ADC
|
||||
ADCSRA |= (1 << ADEN);
|
||||
}
|
||||
|
||||
inline uint8_t batmon_get_voltage()
|
||||
{
|
||||
ADCSRA |= (1 << ADSC); // TODO: Check whether this increases the power consumption of the chip by much
|
||||
return ADCH;
|
||||
}
|
12
firmware/batmon.h
Normal file
12
firmware/batmon.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef BATMON_H
|
||||
#define BATMON_H
|
||||
#include <avr/io.h>
|
||||
|
||||
#define ADC_CHANNEL 0
|
||||
#define PORT_ADCC(t) t##D
|
||||
#define PIN_ADCC (1 << 1)
|
||||
|
||||
void batmon_init();
|
||||
uint8_t batmon_get_voltage();
|
||||
|
||||
#endif // BATMON_H
|
@ -5,6 +5,7 @@
|
||||
#include "oled-display/lcd.h"
|
||||
#include "input.h"
|
||||
#include "systick.h"
|
||||
#include "batmon.h"
|
||||
|
||||
#define PORT_SPI(t) t##B
|
||||
#define PIN_SPI_CS (1 << 2)
|
||||
@ -33,7 +34,7 @@ uint8_t spi_proc()
|
||||
if (SPSR & (1 << SPIF)) {
|
||||
switch (y) {
|
||||
case Y_MAX - 1:
|
||||
spdr_next = 55; // TODO: Vbat
|
||||
spdr_next = batmon_get_voltage();
|
||||
break;
|
||||
}
|
||||
SPDR = spdr_next;
|
||||
@ -86,6 +87,7 @@ int main()
|
||||
spi_init();
|
||||
systick_init();
|
||||
input_init();
|
||||
batmon_init();
|
||||
|
||||
_delay_ms(10);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user