Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.11.2010, 02:21
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Помогите настроить АЦП в Atmega32
Проблема: данные с АЦП как то криво снимаютса. Не знаю в чем проблема.
МК Atmega32. Компилятор Code Vision 2.04.
|
|
|
|
04.11.2010, 02:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
Что Значит Криво? Объясните хоть .(Нормальный АЦП)(Может Сам Сигнал кривой?)
|
|
|
|
04.11.2010, 02:32
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
Вот настройка АЦП
ADMUX=0x00; //chanel ADC 0
ADCSRA=0b10000110; //x64
использую внешний ИОН на 2,56 В.
Напряжение на выводе AREF 2,51 В.
Вывод AVCC подключил к питанию +4,89 В.
В беспрерывном цикле опрашиваю 6 каналов ацп
while(1)
{
//printf("777\r\n");
ADMUX=0b00000000; //chanel ADC 0
// Delay needed for the stabilization of the ADC input voltage
delay_us(delay_adc);
ADCSRA|=0x40; // Start one AD conversion
while (!(ADCSRA & 0x10)); // Wait for the AD conversion to complete
adc_0=adc_0+(ADCW››2);
ADMUX=0b00000001; //chanel ADC 1
// Delay needed for the stabilization of the ADC input voltage
delay_us(delay_adc);
ADCSRA|=0x40; // Start one AD conversion (bit 6 to set one)
while (!(ADCSRA & 0x10)); // Wait for the AD conversion to complete
adc_1=adc_1+(ADCW››2);
ADMUX=0b00000010; //chanel ADC 2
// Delay needed for the stabilization of the ADC input voltage
delay_us(delay_adc);
ADCSRA|=0x40; // Start one AD conversion (bit 6 to set one)
while (!(ADCSRA & 0x10)); // Wait for the AD conversion to complete
adc_2=adc_2+(ADCW››2);
ADMUX=0b00000011; //chanel ADC 3
// Delay needed for the stabilization of the ADC input voltage
delay_us(delay_adc);
ADCSRA|=0x40; // Start one AD conversion (bit 6 to set one)
while (!(ADCSRA & 0x10)); // Wait for the AD conversion to complete
adc_3=adc_3+(ADCW››2);
ADMUX=0b00000100; //chanel ADC 4
// Delay needed for the stabilization of the ADC input voltage
delay_us(delay_adc);
ADCSRA|=0x40; // Start one AD conversion (bit 6 to set one)
while (!(ADCSRA & 0x10)); // Wait for the AD conversion to complete
adc_4=adc_4+(ADCW››2);
ADMUX=0b00000101; //chanel ADC 5
// Delay needed for the stabilization of the ADC input voltage
delay_us(delay_adc);
ADCSRA|=0x40; // Start one AD conversion (bit 6 to set one)
while (!(ADCSRA & 0x10)); // Wait for the AD conversion to complete
adc_5=adc_5+(ADCW››2);
n_adc++;
}
Последний раз редактировалось sergx1300; 04.11.2010 в 02:46.
|
|
|
|
04.11.2010, 02:36
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
вот что вышло
а должна быть более менее прямая линия
|
|
|
|
04.11.2010, 02:41
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
считывание данных осуществляется в int
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) //-------------------------------------------------
{
//printf("int\r\n");
if (m==1)
{
//printf("W\r\n");
write_mmc(adc_0/n_adc); //запис середнього значення з АЦП0 в буфер
write_mmc(adc_1/n_adc); //запис середнього значення з АЦП1 в буфер
write_mmc(adc_2/n_adc); //запис середнього значення з АЦП2 в буфер
write_mmc(adc_3/n_adc); //запис середнього значення з АЦП3 в буфер
write_mmc(adc_4/n_adc); //запис середнього значення з АЦП4 в буфер
write_mmc(adc_5/n_adc); //запис середнього значення з АЦП5 в буфер
}
if (m›1)
{
m--; //обнуленя зміної для пропуску одного інт після запису буфера в ммс
}
adc_0=0;
adc_1=0;
adc_2=0;
adc_3=0;
adc_4=0;
adc_5=0;
n_adc=0;
}
|
|
|
|
04.11.2010, 02:42
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
сигнал не кривой на осцилографе смотрел
|
|
|
|
04.11.2010, 02:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
Для начала , Вы берёте четвертинку- и складываете с предыдущим ....так и будет скакать (кстати- среднее не отметили.) ()
Интерполяция (аппроксимировать функцию , сгладить)
upd. Если так , берёте предыдущее , складываете с текущим - затем пополам .
Последний раз редактировалось OlegNZH; 04.11.2010 в 03:00.
|
|
|
|
04.11.2010, 02:58
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
конденсатор на АРЕФе надо поставить. И не забываем читать даташит за 1-2 микросекунды до старта преобразования надо застопорить таймера, периферию, и на все время преобразования тормознуть камушек в sleep.
Если скорость преобразования не существенна то лучше перед преобразованием сделать delay_ms(20)
Я для старта использую вот такой шаблончик:
#define ADC_START ADC_ready=0; delay_ms(20); ADCSRA=0b11001011;
где ADC_ready это просто char флаг выставляемый в прерывании как 1.
Но можно и без прерывания и без флага так как в ADCSRA есть бит выполняющий ту же функцию (ставит 1 по окончанию прерывания)
Кроме того, входные цепи ADC должны быть как минимум снабжены делителем 1 к 1 (источник -2r2 - ножка adc- 47Kohm - земля) и стабилитроном 3v1 чтобы гасить паразитные токи на землю матушку.
так сказать альтернатива тому что написал OlegNZH воплощенная в железках))))
__________________
Найди путь или проложи сам!
Последний раз редактировалось MasterMushi; 04.11.2010 в 03:01.
|
|
|
|
04.11.2010, 02:59
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
сигнал поступает на диодной мост. После диодного моста стоят 6 подстроечных резисторов, с помощью которых можно отдельно регулировать каждый канал.
|
|
|
|
04.11.2010, 03:07
|
|
Прописка
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
|
Re: Помогите настроить АЦП в Atmega32
Сообщение от MasterMushi
|
за 1-2 микросекунды до старта преобразования надо застопорить таймера, периферию, и на все время преобразования тормознуть камушек в sleep.
|
думаю ето уж так сильно не сказывается на результатах ацп
А вот кондеры обязательно поставлю
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:43.
|
|