Zrobiłem sobie takie uśrednienie:
No i skacze- co 2/100V.
Tu cały kod- jakby się komuś chciało czytać:
A chciałbym zeby pomiar nie skakał.
Może to przez to dzielenie przez dwa.
A może to wcale nie jest uśrednienie- tylko tak mi się wydaje.
volatile int ADC_sr;
//*******************
ISR(ADC_vect)
{
int ADC_nowe;
ADC_nowe=ADC;
ADC_sr=(ADC_sr+ADC_nowe)/2;
}
No i skacze- co 2/100V.
Tu cały kod- jakby się komuś chciało czytać:
#include <stdint.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "HD44780.h" //to jest radzia
#include "TWI.h" //i to też jest radzia
#define LICZBA_KANALOW 4 //cztery kanały- tu można zwiększyć ilość kanałów
#define PCF8574ADDR 0x20 // to też teraz chwilowo nieważne
volatile uint8_t flaga_pomiaru;
volatile uint8_t flaga_silnika;
volatile int ADC_sr;
unsigned int napiecie[LICZBA_KANALOW];
//prototypy funkcji
unsigned int debounce(void);
void SetAdcKanal(void);
uint8_t advance_step(int8_t nsteps);
int main(void) // tu jest początek main() i tu ustawiamy konfigurację rejestrów
{
char buffer_nap[LICZBA_KANALOW];
char *text="Kolejne";
char *text1="testy";
uint8_t i=0;
// uint8_t stany;
sei();
DDRB=255;
PORTB=255;
DDRC=0;
PORTC=0xf0;
TCCR0=_BV(CS00)|_BV(CS02);// TIMER0 przepełnia się co 16ms
ADMUX = _BV(REFS0)|_BV(REFS1) ;//Wewnętrzne źródło napięcia odniesienia-ok.2.56V
ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);//
TIMSK=_BV(TOIE0);
TWSR = 0; //******** ustawianie I2C
TWBR=72;
LCD_Initalize();
LCD_WriteText(text);
LCD_GoTo(0,1);
LCD_WriteText(text1);
_delay_ms(300);
LCD_GoTo(0,0);
LCD_WriteText(" ");
LCD_GoTo(0,1);
LCD_WriteText(" ");
LCD_GoTo(5,0);
LCD_WriteText("V");
LCD_GoTo(5,1);
LCD_WriteText("V");
LCD_GoTo(12,0);
LCD_WriteText("A aku");
LCD_GoTo(12,1);
LCD_WriteText("V foto");
while(1) //A tu zaczyna się nieskończona pętla
{
if(flaga_pomiaru>=8)//***************Tu sprawdzamy flagę i dlatego ten fragment wykonuje się co 1/4s
{
for(i = 0; i < LICZBA_KANALOW; i++)//pętla pomysłu gaskoina- trochę niewygodna- ale co zrobić jak dobra
{
if(i<2)
{
LCD_GoTo(0,i);
LCD_GoTo(0,i);
}
else
{
LCD_GoTo(7,i-2);
LCD_GoTo(7,i-2);
}
LCD_WriteText(dtostrf(napiecie[i]/50.0,5,2,buffer_nap));
}
flaga_pomiaru=0; // A tu flagę kasujemy- po 1/4s znowu się ustawi
SetAdcKanal();
} //Tu się kończy ten fragment co się wykonuje co 1/4s
//************* a tu silniczek się kręci w stronę słońca- sprawdzając napięcie na fotoopornikach
if(flaga_silnika)// co 16ms/2=8ms
{
if(napiecie[1]+5<napiecie[3])
{
twistart();
twiwrite(0x40 | (PCF8574ADDR << 1));
twiwrite(advance_step(1)|0x0f);
twistop();
}
if(napiecie[3]+5<=napiecie[1])
{
twistart();
twiwrite(0x40 | (PCF8574ADDR << 1));
twiwrite(advance_step(-1)|0x0f);
twistop();
}
flaga_silnika=0;
}
}
}
ISR(ADC_vect)
{
int ADC_nowe;
ADC_nowe=ADC;
ADC_sr=(ADC_sr+ADC_nowe)/2;
}
ISR(TIMER0_OVF_vect) // no ale przerwanie od TIMER0 też wykorzystamy- do pomiaru i silnika
{
TCNT0=127;
flaga_silnika++;
flaga_pomiaru++;
}
//***********************Program Dr_Vee do sterowania silnika- nieco zmieniony
enum { NUM_STEPS = 8 };
enum { STEP_MASK = 0xf0 };
// Układ I2C: A B C D x x x x
static const uint8_t steps[NUM_STEPS] =
{
0b10000000, 0b11000000, 0b01000000, 0b01100000, 0b00100000, 0b00110000, 0b00010000, 0b10010000
};
// obrót o 1/2 kroku w prawo: advance_step(1)
// obrót o 1/2 kroku w lewo: advance_step(-1)
uint8_t advance_step(int8_t nsteps)
{
static uint8_t stepNum = 0;
static uint8_t kroczek;
kroczek = (kroczek & ~STEP_MASK) | steps[stepNum];
stepNum += nsteps;
stepNum %= NUM_STEPS;
return kroczek;
}
//*****************************a tu funkcja zmieniająca kanały- definicja - to chyba też gaskoina
void SetAdcKanal(void)
{
static uint8_t kanal;
ADMUX = ((ADMUX&0xE0)+ kanal);//zmienić kanał
napiecie[kanal++]=ADC_sr; // zapisać pomiar w tablicę
if(kanal>=LICZBA_KANALOW)
kanal=0;
}
/*
void inline ADCSetChannel(uint8_t channel)
{
ADMUX = ((ADMUX&0xE0)+ channel);
}
void inline ADCMeasure()
{
ADCSRA |=(1 << ADSC) ; //zacznij pomiar
}
*/
A chciałbym zeby pomiar nie skakał.
Może to przez to dzielenie przez dwa.
A może to wcale nie jest uśrednienie- tylko tak mi się wydaje.
