0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 3

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

11.05.2015, 21:13. Показов 5671. Ответов 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);
            
    }
}
Миниатюры
Запись результатов АЦП в массив (Atmega 128)   Запись результатов АЦП в массив (Atmega 128)  
Вложения
Тип файла: rar АЦП и массивы.rar (43.8 Кб, 23 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2015, 21:13
Ответы с готовыми решениями:

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

Массив: Заполнить массив значениями от 0 до 255, если значение меньше 128, заменить на 0, больше 128 - на 1...
Задача: Заполнить двумерный массив значениями от 0 до 255. Если значение меньше 128, заменить на 0, больше 128 - на 1. Вот написал код,...

Таймер Atmega 128
Здравствуйте, объясните пожалуйста вот эти строчки поэтапно clr r18 sbi DDRA,1 ldi r16,(1&lt;&lt;ISC61|1&lt;&lt;ISC60) out...

6
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
11.05.2015, 23:29
на вскидку(лень сегодня думать)
Цитата Сообщение от eugenio Посмотреть сообщение
unsigned char arr1 [16]
, то есть без знаковые восьми битные числа, а АЦП сколько разрядов выдаёт?
0
Модератор
Эксперт по электронике
8975 / 6741 / 921
Регистрация: 14.02.2011
Сообщений: 23,841
11.05.2015, 23:48
Цитата Сообщение от Витальич Посмотреть сообщение
а АЦП сколько разрядов выдаёт?
насколько помню 10
но в двух младших обычно мусор посему выравнивают влево, и берут старший байт
0
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 3
12.05.2015, 06:26  [ТС]
Да, забыл написать. Разрядность - 8.
0
1184 / 659 / 113
Регистрация: 15.05.2012
Сообщений: 4,077
12.05.2015, 09:24
Цитата Сообщение от eugenio Посмотреть сообщение
Разрядность - 8
C
1
2
ADCSRA |= (1<< ADEN)| // АЦП включен, 
              (1<< ADFR); //Непрерывный режим преобрахзования
Где?
0
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 3
12.05.2015, 09:51  [ТС]
Цитата Сообщение от pyzhman Посмотреть сообщение
Где?
Вот
Цитата Сообщение от eugenio Посмотреть сообщение
|(1<< ADLAR);// выравнивание по левому краю
Результат преобразования выравнен по левому краю 16 разрядного слова, поэтому достаточно считать только 8-ми разрядный старший байт ADCH.
0
1184 / 659 / 113
Регистрация: 15.05.2012
Сообщений: 4,077
12.05.2015, 11:20
Ага, увидел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2015, 11:20
Помогаю со студенческими работами здесь

программирование Atmega 128
Подскажите пожалуйста как подсоединять мегу к программатору avr910/ а то она чет не щьется.

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

Atmega 128 плохо заводится
Доброго времени суток, форумчане. Прошу помощи. Есть фонари с демо-режимом построенные на сабжевой атмеге. Случилась проблемка и внутрь...

Ремонт Zelio SR2A201BD (Atmega 128)
Здравствуйте уважаемые форумчане .Попался мне контролер SR2A201BD на мк atmega 128 после диагностики било обнаружено повреждения процесора...

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


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

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

Новые блоги и статьи
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru