Картина след: U с шунта через вып. мост и операционник измеряемая величина поступает на АЦП. 10 битный.
Смысл какой, как можно чаще опрашивать АЦП, получать значение, и по формуле "St1t2=((а+в)/2)*(t1-t2)" и делать вот так Sres +=St1t2.
Изначально планировалось так: (ADC - оцифрованный сигнал )
Sres=0;
if(ADC>0){
t++;
if(t%2==0){U=ADC;}else(U2=ADC; t2++;)
St1t1=((U+U2)/2)*(t2-t1);
Sres=Sres+St1t1;
Проблемы:
1. не получается посчитать изменение времени от t1 до t2 (именно не то что они изменились на +1, а на сколько реально изменилось время в нано или микро секундах, для того чтобы посчитать площадь прямоугольной трапеции)
2. Очень быстро переполняются переменные
Помогите пожалуйста если кто знает в чем проблема.
Вот код:
Код: Выделить всё
int read_ADC(){
ADCSR|=0x40; // Прерывание
while ((ADCSRA & 0x10)==0);
return ADCW;
}
void main(void){
char time[32];
char imp[32];
unsigned int a;
float b;
int t1;
unsigned int St1t2;
int t2;
unsigned int Sres;
float kt;
char buffer[32];
int ADC; //переменная для хранения значений АЦП
int U; //переменная для хранения напряжения
// float I; //переменная для хранения тока
ADMUX=0xC0; // Номер порта и опорное напряжение
ADCSR=0x85; // Инициализация АЦП и Делитель 32
lcd_init(16);
a=0;
b=0;
t1=0;
St1t2=0;
t2=0;
Sres=0;
kt=100;
while(1){
ADC=read_ADC();
if(ADC>0){
lcd_clear();
U=ADC*kt;
lcd_gotoxy(0,0);
sprintf(buffer,"I: %d",(int)(U));
lcd_puts(buffer);
t1++;
lcd_gotoxy(10,0);
sprintf(time,"t: %ds",(t1/100));
lcd_puts(time);
a=(U);
St1t2=((a*a)*0.001);
Sres=Sres+St1t2;
lcd_gotoxy(0,1);
sprintf(imp,"B: %dkA2*s",Sres);
lcd_puts(imp);
}else{
lcd_gotoxy(0,0);
sprintf(buffer,"I:%d",(int)(U));
lcd_puts(buffer);
lcd_gotoxy(10,0);
sprintf(time,"t:%ds",(t1/100));
lcd_puts(time);
lcd_gotoxy(0,1);
sprintf(imp,"B:%dkA2*s",sqrt(Sres/t1));
lcd_puts(imp);
}
}
};


