mirror of
git://projects.qi-hardware.com/antorcha.git
synced 2024-12-22 18:54:16 +02:00
tornado/fw/: acceleration sensor "driver"
This commit is contained in:
parent
7b766ed93c
commit
8c868198ed
@ -31,7 +31,7 @@ OBJCOPY = $(AVR_PREFIX)objcopy
|
||||
#OBJDUMP = $(AVR_PREFIX)objdump
|
||||
SIZE = $(AVR_PREFIX)size
|
||||
|
||||
OBJS = $(NAME).o led.o $(COMMON_OBJS)
|
||||
OBJS = $(NAME).o accel.o led.o $(COMMON_OBJS)
|
||||
BOOT_OBJS = boot.o $(COMMON_OBJS)
|
||||
COMMON_OBJS =
|
||||
|
||||
|
109
tornado/fw/accel.c
Normal file
109
tornado/fw/accel.c
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* fw/accel.c - Acceleration sensor
|
||||
*
|
||||
* Written 2012 by Werner Almesberger
|
||||
* Copyright 2012 Werner Almesberger
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#define F_CPU 8000000UL
|
||||
#include <util/delay.h>
|
||||
|
||||
#include "io.h"
|
||||
#include "accel.h"
|
||||
|
||||
|
||||
void (*sample)(uint16_t x, uint16_t y) = NULL;
|
||||
|
||||
|
||||
static bool chan_x;
|
||||
|
||||
|
||||
static inline void admux(bool x)
|
||||
{
|
||||
ADMUX =
|
||||
1 << REFS0 | /* Vref is AVcc */
|
||||
(x ? ADC_X : ADC_Y);
|
||||
}
|
||||
|
||||
|
||||
static inline void adcsra(bool start)
|
||||
{
|
||||
/*
|
||||
* The ADC needs to run at clkADC <= 200 kHz for full resolution.
|
||||
* At clkADC = 125 kHz, a conversion takes about 110 us.
|
||||
*/
|
||||
ADCSRA =
|
||||
1 << ADEN | /* enable ADC */
|
||||
(start ? 1 << ADSC : 0) |
|
||||
1 << ADIE | /* enable ADC interrupts */
|
||||
6; /* clkADC = clk/64 -> 125 kHz */
|
||||
}
|
||||
|
||||
|
||||
uint16_t measure_ref(void)
|
||||
{
|
||||
while (ADCSRA & (1 << ADSC));
|
||||
adcsra(0);
|
||||
ADMUX =
|
||||
1 << REFS0 | /* Vref is AVcc */
|
||||
14; /* Vbg (1.1 V) */
|
||||
_delay_us(100);
|
||||
adcsra(1);
|
||||
while (ADCSRA & (1 << ADSC));
|
||||
return ADC;
|
||||
}
|
||||
|
||||
|
||||
ISR(ADC_vect)
|
||||
{
|
||||
static uint16_t last_x;
|
||||
uint16_t v;
|
||||
|
||||
v = ADC;
|
||||
|
||||
if (chan_x) {
|
||||
last_x = v;
|
||||
chan_x = 0;
|
||||
admux(0);
|
||||
adcsra(1);
|
||||
} else {
|
||||
sample(last_x, v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ISR(TIMER0_OVF_vect)
|
||||
{
|
||||
chan_x = 1;
|
||||
admux(1);
|
||||
adcsra(1);
|
||||
}
|
||||
|
||||
|
||||
void accel_start(void)
|
||||
{
|
||||
adcsra(0);
|
||||
|
||||
TCNT0 = 0;
|
||||
OCR0A = 62; /* 8 MHz/64/62 = 2.02 kHz */
|
||||
TCCR0A =
|
||||
1 << WGM01 | /* WG Mode 7 (Fast PWM to OCR0A) */
|
||||
1 << WGM00;
|
||||
TCCR0B =
|
||||
1 << WGM02 | /* WG Mode 7, continued */
|
||||
1 << CS01 | /* clkIO/64 */
|
||||
1 << CS00;
|
||||
TIMSK0 = 1 << TOIE0; /* interrupt on overflow */
|
||||
}
|
26
tornado/fw/accel.h
Normal file
26
tornado/fw/accel.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* fw/accel.h - Acceleration sensor
|
||||
*
|
||||
* Written 2012 by Werner Almesberger
|
||||
* Copyright 2012 Werner Almesberger
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ACCEL_H
|
||||
#define ACCEL_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
extern void (*sample)(uint16_t x, uint16_t y);
|
||||
|
||||
|
||||
uint16_t measure_ref(void);
|
||||
void accel_start(void);
|
||||
|
||||
#endif /* !ACCEL_H */
|
Loading…
Reference in New Issue
Block a user