ADC revised

This commit is contained in:
Tristan Krause 2019-04-03 14:09:58 +02:00
parent f9e56b44f3
commit 2d26632f41
9 changed files with 42 additions and 17 deletions

View file

@ -11,9 +11,9 @@ set label at 4,7 'U_{GS} [V] = 480' left
set label at 3,13 'U_{GS} [V] = 500' left set label at 3,13 'U_{GS} [V] = 500' left
set label at 2,22 'U_{GS} [V] = 520' left set label at 2,22 'U_{GS} [V] = 520' left
set label at 1,32 'U_{GS} [V] = 540' left set label at 1,32 'U_{GS} [V] = 540' left
set label at 0,41 'U_{GS} [V] = 560' left set label at 0,39 'U_{GS} [V] = 560' left
set label at 0,42 'U_{GS} [V] = 580' left set label at 0,39 'U_{GS} [V] = 580' left
set label at 0,42 'U_{GS} [V] = 600' left set label at 0,39 'U_{GS} [V] = 600' left
unset output unset output
set terminal qt set terminal qt
unset output unset output

Binary file not shown.

View file

@ -158,9 +158,9 @@ void testFunktionen()
int main() int main()
{ {
testFunktionen(); //testFunktionen();
//kennlinieZweiterQuadrant(); //kennlinieZweiterQuadrant();
//kennlinieErsterQuadrant(); kennlinieErsterQuadrant();
std::cout << "Schluss." << std::endl; std::cout << "Schluss." << std::endl;
} }

Binary file not shown.

Binary file not shown.

View file

@ -5,23 +5,28 @@ void ADU::init() volatile
// externe Referenz an AREF // externe Referenz an AREF
ADMUX = 0; ADMUX = 0;
// ADC aktiviert, prescaler = 128 // ADC aktiviert, Interruptbetrieb, prescaler = 128
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); ADCSRA = _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
}
void ADU::handleConversionComplete() volatile
{
active = false;
} }
uint16_t ADU::getValue(uint8_t channel) volatile uint16_t ADU::getValue(uint8_t channel) volatile
{ {
while(active);
active = true;
// lege Kanal fest // lege Kanal fest
ADMUX = (ADMUX & 0xE0) | channel; ADMUX = (ADMUX & 0xE0) | channel;
// starte Konvertierung // starte Konvertierung
ADCSRA |= _BV(ADSC); ADCSRA |= _BV(ADSC);
// warte Konvertierungszeit ab // warte auf Ende der Konvertierung
_delay_us(13 * 1000000 * 128 / F_CPU + 1); while(active);
// warte auf Ende
while(ADCSRA & _BV(ADSC));
return ADCW; return ADCW;
} }

View file

@ -2,14 +2,29 @@
#define ADC_H #define ADC_H
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
class ADU class ADU
{ {
public: public:
/**
* Konfiguriert die ADC Register
*/
void init(void) volatile; void init(void) volatile;
uint16_t getValue(uint8_t) volatile;
/**
* Behandlungsroutine für ADC interrupt
*/
void handleConversionComplete(void) volatile;
/**
* Startet eine AD Konvertierung, wartet auf Abschluss und liefert Ergebnis
* \param channel Auswahl des ADC Kanals (0-7), Kanal 6 und 7 sind Poti R36 und R37
*/
uint16_t getValue(uint8_t channel) volatile;
private:
volatile bool active = false;
}; };
#endif // ADC_H #endif // ADC_H

View file

@ -15,3 +15,8 @@ ISR(SPI_STC_vect)
{ {
spi.handleTransfer(); spi.handleTransfer();
} }
ISR(ADC_vect)
{
adu.handleConversionComplete();
}

View file

@ -9,10 +9,10 @@ void SPI::init() const volatile
// Konfiguriere DMUX DDRs // Konfiguriere DMUX DDRs
DDRD |= _BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3); DDRD |= _BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3);
// aktiviere SPI, Master Modus, SPI Modus 0 // aktiviere SPI, Interruptbetrieb, Master Modus, SPI Modus 0
// F_SPI = F_CPU / 2 (prescaler 2) // F_SPI = F_CPU / 2 (prescaler 2)
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPIE); SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPIE);
SPSR = _BV(SPI2X) | _BV(SPIF); SPSR = _BV(SPI2X);
// waehle keinen SPI Slave aus // waehle keinen SPI Slave aus
setAdr(SPIADR::NONE); setAdr(SPIADR::NONE);