Piszę program na Atmegę8 z zastosowaniem przetwornika ADC i poległem na zmiennych.
Będę odczytywał wartość napięcie w zakresie 0,370 - 0,693 i zamieniał je na temperaturę.
Zdjąłem charakterystykę f(v) = mc+b i próbuję zaprząc procesor do działania.
Na razie przetwornik (chyba) nie ruszył, bo nie widać zmian na wyświetlaczu, ale póki co zająłem się sprawdzaniem obliczeń i mam podejrzenia że procek nie radzi sobie ze zmiennymi typu float.
oto fragmenty programu:
To fragment programu, jak wcześniej wspomniałem.
Wynik jest wyświetlany na trzech LEDach siedmiosegmentowych z multipleksowaniem sterowanym przerwaniem procesora.
Wyświetlanie jest poprawne jeżeli się poda bezpośrednio zmienną.
Natomiast wyświetlenie np m w postaci np a=1/m daje wynik 211, a powinno być 577
Wykonywałem też inne sprawdzenia z deklarowanymi stałymi i tez jest źle:
float a = v1*10;, temp_current = a*100; = 181 czyli źle
float a = v1*100; temp_current = a; = 69 czyli dobrze.
Zastanawiam się nad wymnożeniem stałych v1 i v2 o tysiąc czyli podawania mV, a nie V, a później podawanie do funkcji convert wartości pomiar*1000.
Za wszelką pomoc z góry dziękuję, bo w kwestii programowania uC orłem nie jestem.
Przeczytałem sporo wątków na Elektrodzie ale jednoznacznej odpowiedzi nie mam.
Będę odczytywał wartość napięcie w zakresie 0,370 - 0,693 i zamieniał je na temperaturę.
Zdjąłem charakterystykę f(v) = mc+b i próbuję zaprząc procesor do działania.
Na razie przetwornik (chyba) nie ruszył, bo nie widać zmian na wyświetlaczu, ale póki co zająłem się sprawdzaniem obliczeń i mam podejrzenia że procek nie radzi sobie ze zmiennymi typu float.
oto fragmenty programu:
void adc_init(void)
{
ADMUX |= _BV(REFS0);
ADMUX |= _BV(REFS1);
ADMUX |= _BV(ADLAR);
ADCSRA |= _BV(ADEN);
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS1);
// ADMUX = 0;
}
int getadc(uint8_t channel)
{
ADMUX |= channel;
ADCSRA |= _BV(ADSC);
while (ADCSRA & _BV(ADSC)) {}
return(ADCW);
}
int convert(int value)
{
static const float c1=20.0;
static const float v1=0.693;
static const float c2=200.0;
static const float v2=0.370;
float m = (v2-v1) / (c2-c1);
return ((int)((float)value -(v1 - m*c1))/m);
}
int main(void)
{
port_init();
adc_init();
while(1)
{
_delay_ms(100);
pomiar = getadc(0);
temp_current = convert2degree(pomiar);
}
}
To fragment programu, jak wcześniej wspomniałem.
Wynik jest wyświetlany na trzech LEDach siedmiosegmentowych z multipleksowaniem sterowanym przerwaniem procesora.
Wyświetlanie jest poprawne jeżeli się poda bezpośrednio zmienną.
Natomiast wyświetlenie np m w postaci np a=1/m daje wynik 211, a powinno być 577
Wykonywałem też inne sprawdzenia z deklarowanymi stałymi i tez jest źle:
float a = v1*10;, temp_current = a*100; = 181 czyli źle
float a = v1*100; temp_current = a; = 69 czyli dobrze.
Zastanawiam się nad wymnożeniem stałych v1 i v2 o tysiąc czyli podawania mV, a nie V, a później podawanie do funkcji convert wartości pomiar*1000.
Za wszelką pomoc z góry dziękuję, bo w kwestii programowania uC orłem nie jestem.
Przeczytałem sporo wątków na Elektrodzie ale jednoznacznej odpowiedzi nie mam.
