Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Подскажите кто нибудь как найти среднее значение в массиве рез-татов АЦП
Отправлено
Frensis 07 октября 2008 г. 21:42
Хотел что бы цифры не прыгали на LCD а выводили среднее значение допустим 3 измерений 1 канала тоже самое и сдругими каналами прога вот :
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 10.09.2008
Author : Stepan
Company : Home
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00;
#define ADCVIKL ADCSRA=0b10011110;
#define ADCVKL ADCSRA=0b11011110;
unsigned int y=0;
unsigned int flag=0;
unsigned int x=0;
unsigned int i;
unsigned int z=0;
char lcd_buffer[33];
char lcd_buffer1[33];
char lcd_buffer2[33];
interrupt [ADC_INT] void adc_isr(void) ////2112659 =1667ìêñ ïðè Êäåë=128 Fadc=7812,5Hz Fd=Fadc/13=600Hz
// Âðåìÿ âûáîðêè Tv=1/Fd =1667ìêñ ; ïðè Êäåë=64 Fadc=15625Hz Fd=1201Hz Tv=832ìêñ
//2
{
PORTB.0^=1;
i=ADMUX & 0b00001111;
switch(i)
{case 0:y=ADCW*25;flag=1;break;
case 1:x=ADCW*25;flag=2;break;
case 2:z=ADCW*25;flag=3;break;
default:;};
}
void init(void){
ADCVIKL;
ADMUX=0b11000000;
#asm ("sei");}
// Declare your global variables here
//flash char xyz[]="Zrasde dela kak" ;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x01;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00; //8375
// initialize the LCD for
// 2 lines & 16 columns
lcd_init(16); //8377 =2.1sec
init(); //2110959
//ADCVKL;
// go on the second LCD line
// display the message
// stop here
while (1)
{
switch(flag) //2110972
{case 1:ADCVIKL;ADMUX=0b11000001;break; //2110973
case 2:ADCVIKL;ADMUX=0b11000010;break; //2110978
case 3:ADCVIKL;ADMUX=0b11000000;break; //2110983
default:;};
flag=0; //2110988
ADCVKL; //2110990
lcd_gotoxy(0,0);//2110992 óõîä â ïðåðûâàíèå
sprintf(lcd_buffer,"U=%4d.%d",y/10,y%10);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,1);
sprintf(lcd_buffer1,"U1=%4d.%d",x/10,x%10);
lcd_puts(lcd_buffer1);
lcd_gotoxy(8,0);
sprintf(lcd_buffer2,"U2=%4d.%d",z/10,z%10);
lcd_puts(lcd_buffer2);
lcd_clear();
//
};
}
Составить ответ | Вернуться на конференцию
Ответы
- Ответ: - leon (08.10.2008 11:32:30 82.207.118.64, 2685 байт)
- Или так - leon (08.10.2008 17:16:26 82.207.118.64, 927 байт)
- Давая код, давайте и пример использования. main c вызовами. - Quasy (08.10.2008 12:16:35 192.168.0.207,80.243.9.34, пустое)
- Где-то так - leon (08.10.2008 12:41:13 82.207.118.64, 348 байт)
- Ответ: - leon (08.10.2008 12:31:19 82.207.118.64, 301 байт)
- А зачем в "return (skolz_summ + ARRAY_SIZE/2) / ARRAY_SIZE;" прибавляется ARRAY_SIZE/2 ? - Doppler (08.10.2008 12:09:9 85.223.109.75, пустое)
- Может так профильтровать, а менять на индикаторе только, если новое значение отличается от отображаемого на величину больше заданной (такой себе гистерезис) - leon (08.10.2008 11:33:36 82.207.118.64, пустое)
- Суммируешь напр. 800 результатов, а длинную сумму сдвигаешь (делишь на 2-4-8...) - BN (08.10.2008 09:48:35 217.8.236.135, 120 байт)
- Эээ, а прога приведена зачем? Прыжки показаний от нее не зависят :) Период обновлений на индикаторе какой допустим? Вот соответствующее число отсчетов и усредняй. Делов-то на индикатор сглаженные даные вывести. И даже не думай заморачиваться с расчетом фильтрров и прочей лабуденью. - POV (07.10.2008 22:05:58 91.203.64.17, пустое)
- Проще 4х,8ми, 16 и т.д. измерений и сдвигать результат вправо на соответствующее количество позиций. - Russ (07.10.2008 22:05:14 84.204.77.228, пустое)