АЦП Atmega8 вопрос!

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

АЦП Atmega8 вопрос!

Сообщение st_silver »

Делаю импульсный источник питания с индикацией напряжения на нагрузке. Решил систему управления собрать на Atmega8, ШИМ уже настроил всё работает замечательно! Уперся как баран в работу АЦП, дадашит перечитал раз двести не получается понять почему не выводит вольтаж на LCD.
Ниже код:

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

#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#include <lcd.h>

#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm

#define ADC_VREF_TYPE 0xC0

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

unsigned int n;
char lcd_buffer[33];

void main(void)
{
PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xFF;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;

// LCD module initialization
lcd_init(16);

while (1)
      {
       n=read_adc(ADCW);
       sprintf(lcd_buffer,"V=%i",n);
       lcd_clear();
       lcd_puts(lcd_buffer);       
       delay_ms(50);
      };
}

По идее функция read_adc и вытаскивает результат преобразования, если флаг ADIF полнят...
на ножке AREF кондёр на 1 мкФ, входной сигнал идёт на ножку ADC0.
Протеус уперто показывает на LCD "V=0" независимо от того какое напряжение на входе!.. уже второй день пытаюсь разобраться, может подскажите где я ошибаюсь!
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

Функция read_adc(х) считивает значение с входа АЦП номер х, в вашем случае read_adc(0) (для компилятора CVAvr)!
Последний раз редактировалось phenomen Пт дек 17, 2010 14:50:45, всего редактировалось 1 раз.
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

Re: АЦП Atmega8 вопрос!

Сообщение st_silver »

То есть, чтобы записать значение приходящее на нулевую ножку, необходимо указать n=read_adc(0);?
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

Да, именно так
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

Re: АЦП Atmega8 вопрос!

Сообщение st_silver »

Хм, странно, все равно выдает "V=0" на LCD...
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

А пины AVCC и AREF подтянуты к + питания?
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

Re: АЦП Atmega8 вопрос!

Сообщение st_silver »

А зачем, там же в режиме указано, внутренний опорник и кондёр на AREF
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

AVCC, помоему, в любом случае должен бить запитан.
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

Re: АЦП Atmega8 вопрос!

Сообщение st_silver »

не, все равно не работает! Блин кусок кода работающего было бы вообще замечательно, но никто блин на LCD не делает, по крайней мере я в инете не видел!
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

У меня работает, правда с кондером результаты плохие (никогда не пробывал), но вот во втором случае все ок.
Использую PROTEUS 7.7 и CVAvr 2.04.8b
ADC.rar
Для ADC #define ADC_VREF_TYPE 0xC0
Для ADC1 #define ADC_VREF_TYPE 0x00
(88.76 КБ) 298 скачиваний
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

Re: АЦП Atmega8 вопрос!

Сообщение st_silver »

О все заработало, спасибо большое! Я так понял это схемка от внешнего опорника?
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

Именно так.
ЗЫ в даташите к меге8 пишет
AVCC must not differ more than ±0.3V from VCC

И по твоей схеме
Internal reference voltages of nominally 2.56V or AVCC are provided On-chip. The voltage reference
may be externally decoupled at the AREF pin by a capacitor for better noise performance.

Тоесть, касаясь первой схемы (ADC), работало верно, хотя я не уверен в правильности схемотехники :roll:
st_silver
Родился
Сообщения: 11
Зарегистрирован: Чт дек 24, 2009 16:46:59

Re: АЦП Atmega8 вопрос!

Сообщение st_silver »

Ну я уже решил с внешним сделать, там шаг будет больше на каждую единицу)
Аватара пользователя
КАО
Родился
Сообщения: 19
Зарегистрирован: Ср июн 17, 2009 18:44:01
Откуда: Гатчина

Re: АЦП Atmega8 вопрос!

Сообщение КАО »

МяяУ! Здравствуйте всем. Чтобы не создавать новую тему, задам свой вопрос здесь. Как вывести
вольтаж с дробной частью?
По гороскопу -- Лев. А Лев -- это большой, матёристый кот!

Энергия ядерного взрыва равна примерно 22030000000ккал
что примерно соответствует 4,3 тысяч тонн копченой колбасы.(с форума Припять)
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

по простой формуле: ("опорное напряжение"/(2^"количество разрядов"))*"показания АЦП" в переменную типа float используя printf или свои функции для получения "форматированых" результатов.

Пример:
Опорное напряжение - 5В
МК Атмега8, разрядность - 10
Показания АЦП - 315
Результат: (5/1024)*315=1,5380859375 Вольта

Вместо ("опорное напряжение"/(2^"количество разрядов")) задать константу типа

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

#define ADCMULT 0,0048828125
для тех же 5В и 10 разрядов
Аватара пользователя
КАО
Родился
Сообщения: 19
Зарегистрирован: Ср июн 17, 2009 18:44:01
Откуда: Гатчина

Re: АЦП Atmega8 вопрос!

Сообщение КАО »

Ещё вопрос. напишите, пожалуйста кусок кода, в котором дробное значение выводится на экран ЖКИ. :)
По гороскопу -- Лев. А Лев -- это большой, матёристый кот!

Энергия ядерного взрыва равна примерно 22030000000ккал
что примерно соответствует 4,3 тысяч тонн копченой колбасы.(с форума Припять)
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

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

char lcd_buffer[33];
float ADCVAL;
...
       ADCVAL=read_adc(0);     
       ADCVAL=ADCVAL*ADCMULT;
       sprintf(lcd_buffer,"V=%d,%d",(int)ADCVAL,(int)(ADCVAL*100)%100);
       lcd_clear();
       lcd_puts(lcd_buffer);
       delay_ms(50);


В протеусе

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

sprintf(lcd_buffer,"V=%f",ADCVAL);
не восприняло, вышел из ситуации таким способом :)
Аватара пользователя
КАО
Родился
Сообщения: 19
Зарегистрирован: Ср июн 17, 2009 18:44:01
Откуда: Гатчина

Re: АЦП Atmega8 вопрос!

Сообщение КАО »

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

sprintf(lcd_buffer,"V=%f",ADCVAL);


также не получилось :( Спасибо за код!
По гороскопу -- Лев. А Лев -- это большой, матёристый кот!

Энергия ядерного взрыва равна примерно 22030000000ккал
что примерно соответствует 4,3 тысяч тонн копченой колбасы.(с форума Припять)
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: АЦП Atmega8 вопрос!

Сообщение phenomen »

Прошу прощения, нужно исправить:
phenomen писал(а):char lcd_buffer[33];
float ADCVAL;
...
       ADCVAL=read_adc(0);
       ADCVAL=ADCVAL*ADCMULT;
       sprintf(lcd_buffer,"V=%d,%02d",(int)ADCVAL,(int)(ADCVAL*100)%100);
       lcd_clear();
       lcd_puts(lcd_buffer);
       delay_ms(50);
Аватара пользователя
КАО
Родился
Сообщения: 19
Зарегистрирован: Ср июн 17, 2009 18:44:01
Откуда: Гатчина

Re: АЦП Atmega8 вопрос!

Сообщение КАО »

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

sprintf(lcd_buffer,"V=%d,%02d",(int)ADCVAL,(int)(ADCVAL*100)%100);


поясните строчку, очень прошу. Больно не пинать. 8)
По гороскопу -- Лев. А Лев -- это большой, матёристый кот!

Энергия ядерного взрыва равна примерно 22030000000ккал
что примерно соответствует 4,3 тысяч тонн копченой колбасы.(с форума Припять)
Закрыто

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