Skip to content
Snippets Groups Projects
Potenciometr.h 1.16 KiB
Newer Older
#pragma once

#include <stdint.h>

#include <avr/io.h>

class Potenciometr
{
    private:
        enum
        {
            ADC_BUFFER_SIZE = 10
        };

        volatile uint8_t attempt;

    public:
        volatile uint16_t buffer[ADC_BUFFER_SIZE];
        volatile uint16_t adc_value;

    public:
        Potenciometr()
        {
            adc_ini();
        };

        void adc_ini()
        {
            //55kHz, 2.56V reference
            ADMUX  = (1<<REFS1) | (1<<REFS1);
            ADCSRA = (1<<ADEN)  | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1);

            //cca 13Hz
            TCCR0  = (1<<CS01) | (1<<CS00);
            TIMSK |= (1<<TOIE0);
        };

        void irq_handler()
        {
            buffer[attempt++] = ADC;

            if(attempt >= ADC_BUFFER_SIZE)
            {
                uint16_t adc_sum = 0;

                for (uint8_t i = 0; i < ADC_BUFFER_SIZE; i++)
                {
                    adc_sum += buffer[i];
                }

                adc_value = adc_sum / ADC_BUFFER_SIZE;

                attempt = 0;
            }
        };

        void start_conversion()
        {
            ADCSRA |= (1<<ADSC);
        };
};