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

 
 
> проблема с АЦП, проблема с АЦП
azure
сообщение Mar 20 2008, 13:45
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 20-03-08
Пользователь №: 36 086



Помогите разобратся с АЦП.

Пишу программу для считывания уровня напряжения с переменного резистора (от 0 до 5 В).
Микроконтроллер: ATmega16 работает на частоте 16МГц. Вход A0. Разрядность АЦП: 10бит. Считывание одинарное (но вызывается регулярно)

Программа работает, но при считывании уровня 0В выдает в ADCW не 0, а 15. При этом с верхним уровнем никаких проблем нет (1023).

Код программы ниже. Написано в WinAVR последней версии (на нижних версиях результат тот же).
Бьюсь неделю, не могу понять. Пробовал прошивать другой контроллер (8535) - результат тот же 07.gif

Код
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
    #define  F_CPU 16000000UL
#include <util/delay.h>

volatile unsigned int ADC_w = 0;

int
segment_decoder(int num, int point)
{
int result = 0x3F;
    switch(num)
    {
        case 0: result = 0x3F;
        break;
        case 1: result = 0x06;
        break;
        case 2: result = 0x5B;
        break;
        case 3: result = 0x4F;
        break;
        case 4: result = 0x66;
        break;
        case 5: result = 0x6D;
        break;
        case 6: result = 0x7D;
        break;
        case 7: result = 0x07;
        break;
        case 8: result = 0x7F;
        break;
        case 9: result = 0x6F;
        break;
        default: result = 0x3F;
        break;
    }

if(point!=0)
    {
    result = (result | 0x80);
    }

  return result;
}

ISR(ADC_vect)
{
    ADC_w = ADCW;//ADCL;
}


int main(void)
{
_delay_ms(2);

DDRA = 0x00;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;

PORTA= 0xFF;
PORTB= 0x00;
PORTC= 0x00;
PORTD= 0x00;


SREG    |= _BV(7);

   ADCSRA |= (1<<ADPS0);
   ADCSRA |= (1<<ADPS1);
   ADCSRA |= (1<<ADPS2);
    
ADMUX  = 0x40;
    
   ADCSRA |= (1 << ADATE);
   ADCSRA |= (1<<ADIE);
   ADCSRA |= (1<<ADEN);

sei();
   while(1)
    {
    ADCSRA |= (1<<ADSC);
    while(ADCSRA & 0x40)
    {
            PORTB = segment_decoder( (ADC_w/1000)%10, 0);
        PORTD = 2;
    _delay_us(10);
        PORTD = 0;
            PORTB = segment_decoder( (ADC_w/100)%10, 0);
        PORTD = 4;
    _delay_us(10);
        PORTD = 0;
            PORTB = segment_decoder( (ADC_w/10)%10, 1);
        PORTD = 8;
    _delay_us(10);
        PORTD = 0;
            PORTB = segment_decoder( ADC_w%10, 0);
        PORTD = 16;
    _delay_us(10);
    }
    };

return 0;
}


Сообщение отредактировал azure - Mar 20 2008, 13:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Mar 21 2008, 12:10
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(azure @ Mar 20 2008, 13:45) *
Помогите разобратся с АЦП.
Пишу программу для считывания уровня напряжения с переменного резистора (от 0 до 5 В).
Микроконтроллер: ATmega16 работает на частоте 16МГц. Вход A0. Разрядность АЦП: 10бит. Считывание одинарное (но вызывается регулярно). Программа работает, но при считывании уровня 0В выдает в ADCW не 0, а 15. При этом с верхним уровнем никаких проблем нет (1023)


Похоже у вас плохое опорное напряжение. Попробуйте внутреннее 2,56В для начала или подключите к ноге AREF внешний опорник. Не забудьте только биты REFS1-0 поправить.

Ну и несколько замечаний по коду, что сходу бросаются в глаза.

1) Запустили ацп в режиме free run, но в главном цикле вы всё время запускаете начало преобразования. Если вы хотите single conversion, то надо дождаться конца преобразования.

2) Есть стробы записи в регистры 1, 2, 3. А вот в регистр 4 строба записи нет, надо добавить.

3) В главном цикле используется переменная ADC_w, но она может быть испорчена в любой момент в прерывании. Примите меры.

4) Непонятна роль оператора while(ADCSRA & 0x40). Почему что-то делается, когда преобразование не закончено?

5) Зачем стоит оператор return 0 в конце программы? У вас там что, операционка стоит?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- azure   проблема с АЦП   Mar 20 2008, 13:45
- - GDI   там 0 может и не быть, потому как шумы, эффекты кв...   Mar 20 2008, 14:20
- - azure   Я результат преобразования вывожу на семисегментны...   Mar 20 2008, 14:28
|- - MrYuran   Цитата(azure @ Mar 20 2008, 17:28) Я резу...   Mar 20 2008, 14:42
|- - galjoen   Цитата(MrYuran @ Mar 20 2008, 17:42) А ес...   Mar 20 2008, 15:14
- - azure   я это уже пробовал, он там есть. Мерял тестером - ...   Mar 20 2008, 14:45
|- - Kibi   поделюсь тоже соображениями, нет защиты от дребезг...   Mar 24 2008, 14:19
|- - azure   Цитата(Kibi @ Mar 24 2008, 16:19) поделюс...   Apr 9 2008, 12:29
- - konstan   Я при работе с АЦП использую только 8 старших бита...   Mar 20 2008, 15:01
- - MrYuran   А если так попробовать - ADC_w=0; и пустить разок ...   Mar 20 2008, 15:03
- - GDI   Если результат стабильно 15, то скорее всего что т...   Mar 20 2008, 15:14
- - azure   8 бит мне мало, нудно мерять с точностью 0.1% при...   Mar 20 2008, 15:23
- - domowoj   Нужно "засыпать" на время преобразования...   Mar 20 2008, 15:50
- - azure   Внутренней землей я задавался - был 0 (меряло верн...   Mar 20 2008, 16:05
- - domowoj   Может дело в данном образце контроллера?   Mar 20 2008, 16:21
- - SasaVitebsk   Кстати. А что за контроллер? В новых контроллерах...   Mar 20 2008, 17:49
- - Lexdaw   На Меге16 у меня работают сразу три АЦП без выключ...   Mar 21 2008, 07:05
|- - VladimirYU   Цитата(Lexdaw @ Mar 21 2008, 10:05) Единс...   Mar 21 2008, 12:42
- - azure   Цитата(Lexdaw @ Mar 21 2008, 09:05) На Ме...   Mar 21 2008, 08:55
- - Lexdaw   Да дело вряд ли в коде.Если сигнал прямо с переме...   Mar 21 2008, 11:42
- - Kovrov   15 LSB offset error - это жесть а так получается ч...   Mar 21 2008, 12:02
- - Kuzmi4   Повторитель - обязательно. Только там уровень нуля...   Mar 21 2008, 13:07
- - azure   Нашол я где была зарыта ошибка! Скажу что все ...   Mar 21 2008, 17:03


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

 


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


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