3х канальній измеритель напряжения на АТмега8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

Сообщение elf »

Прочитал кучу постов но про усреднение ничего не нашел(
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

elf писал(а):Прочитал кучу постов но про усреднение ничего не нашел(
какое усреднение?! вы сначала сделайте нормальный ввод данных с АЦП (уж об этом-то тут полно информации), а потом и поглядим, надо вам усреднение или нет. у вас нерабочий код, а в чем именно проблема, определите сами, сравнив ваше творчество с тем, что тут муссируется уже долгое время.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

Сообщение elf »

ARV писал(а): у вас нерабочий код
Код рабочий правда не знаю или правильно работает:(в Потеусе все нормально показания не скачут. а на железе скачут)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение 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);
}

}
для справки: не рабочий - это значит "не работающий правильно".
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Ого, мало того, что из АЦП не пойми чего читается, так еще и деление на ноль на 0-й итерации проскакивает. А такую формулу усреднения я ни в одном учебнике математики не видел.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

DrWatson писал(а):А такую формулу усреднения я ни в одном учебнике математики не видел.
тоже мне, ретроград нашелся - учебники он читает! продвинутые поцы читают только ценники, а учебники - для лохов и ботанов
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн май 17, 2010 09:59:59
Откуда: Kiev

Сообщение RaDevan »

итак, вот полученая прогамма, которая сканирует по очереди 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);
    
          }
}
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн май 17, 2010 09:59:59
Откуда: Kiev

Сообщение RaDevan »

Уважаемые форумчане прошу помощи или наставницкого совета воощем суть вопроса,
в программе трех канального измерителя напряжения надо ввести дополнительно еще 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);
              }
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»