Страница 1 из 2

Вольтметр на atmega16a

Добавлено: Ср апр 06, 2016 16:13:32
aleksei18rus
Добрый вечер коты ученые, решил собрать вольтметр, написал код, а он как попало изменяет. Максимальное измеряемое напряжение 30в., R1 10кОм, R2 2кОм, опорное напряжение 5вольт AVCC потянул к 5 вольтам, сгенерировал код, получилось что то такое...

Код: Выделить всё

#include <mega16a.h> 
#include <delay.h> 
#asm 
 .equ __lcd_port=0x12; 
#endasm 
#include <lcd.h> 
#include <stdio.h> 
#define ADC_VREF_TYPE ((0«REFS1) | (1«REFS0) | (0«ADLAR)) 
unsigned char volt; 
char buffer [33]; 
unsigned int read_adc(unsigned char adc_input) 
{ 
ADMUX=adc_input | ADC_VREF_TYPE; 
delay_us(10); 
ADCSRA|=(1«ADSC); 
while ((ADCSRA & (1«ADIF))==0); 
ADCSRA|=(1«ADIF); 
return ADCW; 
} 
void main(void) 
{ADMUX=ADC_VREF_TYPE; 
 ADCSRA=(1«ADEN) | (0«ADSC) | (0«ADATE) | (0«ADIF) | (0«ADIE) | (1«ADPS2) | (1«ADPS1) | (0«ADPS0); 
 SFIOR=(0«ADTS2) | (0«ADTS1) | (0«ADTS0); 
 lcd_init(16); 
while (1) 
 {volt=read_adc(0)*0.029*5.00; 
 sprintf(buffer, "Volt=%i.%u", volt); 
 lcd_gotoxy(0,0); 
 lcd_puts(buffer); 
 delay_ms (500); 
 
 } 
} 

Re: Вольтметр на atmega16a

Добавлено: Ср апр 06, 2016 16:56:37
L.O.D
сгенерировал код, ... а он как попало изменяет...
Вот подлец... И с кем же изменяет, гад?

Вот этот код - "sprintf(buffer, "Volt=%i.%u", volt);" - под какую курительную смесь был "сгенерирован"?
А этот - "volt=read_adc(0)*0.029*5.00;"?
И что такое R1 и R2?

Re: Вольтметр на atmega16a

Добавлено: Ср апр 06, 2016 17:08:13
aleksei18rus
L.O.D писал(а):
сгенерировал код, ... а он как попало изменяет...
Вот подлец... И с кем же изменяет, гад?

Вот этот код - "sprintf(buffer, "Volt=%i.%u", volt);" - под какую курительную смесь был "сгенерирован"?
А этот - "volt=read_adc(0)*0.029*5.00;"?
И что такое R1 и R2?
Ахахаха, Т9 ска...

Re: Вольтметр на atmega16a

Добавлено: Ср апр 06, 2016 17:20:10
L.O.D
Подозрения насчет травы оправдались. Смотри не передозь там.

Re: Вольтметр на atmega16a

Добавлено: Ср апр 06, 2016 18:22:16
aleksei18rus
R1 и R2 резистивный делитель, а по какой тогда формуле рассчитывать, 2 день уже пытаюсь измерить напряжение.
Алгоритм такой сначала 30/1024=0.029в затем ADCW*0.029 (512*0.029=14.84) я так понял.

Re: Вольтметр на atmega16a

Добавлено: Ср апр 06, 2016 18:34:29
L.O.D
aleksei18rus писал(а):R1 и R2 резистивный делитель, ...
Это и из первого поста было понятно, так что - никакой доп.информации не поступило. Исходя из того, как "сгенерирован" код этого "вольтметра" вполне можно ожидать, что R1 и R2 включены в схему как-нибудь нетадиционно... например, только одним контактом. Отсюда и вопрос...
aleksei18rus писал(а):Алгоритм такой сначала 30/1024=0.029 затем ...
Коэффициенты в данный момент неважны, важнее то, что ожидалось получить скажем вот таким образом:

Код: Выделить всё

volt=read_adc(0) ...;
или что ожидалось увидеть после такого чуда:

Код: Выделить всё

sprintf(buffer, "Volt=%i.%u", volt);

Re: Вольтметр на atmega16a

Добавлено: Чт апр 07, 2016 04:40:54
Novice user
я тоже с вольтметром из хелпа не разобрался,так и осталась эта тема для меня не известной...
думаю вам никто не поможет-дохлый номер
может поможет http://avr-start.ru/?p=590

Re: Вольтметр на atmega16a

Добавлено: Чт апр 07, 2016 11:10:38
L.O.D
Novice user писал(а):думаю вам никто не поможет-дохлый номер
Зачем так категорично? Тем более, что процесс уже стартовал.

Re: Вольтметр на atmega16a

Добавлено: Чт апр 07, 2016 15:03:15
aleksei18rus
В общем, помощи недождался и сделал сам и все работает.

Код: Выделить всё

#include <mega16a.h>
#include <stdio.h>
#include <delay.h>
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSRA|=(1<<ADSC);
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}      
void main (void)
 {float result;
  char lcd_buffer [30]; 
  ADMUX=ADC_VREF_TYPE;
  ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
  lcd_init(16);
  lcd_putsf ("   voltmetr");
  delay_ms (500);
  lcd_clear();
   while (1)
   {  lcd_gotoxy (0,0);
      result=((30.00*read_adc(0))/1024.00);
      sprintf(lcd_buffer,"U=%.2fV",result);
      lcd_puts(lcd_buffer);
   }
 }     
   

Код: Выделить всё

result=((30.00*read_adc(0))/1024.00);
в этой строчке 30.00 это максимальное измеряемое напряжение при резистивном делителе 10кОм и 2кОм, read_adc(0) показания с 0 входа АЦП, 1024.00 это разрядность АЦП
Изображение

Re: Вольтметр на atmega16a

Добавлено: Чт апр 07, 2016 18:57:55
COKPOWEHEU
Жаль отказались от помощи. Радует, что хотя бы методом тыка проблему решить удалось. Остается надеяться, что дальше попытаетесь оптимизировать и разобраться почему этот вариант работает.

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 06:29:58
aleksei18rus
COKPOWEHEU писал(а):Жаль отказались от помощи. Радует, что хотя бы методом тыка проблему решить удалось. Остается надеяться, что дальше попытаетесь оптимизировать и разобраться почему этот вариант работает.
Загвоздка была в этих строчках и всего то

Код: Выделить всё

result=((30.00*read_adc(0))/1024.00);
      sprintf(lcd_buffer,"U=%.2fV",result);

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 07:47:54
L.O.D
aleksei18rus писал(а):Загвоздка была в этих строчках и всего то

Код: Выделить всё

result=((30.00*read_adc(0))/1024.00);
      sprintf(lcd_buffer,"U=%.2fV",result);
Именно на них вам и указывали с самого начала. :)

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 11:11:49
Аlex
Да ладно, это он сам во всём разобрался, а помощи не было вообще никакой :)))
Вот такие вот они, Удмурты :)))

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 14:10:12
L.O.D
Насчет "разобрался" есть некоторые сомнения. :)

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 18:28:50
COKPOWEHEU
Да что вы, откуда сомнения?! Явно ведь не из-за использования в такой задаче чисел и плавающей точкой. И не из-за использования умножения + деления вместо умножения на константу. И не незнания порядка записи переменных в арифметических выражениях. И даже не из-за указания printf'у двух параметров и передачи одного. Ведь все профессианальные программисты так и делают.
Эту фразу я не распарсил, поэтому прокомментировать не могу
опорное напряжение 5вольт AVCC потянул к 5 вольтам
В смысле опорное напряжение (AREF) притянул к питанию (плохая идея, очевидно) или AVCC (аналоговое питание) соединил с цифровым (необходимое условие, хотя стоило бы поставить индуктивность).

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 20:10:02
aleksei18rus
Ну не пинайте так сильно, я только начал разбираться, вот и просил помощи у вас на форуме... А помощи никакой ни не дождался, сами то наверно тоже не все с первого раза поняли.

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 20:16:15
aleksei18rus
опорное напряжение 5вольт AVCC потянул к 5 вольтам
В смысле опорное напряжение (AREF) притянул к питанию (плохая идея, очевидно) или AVCC (аналоговое питание) соединил с цифровым (необходимое условие, хотя стоило бы поставить индуктивность).
ошибся я

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 20:18:59
aleksei18rus
Сегодня посидел, прикрутил еще часы реального времени, датчик ds18b20 ну и соответственно вольтметр.

Re: Вольтметр на atmega16a

Добавлено: Пт апр 08, 2016 22:26:07
COKPOWEHEU
aleksei18rus писал(а):А помощи никакой ни не дождался, сами то наверно тоже не все с первого раза поняли.
А думаете, почему задавали наводящие вопросы, чего вы хотели добиться своим кодом? Тоже сразу не понятно было, хотели помочь, но вы же отказываетесь описывать свою логику, как тут поможешь.
aleksei18rus писал(а): опорное напряжение 5вольт AVCC потянул к 5 вольтам
...
ошибся я
Так что имелось в виду, AREF или AVCC?

Re: Вольтметр на atmega16a

Добавлено: Сб апр 09, 2016 07:25:30
aleksei18rus
AVCC имел ввиду