Re: 3х канальній измеритель напряжения на АТмега8
Добавлено: Сб май 22, 2010 11:32:30
Прочитал кучу постов но про усреднение ничего не нашел(
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
какое усреднение?! вы сначала сделайте нормальный ввод данных с АЦП (уж об этом-то тут полно информации), а потом и поглядим, надо вам усреднение или нет. у вас нерабочий код, а в чем именно проблема, определите сами, сравнив ваше творчество с тем, что тут муссируется уже долгое время.elf писал(а):Прочитал кучу постов но про усреднение ничего не нашел(
Код рабочий правда не знаю или правильно работает:(в Потеусе все нормально показания не скачут. а на железе скачут)ARV писал(а): у вас нерабочий код
тот код, который вы привели (цитирую) - не рабочий. продолжайте упорствовать - а я пас.elf писал(а):Код рабочий правда не знаю или правильно работает:(в Потеусе все нормально показания не скачут. а на железе скачут)ARV писал(а): у вас нерабочий код
для справки: не рабочий - это значит "не работающий правильно".пробую вот так:
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
char lcd_buffer[31];
unsigned int result;
unsigned int c;
unsigned int i;
unsigned int r2 ;
unsigned int result2 [64];
void main(void)
{
PORTC=0x00;
MCUCR = 0x0A;
GICR = 0xC0;
lcd_init(16);
while(1){
for(i=0; i<64;i++)
{ result= 0;
ADMUX=0;
ADCSRA=0b11011111; //включаем ацп
result2 = (ADCW*5-ADCW/10); //пишем в масив значение ацп
result= ( result+result2) /i ; //усредняем
}
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"ADC=% umV" ,result );//
lcd_puts(lcd_buffer);
}
}
тоже мне, ретроград нашелся - учебники он читает! продвинутые поцы читают только ценники, а учебники - для лохов и ботановDrWatson писал(а):А такую формулу усреднения я ни в одном учебнике математики не видел.
Код: Выделить всё
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
char lcd_buffer[31];
#define ch_plus (1<<4)
#define ch_minus (1<<5)
#define ADC_VREF_TYPE 0x00
unsigned int MAX_CHANEL=3;
unsigned int result;
unsigned int adc;
unsigned char get_key(void)
{
unsigned char temp;
temp = ~PIND & (1<<4 | 1<<5);
delay_ms(15);
if(temp != (~PIND & (1<<4 | 1<<5)))
return 0;
else
return temp;
}
unsigned int get_adc(unsigned int chenal)
{
ADMUX = chenal | ADC_VREF_TYPE;
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
result = ADCW*5-ADCW/9;
if (result>=5000)
{
result=result/50;
}
else
{
if (result<=4999)
{result=(result/50)- 5;}
};
return result;
}
unsigned char lcd_output(unsigned char chanel, unsigned int result)
{
sprintf(lcd_buffer,"I=%4umA" ,result,chanel);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(25);
return 0;
}
void main(void)
{
char chanel = 0;
PORTD=0xFF;
DDRD=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSR=0x8E;
lcd_init(16);
while (1)
{
char key = get_key();
switch(key)
{
case 1<<4:
if(++chanel == 3) chanel = 0;
break;
case 1<<5:
if(!chanel)
chanel--;
else
chanel = MAX_CHANEL--;
break;
}
adc = get_adc(chanel);
lcd_output(chanel, result);
}
}Код: Выделить всё
if(chanel==3)
{
for(i=0;i<=60;i++)
{
static unsigned char input_index=0;
adc_data[input_index]=ADCW;
if (++input_index == 3)
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
delay_us(10);
ADCSRA|=0x40;
bufer = (((ADCW - ADCW * 0.0234) - 500) * 0.2)/60; // формула подогнана под определенный датчик с которого мы и снимаем напругу
}
lcd_clear(); // собственно вывод на экран
lcd_putsf("ENRGY Generatora");
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"C Gen = %4u",bufer);
lcd_puts(lcd_buffer);
delay_ms(200);
}