Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.04.2011, 12:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
АЦП AT91sam7s256
Здравствуйте, уважаемые!!! Повесил я кнопочки на ацп мк через рез.делитель и пытаюсь выводить на экран значения АЦП преобразования, материал доётся очень сложно, дело в том что не знаю на сколько правильно настроил ацп и его инициализирую ![Учучь на ошибках](images/smilies/icon_fingal.gif) Ниже код:
Ошибок вроде как компилятор и не выдает, а выводится на экран не как не хочит... Может я напутал чего??? помогите разобраться...
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.
|
|
|
|
22.04.2011, 22:59
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
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
|
|
|
22.04.2011, 23:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: АЦП AT91sam7s256
Спасибо! Я уже разобрался! Запустил! Работает всё как планировал ![Весело](images/smilies/icon_laugh.gif) Теперь буду с тачпанелью дисплея разбираться и запускать...
__________________
Я бы изменил весь мир, но бог не дал исходников
|
|
|
|
22.04.2011, 23:32
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: АЦП AT91sam7s256
ну а что все-таки было-то?
|
|
|
|
23.04.2011, 00:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: АЦП AT91sam7s256
Я устранил те недочеты что вы уже описали, и ещё была проблема с функцией вывода на дисплей значения в миливольтах...
__________________
Я бы изменил весь мир, но бог не дал исходников
|
|
|
|
23.04.2011, 00:34
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: АЦП AT91sam7s256
Попробуйте 10 битный - все ж точнее будет, раз опорное так точно задается - 3298 мВ.
Тем более, что переменная data 16-битная. Меняются только 2 строки, там где вставлялось AT91C_ADC_LOWRES_8_BIT и там, где данные делятся на 256.
|
|
|
|
23.04.2011, 09:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: АЦП AT91sam7s256
При 10 битном режиме, последние цифры скачут 1-2 единицы.
__________________
Я бы изменил весь мир, но бог не дал исходников
|
|
|
|
23.04.2011, 13:12
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: АЦП AT91sam7s256
Зато 8 старших бит почти не дергаются. Я иногда делаю так - работаю с 10-битным АЦП, а учитываю только 8 бит:
case N: data = AT91C_BASE_ADC-›ADC_CDRN ›› 2; break;
получается немножко меньше дребезг результата - шум младшего бита уходит. ИМХО.
|
|
|
Сказали "Спасибо" dadigor
|
|
|
25.04.2011, 13:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.09.2009
Сообщений: 1,899
Сказал спасибо: 470
Сказали Спасибо 408 раз(а) в 255 сообщении(ях)
|
Re: АЦП AT91sam7s256
А случаем нет у кого примерчика с использованием прирывания по уровню ацп? Или может ссылка какая по этому поводу...
__________________
Я бы изменил весь мир, но бог не дал исходников
|
|
|
|
25.04.2011, 13:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: АЦП AT91sam7s256
Сообщение от Uragan90
|
А случаем нет у кого примерчика с использованием прирывания по уровню ацп?
|
SAM7 так не умеет. Только периодически запускать преобразование и в обработчике прерывания по завершению анализировать данные.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:20.
|
|