3х канальній измеритель напряжения на АТмега8
- Сообщения: 60
- Зарегистрирован: Чт окт 29, 2009 23:22:03
Прочитал кучу постов но про усреднение ничего не нашел(
- Реклама
какое усреднение?! вы сначала сделайте нормальный ввод данных с АЦП (уж об этом-то тут полно информации), а потом и поглядим, надо вам усреднение или нет. у вас нерабочий код, а в чем именно проблема, определите сами, сравнив ваше творчество с тем, что тут муссируется уже долгое время.elf писал(а):Прочитал кучу постов но про усреднение ничего не нашел(
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 60
- Зарегистрирован: Чт окт 29, 2009 23:22:03
Код рабочий правда не знаю или правильно работает:(в Потеусе все нормально показания не скачут. а на железе скачут)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);
}
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ого, мало того, что из АЦП не пойми чего читается, так еще и деление на ноль на 0-й итерации проскакивает. А такую формулу усреднения я ни в одном учебнике математики не видел.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
- Реклама
тоже мне, ретроград нашелся - учебники он читает! продвинутые поцы читают только ценники, а учебники - для лохов и ботановDrWatson писал(а):А такую формулу усреднения я ни в одном учебнике математики не видел.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
итак, вот полученая прогамма, которая сканирует по очереди 3 порта АЦП, но теперь возник вопрос, как можна расширить функции даного устройства, подскажите пожайлуста, каким образом можно ввести в устройство дополнительно еще 4ри параметра которые бы выщитывлись из тех данных которые мы получаем из АЦП
Код: Выделить всё
#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);
}
}Уважаемые форумчане прошу помощи или наставницкого совета воощем суть вопроса,
в программе трех канального измерителя напряжения надо ввести дополнительно еще 4ри ращетных параметра исодя из цифр которые мы померяли
к примеру
на канале 1 измеряемое напряжение = 5 В, а на следующий раз когда мы обратились к этому каналу там уже напряжение равно = 3 В, надо сложить и усреднить значения ну и собственно это же проделать с каждым каналом ??
подскажите правильно ли я мыслю,
в программе трех канального измерителя напряжения надо ввести дополнительно еще 4ри ращетных параметра исодя из цифр которые мы померяли
к примеру
на канале 1 измеряемое напряжение = 5 В, а на следующий раз когда мы обратились к этому каналу там уже напряжение равно = 3 В, надо сложить и усреднить значения ну и собственно это же проделать с каждым каналом ??
подскажите правильно ли я мыслю,
Код: Выделить всё
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);
}


