Страница 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 затем ...
Коэффициенты в данный момент неважны, важнее то, что ожидалось получить скажем вот таким образом:
или что ожидалось увидеть после такого чуда:
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);
}
}
в этой строчке 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 имел ввиду