Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 12.06.2013, 16:02  
vitmailru
Частый гость
 
Регистрация: 09.07.2007
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
vitmailru на пути к лучшему
По умолчанию странное поведение АЦП на ATmega32A

При первом измерении выдается правильное значение, при втором и последующих 1023. Я использую макетную плату USB-ATmega32. Чтобы использовать опорное напряжение от внутреннего источника, в макетке был выпаян резистор R7 на выводе AREF. До удаления резистора результаты АЦП были правильными, но с опорным напряжением = VCC

Схема:
http://mail.kosmodrom.com.ua/pdf/ATMEGA32-USB.pdf

Исходник

Код:
#define LED_PORT_DDR        DDRB
#define LED_PORT_OUTPUT     PORTB
#define LED_BIT             0

#include ‹avr/io.h›
#include ‹avr/wdt.h›
#include ‹avr/interrupt.h›  /* for sei() */
#include ‹util/delay.h›     /* for _delay_ms() */
#include ‹avr/eeprom.h›

#include ‹avr/pgmspace.h›   /* required by usbdrv.h */
#include "usbdrv.h"
#include "oddebug.h"        /* This is also an example for using debug macros */
#include "requests.h"

/* ------------------------------------------------------------------------- */
/* ----------------------------- USB interface ----------------------------- */
/* ------------------------------------------------------------------------- */

PROGMEM const char usbHidReportDescriptor[22] = {    /* USB report descriptor */
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x80,                    //   REPORT_COUNT (128)
    0x09, 0x00,                    //   USAGE (Undefined)
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)
    0xc0                           // END_COLLECTION
};

//Программа инициализации АЦП
void init_ADC (void)
{
    ADCSRA=(1‹‹ADEN)|(1‹‹ADPS1)|(1‹‹ADPS0);
    /*Включаем АЦП, тактовая частота преобразователя =/8
от тактовой чистоты микроконтроллера*/
    ADMUX=(1‹‹REFS1)|(1‹‹REFS0);
    //Внутренний источник опорного напряжения Vref=2,56
}

//Функция считывания результатов АЦП
unsigned int getADC(void)
{   
    ADMUX=(0‹‹MUX0);// устанавливаем входом ADC0
    ADCSRA|=(1‹‹ADSC);  //Начать преобразование
    while ((ADCSRA&_BV(ADIF))==0x00); //Дождаться окончания преобразования
    return ADCW; // возвращаем результат
}

/* ------------------------------------------------------------------------- */

/* usbFunctionRead() is called when the host requests a chunk of data from
 * the device. For more information see the documentation in usbdrv/usbdrv.h.
 */
uchar   usbFunctionRead(uchar *data, uchar len)
{
    unsigned int u = getADC();
    data[0] = (uchar)u;
    data[1] = (uchar)(u ›› 8);
    return len;
}

/* ------------------------------------------------------------------------- */

usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t    *rq = (void *)data;

    if((rq-›bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    // HID class request 
        if(rq-›bRequest == USBRQ_HID_GET_REPORT){  // wValue: ReportType (highbyte), ReportID (lowbyte) 
            return USB_NO_MSG;  // use usbFunctionRead() to obtain data 
        }
    }
	else if((rq-›bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR)
	{
        DBG1(0x50, &rq-›bRequest, 1);   // debug output: print our request 
        if(rq-›bRequest == CUSTOM_RQ_SET_STATUS){
            if(rq-›wValue.bytes[0] & 1){    // set LED 
                LED_PORT_OUTPUT |= _BV(LED_BIT);
            }else{                          // clear LED 
                LED_PORT_OUTPUT &= ~_BV(LED_BIT);
            }
        }else if(rq-›bRequest == CUSTOM_RQ_GET_STATUS){
            static uchar dataBuffer[1];     // buffer must stay valid when usbFunctionSetup returns 
            dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0);
            usbMsgPtr = dataBuffer;         //tell the driver which data to return 
            return 1;                       // tell the driver to send 1 byte 
        }
    }
    return 0;
}

/* ------------------------------------------------------------------------- */

int main(void)
{
uchar   i;
    init_ADC();
    wdt_enable(WDTO_1S);
    odDebugInit();
    DBG1(0x00, 0, 0);       // debug output: main starts 
    usbInit();
    usbDeviceDisconnect();  // enforce re-enumeration, do this while interrupts are disabled! 
    i = 0;
    while(--i){             // fake USB disconnect for › 250 ms
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    sei();
    DBG1(0x01, 0, 0);       // debug output: main loop starts 
    for(;;){                // main event loop 
        wdt_reset();
        usbPoll();
    }
    return 0;
}

/* ------------------------------------------------------------------------- */
Реклама:
vitmailru вне форума  
Непрочитано 12.06.2013, 16:05  
vitmailru
Частый гость
 
Регистрация: 09.07.2007
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
vitmailru на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Измеряемое напряжение подается на PA0 переменным резистором 1к
vitmailru вне форума  
Непрочитано 12.06.2013, 16:34  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,772 раз(а) в 5,896 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Вот так читает CV:

// 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;
}
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 12.06.2013, 16:58  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Сообщение от vitmailru Посмотреть сообщение
При первом измерении выдается правильное значение, при втором и последующих 1023.
Так и должно быть, судя по коду.

Сообщение от vitmailru Посмотреть сообщение
странное поведение АЦП на ATmega32A
Это странное поведение программиста. Что написал - то и делает.
PHP код:
 ADMUX=(1‹‹REFS1)|(1‹‹REFS0);
    
//Внутренний источник опорного напряжения Vref=2,56
}

//Функция считывания результатов АЦП
unsigned int getADC(void)
{   
    
ADMUX=(0‹‹MUX0);// устанавливаем входом ADC0 
Сообщение от akegor Посмотреть сообщение
Вот так читает CV:
....
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

А что в это время делает голова??
omercury вне форума  
Непрочитано 12.06.2013, 16:59  
vitmailru
Частый гость
 
Регистрация: 09.07.2007
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
vitmailru на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Что при adc_input=0 эквивалентно моей функции getADC, кроме установки при каждом преобразовании VREF_TYPE а не при инициализации АЦП, и нет delay и установки ADIF=1 после преобразования. Вечером попробую этот вариант, спасибо
vitmailru вне форума  
Непрочитано 12.06.2013, 16:59  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Сообщение от vitmailru Посмотреть сообщение
При первом измерении выдается правильное значение, при втором и последующих 1023. Я использую макетную плату USB-ATmega32. Чтобы использовать опорное напряжение от внутреннего источника, в макетке был выпаян резистор R7 на выводе AREF. До удаления резистора результаты АЦП были правильными, но с опорным напряжением = VCC
Из выложенного вами кода не ясно где и как читается АЦП.
Функция usbFunctionRead не вызывается нигде.
_Артём_ вне форума  
Непрочитано 12.06.2013, 17:06  
vitmailru
Частый гость
 
Регистрация: 09.07.2007
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
vitmailru на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Сообщение от _Артём_ Посмотреть сообщение
Из выложенного вами кода не ясно где и как читается АЦП.
Функция usbFunctionRead не вызывается нигде.
Она вызывается драйвером usb, могу позже выложить весь проект, если остальной код как-то влияет на работу АЦП
vitmailru вне форума  
Непрочитано 12.06.2013, 17:08  
vitmailru
Частый гость
 
Регистрация: 09.07.2007
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
vitmailru на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Сообщение от omercury Посмотреть сообщение
Сообщение от vitmailru
При первом измерении выдается правильное значение, при втором и последующих 1023.
Так и должно быть, судя по коду.
Хорошо, спрошу по-другому, как должен выглядеть код, читающий всегда текущее напряжение?
vitmailru вне форума  
Непрочитано 12.06.2013, 17:13  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Сообщение от vitmailru Посмотреть сообщение
Хорошо, спрошу по-другому, как должен выглядеть код, читающий всегда текущее напряжение?
PHP код:
unsigned int getADC(void)
{   
//    ADMUX=(0‹‹MUX0);// устанавливаем входом ADC0
    
ADCSRA|=(1‹‹ADSC);  //Начать преобразование
    
while ((ADCSRA&_BV(ADIF))==0x00); //Дождаться окончания преобразования
    
return ADCW// возвращаем результат

omercury вне форума  
Сказали "Спасибо" omercury
vitmailru (12.06.2013)
Непрочитано 12.06.2013, 17:16  
vitmailru
Частый гость
 
Регистрация: 09.07.2007
Сообщений: 22
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
vitmailru на пути к лучшему
По умолчанию Re: странное поведение АЦП на ATmega32A

Сообщение от omercury Посмотреть сообщение
PHP код:
unsigned int getADC(void)
{   
//    ADMUX=(0‹‹MUX0);// устанавливаем входом ADC0
    
ADCSRA|=(1‹‹ADSC);  //Начать преобразование
    
while ((ADCSRA&_BV(ADIF))==0x00); //Дождаться окончания преобразования
    
return ADCW// возвращаем результат

До меня уже дошло, спасибо)
vitmailru вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Странное поведение щетки nikbob22 Электроника средств транспорта 52 18.11.2012 17:00
АЦП AT91sam7s256 Uragan90 Микроконтроллеры, АЦП, память и т.д 10 25.04.2011 13:30
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03
Странное поведение каретки CD (DVD) привода Bagrat Ремонт оргтехники 14 17.05.2006 19:32


Часовой пояс GMT +4, время: 19:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot