AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
30.01.2013, 10:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.
Сообщение от whoim
|
ну и у меня работает так
|
Интересное усреднение без обнуления result перед накопления суммы
|
|
|
|
30.01.2013, 11:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.
Boba_spb, далее делит на 10. В чем трабла? Зачем обнулять если мне и нужна вся сумма?
|
|
|
|
30.01.2013, 12:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.
В том что float result; может пошутить и всадить туды что нить большое, а не маленькое. И, даже разделив на 10, будете очень удивлены результатом.
Поскольку дело происходит на стеке, то лучше напишите float result=0;
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
30.01.2013, 12:04
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде.
@whoim
Спасибо за подсказку! Попытаюсь ваш код интегрировать под мой мк. Если речь зашла о точности измерений, влияет ли парралельное подключение конденсатора (на пример, 100nF) к нижней половине потенциометра на измерения?
P.S. Скажите пожалуйста, под на какой компилятор писалась ваша программа? У меня CVAVR ругается когда я использую комманду return внутри цикла while(1). Может мне следует как-то по другому описать цикл?
Последний раз редактировалось Fogtech; 30.01.2013 в 12:16.
|
|
|
|
02.02.2013, 14:33
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
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.
|
|
|
|
02.02.2013, 23:46
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
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); |
Всем спасибо!
|
|
|
|
03.02.2013, 00:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде
Сообщение от Fogtech
|
Спасибо за подсказку! Попытаюсь ваш код интегрировать под мой мк. Если речь зашла о точности измерений, влияет ли парралельное подключение конденсатора (на пример, 100nF) к нижней половине потенциометра на измерения?
P.S. Скажите пожалуйста, под на какой компилятор писалась ваша программа? У меня CVAVR ругается когда я использую комманду return внутри цикла while(1). Может мне следует как-то по другому описать цикл?
|
писалось под винавр, внутри while(1) не стоит размещать функции, их надо внести отдельно. Если нет объявлений в начале или в инклайде, размещайте функции до main
про кондюк затрудняюсь ответить, никогда так не делал. Имхо это не нужно.
|
|
|
|
24.02.2013, 21:31
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде
Еще один вопрос - как зафиксировать длину переменной, собирающую АЦП значение? К примеру у меня 12-битный АЦП - максимальное значение 4095, четырехзначное. Но когда значение трехзначное или 2х, мне необходимо чтобы дописывались ноли вначале числа и длина переменной оставалась неизменной, что по-умолчанию не происходит. Спасибо.
|
|
|
|
25.02.2013, 04:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде
Сообщение от Fogtech
|
Еще один вопрос - как зафиксировать длину переменной, собирающую АЦП значение? К примеру у меня 12-битный АЦП - максимальное значение 4095, четырехзначное. Но когда значение трехзначное или 2х, мне необходимо чтобы дописывались ноли вначале числа и длина переменной оставалась неизменной, что по-умолчанию не происходит. Спасибо
|
ничо непонял. Если вы представляете число как число, откуда нули впереди? Они возможны при символьном представлении результата.
|
|
|
|
25.02.2013, 04:30
|
|
Частый гость
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: ADC для ATXmega128A1 - помогите найти ошибку в коде
Проблемма была в следующем: АЦП значения пересылались по УАРТу с непостоянной суммой количества знаков. Напр., вместо "0027" отсылалось "27". Пришлось код полностью перелопатить и отказаться от некоторых стандартных функций, впользу наглядности процесса. Дело еще не доведено до конца, но уже виден свет в конце тунеля )). Спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:21.
|
|