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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

АЦП AT91sam7s256

Непрочитано 21.04.2011, 12:09  
Uragan90
Почётный гражданин KAZUS.RUN
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,895
Сказал спасибо: 469
Сказали Спасибо 407 раз(а) в 254 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию АЦП AT91sam7s256

Здравствуйте, уважаемые!!! Повесил я кнопочки на ацп мк через рез.делитель и пытаюсь выводить на экран значения АЦП преобразования, материал доётся очень сложно, дело в том что не знаю на сколько правильно настроил ацп и его инициализирую Ниже код:
Ошибок вроде как компилятор и не выдает, а выводится на экран не как не хочит... Может я напутал чего??? помогите разобраться...

PHP код:
#include ‹AT91SAM7S256.H›



const unsigned int Upit_mV = 3298; //напряжение питания в мВ (точное значение)


unsigned int data=0;     //результат АЦП в дискретах
unsigned int data_mV=0;     //результат АЦП в мВ 


unsigned int r1000=0;   //-----------------------------------
unsigned int r100=0;    // разряды десятичного числа
unsigned int r10=0;     //
unsigned int r1=0;      //-----------------------------------


              
void adc_init (void);                                  // Функция инициализации ADC
unsigned short int adc_read (unsigned char channel);   // функция запуска и получения результата ADC



/*
//-------------------------------------------------------------------------------
//--- Функция инициализации ADC -------------------------------------------------
//-------------------------------------------------------------------------------
*/

void adc_init (void)
{

    AT91C_BASE_PMC-›PMC_PCER = 1 ‹‹ AT91C_ID_ADC;
    AT91C_BASE_ADC-›ADC_CR = AT91C_ADC_SWRST;       // Очистка результата АЦП
    AT91C_BASE_ADC-›ADC_IDR = 0xffffffff;           // Отключаем прерывания АЦП
    AT91C_BASE_ADC-›ADC_MR = 0;                     // Очищаем регистр

    AT91C_BASE_ADC-›ADC_MR =                        // Задание параметров АЦП
        (AT91C_ADC_SLEEP                 
        | ((23 ‹‹ 8) & AT91C_ADC_PRESCAL)           // Такт АЦП ~= 1MHz
        | ((4 ‹‹ 16) & AT91C_ADC_STARTUP)           // Время запуска ~= 1us
        | ((4 ‹‹ 24) & AT91C_ADC_SHTIM));

}
 
/*
//--------------------------------------------------------------------------
//--- функция запуска и получения результата ADC  --------------------------
//--- (входной параметр - активный канал АЦП)     --------------------------
//--------------------------------------------------------------------------
*/

unsigned short int adc_read (unsigned char channel)
{
    unsigned int data;


    AT91C_BASE_ADC-›ADC_CHDR = 0xffffffff;                          // Выключаем все каналы АЦП
    AT91C_BASE_ADC-›ADC_CHER = (unsigned long int) (1 ‹‹ channel);  // Включаем все каналы АЦП
    AT91C_BASE_ADC-›ADC_CR = AT91C_ADC_START;                       // Запуск АЦП преобразования

    while (!(AT91C_BASE_ADC-›ADC_SR & (1 ‹‹ channel))) ;            // Ожидание окончания АЦП преобразования

    switch(channel)                                                    // Получаем данные!
    {
        case 0: data = AT91C_BASE_ADC-›ADC_CDR0; break;
        case 1: data = AT91C_BASE_ADC-›ADC_CDR1; break;
        case 2: data = AT91C_BASE_ADC-›ADC_CDR2; break;
        case 3: data = AT91C_BASE_ADC-›ADC_CDR3; break;
        case 4: data = AT91C_BASE_ADC-›ADC_CDR4; break;
        case 5: data = AT91C_BASE_ADC-›ADC_CDR5; break;
        case 6: data = AT91C_BASE_ADC-›ADC_CDR6; break;
        case 7: data = AT91C_BASE_ADC-›ADC_CDR7; break;
    }


    return data;

        AT91C_BASE_ADC-›ADC_CR = AT91C_ADC_START;

  while(!(AT91C_BASE_ADC-›ADC_SR&chanel));       // Ожидание окончания АЦП преобразования

        data_mV = (data * Upit_mV) / 256;        //вычисление результата АЦП в мВ
//-----------------------------------------------------------------------------------------
        r1000 = data_mV / 1000;
        data_mV = data_mV % 1000;
        r100 = data_mV / 100;
        data_mV = data_mV % 100;
        r10 = data_mV / 10;
        r1 = data_mV % 10;

...............
...............        //Индикация резултата

} 
Реклама:
__________________
Я бы изменил весь мир, но бог не дал исходников

Последний раз редактировалось Uragan90; 21.04.2011 в 12:19.
Uragan90 вне форума  
Непрочитано 22.04.2011, 22:59  
dadigor
Прописка
 
Аватар для dadigor
 
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
dadigor на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

в объявлении:
unsigned short int adc_read (unsigned char channel)
{
unsigned int data;
...

а в конце:
return data;

я бы написал:
return (unsigned short int)data;

в повторной строке (к чему она вообще?) наверное вместо:
while(!(AT91C_BASE_ADC-›ADC_SR&chanel));
должно быть так:
while(!(AT91C_BASE_ADC-›ADC_SR&(1 ‹‹ chanel)));

Судя по всему ("data_mV = (data * Upit_mV) / 256;"), используется 8-битное преобразование, поэтому в регистре режима должна быть соотв. "1":
AT91C_BASE_ADC-›ADC_MR = // Задание параметров АЦП
(AT91C_ADC_SLEEP
| AT91C_ADC_LOWRES_8_BIT // Иначе будет 10-битное преобразование
| ((23 ‹‹ 8 ) & AT91C_ADC_PRESCAL) // Такт АЦП ~= 1MHz
| ((4 ‹‹ 16) & AT91C_ADC_STARTUP) // Время запуска ~= 1us
| ((4 ‹‹ 24) & AT91C_ADC_SHTIM));

Последний раз редактировалось dadigor; 22.04.2011 в 23:29.
dadigor вне форума  
Сказали "Спасибо" dadigor
Uragan90 (22.04.2011)
Непрочитано 22.04.2011, 23:29  
Uragan90
Почётный гражданин KAZUS.RUN
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,895
Сказал спасибо: 469
Сказали Спасибо 407 раз(а) в 254 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

Спасибо! Я уже разобрался! Запустил! Работает всё как планировал Теперь буду с тачпанелью дисплея разбираться и запускать...
__________________
Я бы изменил весь мир, но бог не дал исходников
Uragan90 вне форума  
Непрочитано 22.04.2011, 23:32  
dadigor
Прописка
 
Аватар для dadigor
 
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
dadigor на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

ну а что все-таки было-то?
dadigor вне форума  
Непрочитано 23.04.2011, 00:22  
Uragan90
Почётный гражданин KAZUS.RUN
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,895
Сказал спасибо: 469
Сказали Спасибо 407 раз(а) в 254 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

Я устранил те недочеты что вы уже описали, и ещё была проблема с функцией вывода на дисплей значения в миливольтах...
__________________
Я бы изменил весь мир, но бог не дал исходников
Uragan90 вне форума  
Непрочитано 23.04.2011, 00:34  
dadigor
Прописка
 
Аватар для dadigor
 
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
dadigor на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

Попробуйте 10 битный - все ж точнее будет, раз опорное так точно задается - 3298 мВ.
Тем более, что переменная data 16-битная. Меняются только 2 строки, там где вставлялось AT91C_ADC_LOWRES_8_BIT и там, где данные делятся на 256.
dadigor вне форума  
Непрочитано 23.04.2011, 09:25  
Uragan90
Почётный гражданин KAZUS.RUN
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,895
Сказал спасибо: 469
Сказали Спасибо 407 раз(а) в 254 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

При 10 битном режиме, последние цифры скачут 1-2 единицы.
__________________
Я бы изменил весь мир, но бог не дал исходников
Uragan90 вне форума  
Непрочитано 23.04.2011, 13:12  
dadigor
Прописка
 
Аватар для dadigor
 
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
dadigor на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

Зато 8 старших бит почти не дергаются. Я иногда делаю так - работаю с 10-битным АЦП, а учитываю только 8 бит:

case N: data = AT91C_BASE_ADC-›ADC_CDRN ›› 2; break;

получается немножко меньше дребезг результата - шум младшего бита уходит. ИМХО.
dadigor вне форума  
Сказали "Спасибо" dadigor
Uragan90 (23.04.2011)
Непрочитано 25.04.2011, 13:07  
Uragan90
Почётный гражданин KAZUS.RUN
 
Аватар для Uragan90
 
Регистрация: 20.09.2009
Сообщений: 1,895
Сказал спасибо: 469
Сказали Спасибо 407 раз(а) в 254 сообщении(ях)
Uragan90 на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

А случаем нет у кого примерчика с использованием прирывания по уровню ацп? Или может ссылка какая по этому поводу...
__________________
Я бы изменил весь мир, но бог не дал исходников
Uragan90 вне форума  
Непрочитано 25.04.2011, 13:23  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: АЦП AT91sam7s256

Сообщение от Uragan90 Посмотреть сообщение
А случаем нет у кого примерчика с использованием прирывания по уровню ацп?
SAM7 так не умеет. Только периодически запускать преобразование и в обработчике прерывания по завершению анализировать данные.
kison вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Видео уроки dosikus Микроконтроллеры, АЦП, память и т.д 61 23.01.2012 21:06
Конфликт прерываний таймера и АЦП ask_e Микроконтроллеры, АЦП, память и т.д 11 08.08.2010 01:28
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.