Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
22.11.2011, 20:44
|
|
Прохожий
Регистрация: 20.11.2011
Сообщений: 8
Сказал спасибо: 6
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
ADC- Free Running mode и мультиплексор.AVR
Проблема с автоматическим перезапуском АЦП в режиме Free Running. И с переключением мультиплексора. Порой в следующий канал влезает значение судя по всему предыдущего. Шит читал, но недопонял,
1)что минимально необходимо и в какой момент для безопасного переключения каналов..желательно пример..
2)АЦП начинает новое преобразование по установке вручную ADIF? В дебагере AVR Studio никак не хочет начинать второе преобразование, пока не выставишь еще и ADSC. Прерывания я отключил, есть только флаг.
Код:
|
void adc_init(void)
{
/*компаратор отключим*/
ACSR = (1‹‹7);//0x80;
/*используем внутренний опорник(2.56V), результат выравниваем вправо
входной канал ацп - первый*/
ADMUX = (1‹‹REFS1)|(1‹‹REFS0)|(1‹‹MUX0);//
/*разрешим ацп, запустим преобразование (непрерывный режим)
без прерывний, частота преобразования 76кГц*/
ADCSRA = 0xE3;// 11100011 / Коэффициент деления частоты = 8
}
int main(void)
{
current_ch = 0;
adc_init();
while(1)
{
adc_isr();
}
return 1;
}
// Основная функция АЦП преобразования
//================================================== ======
void adc_isr(void)
{
if((ADCSRA››ADIF)&1) // проверка установки ADIF - флага прер. по завершению АЦП
{
if (num ‹ 20) // заполнение значениями АЦП буфера канала
{
adc_buf[current_ch][num] = ADCL;
adc_buf[current_ch][num] |= (ADCH‹‹8);
num++;
}
else
{
num = 0;
switch_channel(); //меняем канал ,т.е. MUXы
}
ADCSRA |= ((1‹‹ADIF); // |(1‹‹ADSC)); // установка флага завершения АЦП
}
} |
|
|
|
Сказали "Спасибо" Piknik13
|
|
|
22.11.2011, 21:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,053
Сказал спасибо: 3,042
Сказали Спасибо 3,212 раз(а) в 2,182 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Сообщение от Piknik13
|
2)АЦП начинает новое преобразование по установке вручную ADIF? В дебагере AVR Studio никак не хочет начинать второе преобразование, пока не выставишь еще и ADSC. Прерывания я отключил, есть только флаг.
|
Нет, первый запуск АЦП даётся битом ADSC, а последующие - при автоматической установке ADIF в конце преобразования.
Симулятор может глючить, почитайте раздел "known issues" в справке АВРСтудио.
Сообщение от Piknik13
|
1)что минимально необходимо и в какой момент для безопасного переключения каналов..желательно пример..
|
Смена каналов производится за 1 такт АЦП до установки ADIF:
Once the conversion starts, the channel and reference selection is locked to ensure a sufficient sampling time for the ADC. Continuous updating resumes in the last ADC clock cycle before the conversion completes (ADIF in ADCSRA is set).
Т.е. менять ADMUX можно в любое время от 1 такта частоты АЦП после запуска (по ADSC или по ADIF&ADATE) и до завершения преобразования (см. рисунок "ADC Timing Diagram, Auto Triggered Conversion"). Довольно неудобно сделано, надо за временем следить...
Что касается приведённой программы, то можно посмотреть в диассемблере, в сколько команд и тактов укладывается фрагмент от "if (num ‹ 20)" до "else". Если больше 8 тактов (наверняка, т.к. вычисляются адреса в массиве и идёт обращение в ОЗУ), то менять каналы как есть сейчас. Но только не на 20 шаге, а на 19-м - т.е. уже начнётся 20-е преобразование текущего канала и запишем его смену на следующем шаге.
Как-то так.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо ForcePoint за это сообщение:
|
|
|
23.11.2011, 10:07
|
|
Прохожий
Регистрация: 20.11.2011
Сообщений: 8
Сказал спасибо: 6
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Сообщение от ForcePoint
|
Нет, первый запуск АЦП даётся битом ADSC, а последующие - при автоматической установке ADIF в конце преобразования.
|
С ADSC понятно, что он выставляется один раз для запуска. По окончании преобразования автоматически выставляется ADIF , но разве сразу же после этого автоматом начинается новое преобразование? Я так понимаю, что новое начинается, когда я вручную сниму флаг вот так: ADCSRA |= (1‹‹ADIF); ??
|
|
|
Сказали "Спасибо" Piknik13
|
|
|
23.11.2011, 11:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Сообщение от Piknik13
|
С ADSC понятно,
|
Ничего Вам не понятно, не обманывайте себя, для установки режима Free Running нужно установить бит ADFR в ADCSRA. Трогать бит флага не надо, он устанавливается автоматически (cleared by hardware). И , вообще, непонятно зачем манипулировать этим битом в режиме Free Running, какой смысл?
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
23.11.2011, 11:40
|
|
Прохожий
Регистрация: 20.11.2011
Сообщений: 8
Сказал спасибо: 6
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Сообщение от nonamedov
|
Ничего Вам не понятно, не обманывайте себя, для установки режима Free Running нужно установить бит ADFR в ADCSRA. Трогать бит флага не надо, он устанавливается автоматически (cleared by hardware). И , вообще, непонятно зачем манипулировать этим битом в режиме Free Running, какой смысл?
|
Вы говорите про установку режима, я про первый пуск. ADFR, у меня он ADATA поставлен при инициализации. Про флаг : "ADIF is cleared by hardware when executing the corresponding interrupt
handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag." Т.к. вектора прерываний у меня нет и прерывание отключено, как он будет автоматически стираться расскажите?
|
|
|
Сказали "Спасибо" Piknik13
|
|
|
23.11.2011, 11:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
В ФриРуннинге следующее преобразование начинается СРАЗУ после окончания предыдущего, независимо от состояния АДИФ. Но его лучше сбрасывать вручную или обработкой прерывания - иначе как вы узнаете, что новое преобразование завершено? И вообще, переставайте бояться прерываний - они мягкие, пушистые, и совсем не страшные
|
|
|
Эти 2 пользователя(ей) сказали Спасибо niXto за это сообщение:
|
|
|
23.11.2011, 12:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Если это не обработка прерывания, то почему у Вас функция называется так?!
Сообщение от Piknik13
|
void adc_isr(void)
|
Сообщение от niXto
|
Но его лучше сбрасывать вручную или обработкой прерывания - иначе как вы узнаете, что новое преобразование завершено?
|
Оно, ведь сбрасывается по выходу их функции прерывания, и как по Вашему проводить проверку окончания преобразования АЦП в режиме FreeRunning? неужели МК ничего другого не делает, или измерения по одному каналу будет по нескольку раз, пока это заметить программа???
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
23.11.2011, 13:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Сообщение от nonamedov
|
Оно, ведь сбрасывается по выходу их функции прерывания, и как по Вашему проводить проверку окончания преобразования АЦП в режиме FreeRunning?
|
Условия задачи
Сообщение от Piknik13
|
вектора прерываний у меня нет и прерывание отключено
|
|
|
|
|
23.11.2011, 15:15
|
|
Прохожий
Регистрация: 20.11.2011
Сообщений: 8
Сказал спасибо: 6
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: ADC- Free Running mode и мультиплексор.AVR
Сообщение от nonamedov
|
Если это не обработка прерывания, то почему у Вас функция называется так?!
Оно, ведь сбрасывается по выходу их функции прерывания, и как по Вашему проводить проверку окончания преобразования АЦП в режиме FreeRunning? неужели МК ничего другого не делает, или измерения по одному каналу будет по нескольку раз, пока это заметить программа???
|
Это просто функция, обработчик прерываний иначе выглядит. Окончание - по флагу АДИФ судя по всему. это плата АЦП, у нее других функций особо нет.
|
|
|
Сказали "Спасибо" Piknik13
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:28.
|
|