Вывести значение с АЦП

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

Вот есть код:

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

unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}  
Получается, что результат записывается в ADCW, мне надо это значение вывести на дисплей (HD44780). Как это можно сделать?
Через функции lcd_putsf или lcd_puts не получается, так как ADCW имеет тип unsigned char.
Прошу вашей помощи.
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 425
Зарегистрирован: Вт фев 03, 2009 05:16:25
Откуда: Kiev

Сообщение xDevs »

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

unsigned char adc_value[4];

sprintf(adc_value,"%04X",ADCW);
for (int i=0;i<4;i++) lcd_putchar(adc_value[i]);
Наподобие этого. выводит 4 цифры в hex.
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

версия для 8 бит ADC

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

               unsigned char  fd;

                fd=read_adc(1); // считать АЦП со входа 1
                
                i=0;
                while (fd>=100) {
                        fd-=100;
                        i++;
                }
                lcd_putchar('0' + i);
                
                i=0;
                while (fd>=10) {
                        fd-=10;
                        i++;
                }
                lcd_putchar('0' + i);
                
                lcd_putchar('0' + fd);
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Помогите разобраться с расчётом АЦП.
Как мне посчитать чему будет равен АЦП при 1 и 2 вольтах?
Если я правильно понял то это делается так(Для 10 битного АЦП):
210 - это не 210, а два в 10-той степени!!!
Для одного вольта - 1*(210-1)/5=1023/5=204.6=1V
Для двух вольт - 2*(210-1)/5=2046/5=409.2=2V
Правильный это подсчёт или нет?
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 163
Зарегистрирован: Ср дек 05, 2007 18:55:07
Откуда: Санкт-Петербуг

Сообщение Иван23 »

самое простое есть разрядность ацп к примеру 10, или 1024 состояния,и есть опорное напр. например 5.12в,то на одну единицу приходится 0,005в или 5мв, если опорное 2.56 то на шаг получится 0,0025в или 2,5мв,дальше умножаем и усе :shock:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Спасибо за ответ!
А можно это в виде формулы изложить?
Реклама
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Гы, пажалста! :))
Формула: Vref/2^N * ADCW :)))

Например Vref 5,12; ADCW=512; Разрядность 10
5,12/2^10*512=2,56V

Только надо учесть "шум" ADC для корректировки значения. Его обычно отнимают от полученного значения.
Тогда получится так : Vref/2^N * (ADCW-Noise), где Noise и есть значение "шума".
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Разъясните ещё мне как вывести значение напряжения на АЦП на ЖКИ 16*2.
Делал так:

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

// Place your code here
      volt=read_adc(0);
      volt=5/1024*volt;
      lcd_gotoxy(0,0);                      //почати вивід тексту з 0,0
      lcd_putsf("U=");                      //вивести на LCD
      lcd_putchar (volt/1000+0x30);         //показати значення одиниць 
      lcd_putsf (",");                      //вивести на LCD
      lcd_putchar ((volt/100)%10+0x30);     //показати значення десятих                           
      lcd_putchar ((volt/10)%10+0x30);      //показати значення сотих
      lcd_putsf ("V");                      //вивести на LCD
ничего не работает(
Я не Сашок!!!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Проще простого...
http://www.remexpert.com/ipb/index.php?showtopic=1285

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

unsigned char asc[5];
void itoa2(unsigned int binval)
{
int step[]={10000,1000,100,10,1};
unsigned int temp,val;
unsigned char i,atemp;
val=binval;
for (i=0 ; i<5>= temp)

  {
   atemp++;
   val-=temp;
  }
  asc[i]=atemp;
}
}
Смотрите по ссылке , движок форума правит код по своему...
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Что то у меня ничего не получилось(
Я не Сашок!!!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Нашол кусок исходника для настройки АЦП ATmega8 4MHz но нечего не понимаю в нем. Может можна както переделать для ATmega16 11.0592MHz???

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

// инициализация АЦП на PC0(ADC0)
ADMUX &= 0xdf & 0x7e & 0xf0; ADMUX |= 0x40 ;            //10бит;Vref=AVCC;канал-1 PC0
ADCSRA &=0xfb; ADCSRA |= 0x80 | 0x40 | 0x02 | 0x03;     //Fацп=125кГц
Я не Сашок!!!
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

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

/* Настройка АЦП*/

ACSR= _BV(ACD);//отключаем аналоговый компаратор
ADMUX=0x03;// Аналоговый канал- вывод ADC3

/* Несихронизированный режим АЦП с делением частоты на 64*/
ADCSRA= _BV(ADEN) | _BV(ADSC)| _BV(ADFR) |
 _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
Я вот так АЦП настраивал, всё просто вроде.

8-я мега.
Мявтор!
Аватара пользователя
Сообщения: 2057
Зарегистрирован: Чт ноя 30, 2006 12:27:46
Откуда: Челябинск

Сообщение dt_andrew »

sachok писал(а):Разъясните ещё мне как вывести значение напряжения на АЦП на ЖКИ 16*2.
Делал так:

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

// Place your code here
      volt=read_adc(0);
      volt=5/1024*volt;
      lcd_gotoxy(0,0);                      //почати вивід тексту з 0,0
      lcd_putsf("U=");                      //вивести на LCD
      lcd_putchar (volt/1000+0x30);         //показати значення одиниць 
      lcd_putsf (",");                      //вивести на LCD
      lcd_putchar ((volt/100)%10+0x30);     //показати значення десятих                           
      lcd_putchar ((volt/10)%10+0x30);      //показати значення сотих
      lcd_putsf ("V");                      //вивести на LCD
ничего не работает(
странно а у меня все работает
код взят из цикла статей Рюмика - правильно
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Та я уже сам всё настроил:)
Я не Сашок!!!
Контактная информация:
Закрыто

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