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

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

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

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

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

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

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

 
Опции темы
Непрочитано 30.01.2013, 10:44  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.

Сообщение от whoim Посмотреть сообщение
ну и у меня работает так
Интересное усреднение без обнуления result перед накопления суммы
Реклама:
Boba_spb вне форума  
Непрочитано 30.01.2013, 11:53  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.

Boba_spb, далее делит на 10. В чем трабла? Зачем обнулять если мне и нужна вся сумма?
whoim вне форума  
Непрочитано 30.01.2013, 12:03  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.

В том что float result; может пошутить и всадить туды что нить большое, а не маленькое. И, даже разделив на 10, будете очень удивлены результатом.

Поскольку дело происходит на стеке, то лучше напишите float result=0;
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
whoim (03.02.2013)
Непрочитано 30.01.2013, 12:04  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.

@whoim

Спасибо за подсказку! Попытаюсь ваш код интегрировать под мой мк. Если речь зашла о точности измерений, влияет ли парралельное подключение конденсатора (на пример, 100nF) к нижней половине потенциометра на измерения?

P.S. Скажите пожалуйста, под на какой компилятор писалась ваша программа? У меня CVAVR ругается когда я использую комманду return внутри цикла while(1). Может мне следует как-то по другому описать цикл?

Последний раз редактировалось Fogtech; 30.01.2013 в 12:16.
Fogtech вне форума  
Непрочитано 02.02.2013, 14:33  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.

Сообщение от whoim Посмотреть сообщение
Не забудьте загрузить калиброванные значения для повышения точности

Код:
//загрузка калибровочных данных
uint8_t ReadCalibrationByte( uint8_t index )
{
	uint8_t result;
	/* Load the NVM Command register to read the calibration row. */
	NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
	result = pgm_read_byte(index);
	/* Clean up NVM Command register. */
	NVM_CMD = NVM_CMD_NO_OPERATION_gc;
	return( result );
}

Код:
	ADCA.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0) );
	ADCA.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1) );
ну и у меня работает так

Код:
float get_ADC(uint8_t _ch)
{
	float Result;
	
	ADCA.CTRLA = ADC_ENABLE_bm;// enable adc
	
	ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc; // 12 bit conversion
	ADCA.REFCTRL = ADC_REFSEL_VCC_gc;
	ADCA.PRESCALER = ADC_PRESCALER_DIV128_gc; // peripheral clk/128 (32MHz/128=250kHz)
	ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;	 // single ended
	
	//выбор пина
	switch (_ch)
	{
		case 0:
			ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc;
			break;
		
		case 1:
			ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
			break;

		case 2:
			ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc;
			break;

		case 3:
			ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc;
			break;
		
		case 4:
			ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN4_gc;
			break;
	}
	//цикл с усреднением
	for(uint8_t _x=0; _x‹10; _x++)
	{
		ADCA.CH0.CTRL |= ADC_CH_START_bm;  // Start conversion
		while(!(ADCA.CH0.INTFLAGS));
		ADCA.CH0.INTFLAGS=ADC_CH_CHIF_bm;
		Result += ADCA.CH0RES;
	}	
	
	Result = Result / 10;	
	return (Result * 20.6 / 4096 - ADC_GND_OFFSET);
}
Для написания программы я использую CodeVision. В связи с этим у меня возникли проблемы с "подгонкой" кода под CV. На данный момент проблема, как я понимаю, в отсутствии библиотеки pgmspace.h.
Попытался взять эту библиотеку с WinAVR, потом с AtmelStudio - полезли проблемы в описании функций в этих библиотеках. Без библиотеки функция pgm_read_byte и переменная NVM_CMD не определяются компилятором.
Поисковик увы не дал желаемого результата. Просьба помочь адаптировать код с калибровкой ADC для CV. Может кто-то уже имеет опыт.

Последний раз редактировалось Fogtech; 02.02.2013 в 15:09.
Fogtech вне форума  
Непрочитано 02.02.2013, 23:46  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1

CodeWizard в помощь...
Нашел понятную для CodeVision часть кода:
Код:
// Function used to read the calibration byte from the
// signature row, specified by 'index'
#pragma optsize-
unsigned char read_calibration_byte(unsigned char index)
{
    unsigned char r;
    NVM.CMD=NVM_CMD_READ_CALIB_ROW_gc;
    r=*((flash unsigned char*) index);
    // Clean up NVM command register
    NVM.CMD=NVM_CMD_NO_OPERATION_gc;
    return r;
}
и загрузка кода:

Код:
// Load the calibration value for 12 Bit resolution from the signature row
ADCA.CALL=read_calibration_byte(PROD_SIGNATURES_ST  ART+ADCACAL0_offset);
ADCA.CALH=read_calibration_byte(PROD_SIGNATURES_ST  ART+ADCACAL1_offset);
Всем спасибо!
Fogtech вне форума  
Непрочитано 03.02.2013, 00:16  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде

Сообщение от Fogtech Посмотреть сообщение
Спасибо за подсказку! Попытаюсь ваш код интегрировать под мой мк. Если речь зашла о точности измерений, влияет ли парралельное подключение конденсатора (на пример, 100nF) к нижней половине потенциометра на измерения?
P.S. Скажите пожалуйста, под на какой компилятор писалась ваша программа? У меня CVAVR ругается когда я использую комманду return внутри цикла while(1). Может мне следует как-то по другому описать цикл?
писалось под винавр, внутри while(1) не стоит размещать функции, их надо внести отдельно. Если нет объявлений в начале или в инклайде, размещайте функции до main

про кондюк затрудняюсь ответить, никогда так не делал. Имхо это не нужно.
whoim вне форума  
Непрочитано 24.02.2013, 21:31  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде

Еще один вопрос - как зафиксировать длину переменной, собирающую АЦП значение? К примеру у меня 12-битный АЦП - максимальное значение 4095, четырехзначное. Но когда значение трехзначное или 2х, мне необходимо чтобы дописывались ноли вначале числа и длина переменной оставалась неизменной, что по-умолчанию не происходит. Спасибо.
Fogtech вне форума  
Непрочитано 25.02.2013, 04:16  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде

Сообщение от Fogtech Посмотреть сообщение
Еще один вопрос - как зафиксировать длину переменной, собирающую АЦП значение? К примеру у меня 12-битный АЦП - максимальное значение 4095, четырехзначное. Но когда значение трехзначное или 2х, мне необходимо чтобы дописывались ноли вначале числа и длина переменной оставалась неизменной, что по-умолчанию не происходит. Спасибо
ничо непонял. Если вы представляете число как число, откуда нули впереди? Они возможны при символьном представлении результата.
whoim вне форума  
Непрочитано 25.02.2013, 04:30  
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: ADC для ATXmega128A1 - помогите найти ошибку в коде

Проблемма была в следующем: АЦП значения пересылались по УАРТу с непостоянной суммой количества знаков. Напр., вместо "0027" отсылалось "27". Пришлось код полностью перелопатить и отказаться от некоторых стандартных функций, впользу наглядности процесса. Дело еще не доведено до конца, но уже виден свет в конце тунеля )). Спасибо.
Fogtech вне форума  
 

Закладки

Метки
adc, atxmega128a1, xmega128-a1 xplained, ацп, код
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку barbuss Микроконтроллеры, АЦП, память и т.д 9 16.10.2013 18:05
Помогите найти ошибку AVR asm sibiryak983 AVR 46 04.02.2013 16:58
Помогите найти ошибку в моделировании 172senator Proteus 0 22.12.2010 14:18
Помогите найти ошибку в исходнике (+) Don_Ambrosio Микроконтроллеры, АЦП, память и т.д 1 29.04.2008 18:30
Помогите найти ошибку в PROTEUS maxNTF Proteus 2 29.11.2007 10:26


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


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