реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите с АЦП, ацп работает только один цикл
Mad-man
сообщение Apr 1 2010, 12:28
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 5-11-06
Пользователь №: 21 995



запарился уже с ацп
работает только первый цикл (сразу после включения питания) - результат в ADCL - правильный
при повторных преобразованиях (после первого цикла) бит ADSC сбрасывается как и при завершении конвертации (что и ожидаемо) но в в регистре ADCL - стабильно первый результат преобразования

может помимо бита ADSC нужно еще что-то передергивать для начала конвертации???




void ADC_StartConversion() { ADCSRA = (1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); }

inline char ADC_CheckDone() { return !(ADCSRA & (1<<ADSC)); }

void Init_ADC()
{
ADMUX = (1<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
ADCSRA = (1<<ADEN) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
SFIOR=0x00;
}




int main()
{
PORTA = 0b00000000;
DDRA = 0b00000000;

Send_UART("\r\n\r\n\r\n");
Send_UART("New proba\r\n");

while (1)
{
ADC_StartConversion();

_delay_ms(100);

if (ADC_CheckDone())
{
ADC_val = ADCL;
Print_ADC();
Send_UART("\r\n");
}
else
{
Send_UART("Timeout\r\n");
}


_delay_ms(5000);
}
}

Сообщение отредактировал Mad-man - Apr 1 2010, 12:48
Go to the top of the page
 
+Quote Post
V_N
сообщение Apr 1 2010, 13:02
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 12-01-09
Из: Харьков
Пользователь №: 43 270



Цитата
nline char ADC_CheckDone() { return !(ADCSRA & (1<<ADSC)); }

Кажется мне вы погорячились
nline char ADC_CheckDone() { return !(ADCSRA & (1<<ADIF)); }
Go to the top of the page
 
+Quote Post
Mad-man
сообщение Apr 1 2010, 15:32
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 5-11-06
Пользователь №: 21 995



Цитата(V_N @ Apr 1 2010, 16:02) *
Кажется мне вы погорячились
nline char ADC_CheckDone() { return !(ADCSRA & (1<<ADIF)); }


хмммм

понял что вы имеете ввиду
попробую
Go to the top of the page
 
+Quote Post
smac
сообщение Apr 1 2010, 19:31
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Mad-man @ Apr 1 2010, 16:28) *
запарился уже с ацп...

Весь код не смотрел, но по-моему Вы ADCH не вычитываете, что нужно делать обязательно, иначе регистры ADCH:ADCL не обновятся. Подробности в даташите.
Go to the top of the page
 
+Quote Post
Mad-man
сообщение Apr 1 2010, 20:17
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 5-11-06
Пользователь №: 21 995



Цитата(smac @ Apr 1 2010, 22:31) *
Весь код не смотрел, но по-моему Вы ADCH не вычитываете, что нужно делать обязательно, иначе регистры ADCH:ADCL не обновятся. Подробности в даташите.



Ура 1111493779.gif Оно заработало!!!!
Да, проглядел в даташите важный абзац....

Спасибо laughing.gif
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 2 2010, 11:41
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(smac @ Apr 1 2010, 23:31) *
Весь код не смотрел, но по-моему Вы ADCH не вычитываете, что нужно делать обязательно, иначе регистры ADCH:ADCL не обновятся.

А чтобы их прочитать, надо написать

ADC_val = ADC;

Просто ADC без L или H - компилятор на это генерирует чтение слова в нужном порядке. Ну и разумеется ADC_val должно быть int16_t
Если же 10 разрядов не требуется, а достаточно 8, то нужно установить бит ADLAR: ADC Left Adjust Result и считывать только ADCH читать только старший байт без младшего разрешается.

ЗЫ. А зачем там _delay_ms(100) если все равно проверяется готовность АЦП?
Go to the top of the page
 
+Quote Post
Mad-man
сообщение Apr 2 2010, 12:30
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 5-11-06
Пользователь №: 21 995



Цитата(777777 @ Apr 2 2010, 14:41) *
А зачем там _delay_ms(100) если все равно проверяется готовность АЦП?

_delay_ms(100) я выставил чтобы не сыпались таймауты. Хотя для моих частот (3,5Мгц c делителем 128) должно было хватить задержки 5мс

Сообщение отредактировал IgorKossak - Apr 2 2010, 15:47
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016