Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
eugenio
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 3
1

Запись результатов АЦП в массив (Atmega 128)

11.05.2015, 21:13. Просмотров 1288. Ответов 6
Метки нет (Все метки)

Здравствуйте! В моей задаче необходимо считать результаты измерения АЦП гармонического сигнала, частота которого должна входить в диапазон частот 300 - 3400 Гц, в массив некоторой длины arr1 (в моем случае она равна 16 элементам) и скопировать полученный массив в новый - arr2, выполняющий функцию условного буфера (планируется потом передавать с помощью этого буфера результаты АЦП другому микроконтроллеру по SPI).
Дабы наблюдать сигнал, преобразованный обратно в аналог из массива arr2, построена модель в Proteus. Синусоида имеет амплитуду в 2.5В и смещена так же на +2.5В, чтобы попадать в диапазон 0..5 В встроенного АЦП атмеги. Предделитель АЦП равен 2. Массив arr2 выводится на порт D, подключенный в свою очередь к внешнему ЦАП.
При наблюдении осциллограммы выходного сигнала можно заметить, что после правильно отображенных отсчетов #0..14, 15-й отсчет как бы "зависает" и далее отсчеты продолжают отображаться, в том же порядке, если бы этой паузы и не было.

Пожалуйста, выскажите свое мнение, из-за чего это может быть.
Прикрепляю проекты в AVRStudio 5 и Proteus 7.2

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <avr/io.h>
#include <string.h>
 
unsigned char arr1 [16], // массив для записи измерений АЦП
              arr2 [16];// массив, в который копируется массив arr1, после того как arr1 полностью заполнится
int i=0, j, // индексы arr1 и arr2
    arr1_end=0, // флаг окончания записи результатов измерения массива arr1
    first_read=0; // флаг разрешения самого первого считывания arr2
    
 
 
 
 
int main(void)
{
    
    
    DDRD = 0xFF; // порт D на выход
    
    DDRF &= ~(1<< DDF0); // пин PF0 на вход
    PORTF &= ~(1<< PF0); // подтягивающий резистор на PF0 выключен
    
    
    ADCSRA |= (1<< ADEN)| // АЦП включен, 
              (1<< ADFR); //Непрерывный режим преобрахзования
              
    ADCSRA &=~((1<< ADPS1)|(1<< ADPS2)|(1<< ADPS0));// предделитель 2
    
    ADMUX |= (0<< REFS1)|(1<< REFS0)// ИОН AVcc
                        |(1<< ADLAR);// выравнивание по левому краю
    ADMUX &= ~((1<< MUX4)|(1<< MUX3)|(1<< MUX2)|(1<< MUX1)|(1<< MUX0));// вход ADC0
    ADCSRA |= (1<< ADSC);// запуск АЦП
    
    
    memset(arr1, 0, sizeof(arr1));
    memset(arr2, 0, sizeof(arr2));
    
    while(1)
    {
        
        while (!(ADCSRA & (1<< ADIF)));
         
        arr1 [i] = ADCH;// заполнение массива
        
        if (i==15)// если записан последний 15-й элемент массива arr1,
                  
            {   
                memcpy(arr2, arr1, sizeof(arr1));   // то копируем содержимое arr1 в arr2
                first_read=1;
                arr1_end=1;
                j=0;
            }
            
            i++;
            
        if (first_read==1) 
        
            {
                PORTD= arr2 [j]; // вывод записанных 16 элементов массива arr2
                                 // на порт D, в то время как записываются 16
                                 // новых элементов массива arr1
                j++;
            }
            
        if (arr1_end==1)// индекс i массива arr1 обнуляется,
                        // если записан последний 15-й элемент arr1
        
            {
                i=0;
                arr1_end=0;
                
            }   
        ADCSRA |= (1<< ADIF);
            
    }
}
0
Миниатюры
Запись результатов АЦП в массив (Atmega 128)   Запись результатов АЦП в массив (Atmega 128)  
Вложения
Тип файла: rar АЦП и массивы.rar (43.8 Кб, 5 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2015, 21:13
Ответы с готовыми решениями:

Массив с отрицательными числами (Atmega 128, ASM)
Снова обращаюсь за помощью, не могу понять как реализовать данное задание Дан массив чисел N,...

ATmega 128. Кодовый замок
Доброго времени суток! У меня есть задание на курсовой проект : Устройство контроля доступом на...

прошу помогите ATMega 16...128 & SD/MMC
Встала задача сделать устройство которое будет дописывать в файл показание с АЦП. Файл планирую...

Не работает SPI на Atmega 128 в Atmel Studio 7
Всем доброго времени суток. Столкнулся со следующей проблемой. Нужен spi для Atmega 128 на Atmel...

Atmega 128 fuse как затактовать от внешнего кварца
Всем добрый вечер. собственно вопрос,я начинающий и все опыты делал от внутреннего генератора,вот...

6
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
11.05.2015, 23:29 2
на вскидку(лень сегодня думать)
Цитата Сообщение от eugenio Посмотреть сообщение
unsigned char arr1 [16]
, то есть без знаковые восьми битные числа, а АЦП сколько разрядов выдаёт?
0
ValeryS
Модератор
7476 / 5661 / 723
Регистрация: 14.02.2011
Сообщений: 19,361
Завершенные тесты: 1
11.05.2015, 23:48 3
Цитата Сообщение от Витальич Посмотреть сообщение
а АЦП сколько разрядов выдаёт?
насколько помню 10
но в двух младших обычно мусор посему выравнивают влево, и берут старший байт
0
eugenio
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 3
12.05.2015, 06:26  [ТС] 4
Да, забыл написать. Разрядность - 8.
0
pyzhman
796 / 488 / 68
Регистрация: 15.05.2012
Сообщений: 2,774
12.05.2015, 09:24 5
Цитата Сообщение от eugenio Посмотреть сообщение
Разрядность - 8
C
1
2
ADCSRA |= (1<< ADEN)| // АЦП включен, 
              (1<< ADFR); //Непрерывный режим преобрахзования
Где?
0
eugenio
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 3
12.05.2015, 09:51  [ТС] 6
Цитата Сообщение от pyzhman Посмотреть сообщение
Где?
Вот
Цитата Сообщение от eugenio Посмотреть сообщение
|(1<< ADLAR);// выравнивание по левому краю
Результат преобразования выравнен по левому краю 16 разрядного слова, поэтому достаточно считать только 8-ми разрядный старший байт ADCH.
0
pyzhman
796 / 488 / 68
Регистрация: 15.05.2012
Сообщений: 2,774
12.05.2015, 11:20 7
Ага, увидел.
0
12.05.2015, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2015, 11:20

АЦП на Atmega 328p u
Замучился... помогите плиз! Не работает АЦП на atmega328p u Зависает на ожидании считывания...

АЦП AD7705 c Atmega
Всем привет! В чем затык... Подключил AD7705 к Atmega328. АЦП, вроде, делает пару правильных...

Atmega 128 ширина импульса или интервал в 0.5 ms как реализо
Всем доброго времени суток. Стоит задача как реализовать последовательность импульсов 0 или 1 на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru