Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31

Работа с АЦП PIC18F4550 и передача данных на верхний уровень

16.06.2014, 09:55. Показов 3047. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имею следующую задачу. На мк сформировать массив данных с АЦП, отфильтровать его и отправить на мк. Но мне немножко непонятен сам процесс. Ниже привел фрагмент кода.
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
WORD_VAL ReadPOT(void)
{
    WORD_VAL w;
 
    w.Val = 0;
 
            ADCON0bits.GO = 1;              // начинаем АЦП
            while(ADCON0bits.GO);     // ждем, пока не закончилось
            w.v[0] = ADRESL;          // записываем в переменные
            w.v[1] = ADRESH;
    //---Здесь начинается формирование массива данных для фильтрования---//
    using namespace std;
    double massiv1[]; 
    for (i = 1; i <= 1000; i++);// задаем начальное значение 1 и конечное значение 1000 с шагом 1
    {
        massiv1[i]= (w.v[1] << 8) + w.v[0];
    }
    //---Здесь заканчивается формирование массива данных для фильтрования---//
    //---Фильтр---//
   int i,j,z,k1,k2,hw,n,window;
   double tmp,input,output;
   if(fmod(window,2)==0) window++;
   hw=(window-1)/2;
   output[0]=massiv1[0];
 
   for (i=1;i<n;i++){
       tmp=0;
       if(i<hw){
           k1=0;
           k2=2*i;
           z=k2+1;
       }
       else if((i+hw)>(n-1)){
           k1=i-n+i+1;
           k2=n-1;
           z=k2-k1+1;
       }
       else{
           k1=i-hw;
           k2=i+hw;
           z=window;
       }
 
       for (j=k1;j<=k2;j++){
           tmp=tmp+massiv1[j];
       }
       output[i]=tmp/z;
   }
   //---end фильтр---//
     w = output[];
    return w;
}//end ReadPOT
После фильтра уже нет старшего и младшего байта,непонятно,как сделать обратное преобразование,поскольку по USB передача идет именно так.
Нужно ли вообще это преобразование?

А вот как передаются данные на мк, можно ли отправить весь отфильтрованный массив?
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
void ProcessIO(void)
{   
    // если еще не настроено или в режиме сна, то не делать ничего
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
    
    //Проверить, если мы получили исходящий пакет
    if(!HIDRxHandleBusy(USBOutHandle))              
    {   
        //Мы только что получили исходящий пакет. Проверим первый байт, чтобы понять что за команда
        switch(ReceivedDataBuffer[0])               
        {
            case 0x80:  //вкл/выкл светодиод
                    mLED_1_Toggle();
                break;
            case 0x81:  //проверить статус переключателя sw
                // проверяем, свободен ли буфер записи, перед тем, как записать туда
                if(!HIDTxHandleBusy(USBInHandle))
                {
                    ToSendDataBuffer[0] = 0x81;             //создаем сообщение с информацией о переключателе sw
                    if(sw3 == 1)                            
                    {
                        ToSendDataBuffer[1] = 0x01;         
                    }
                    else                                    
                    {
                        ToSendDataBuffer[1] = 0x00;
                    }
                    //готовим USB модуль для отправки данных хосту
                    USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
                }
                break;
 
            case 0x37:  //проверить напряжение на АЦП
                {
                    WORD_VAL w;
                    
                    // проверяем, свободен ли буфер записи, перед тем, как записать туда
                    if(!HIDTxHandleBusy(USBInHandle))
                    {
                        w = ReadPOT();                  //считываем напряжение. функция определена ниже.
                        ToSendDataBuffer[0] = 0x37;     //делаем сообщение - напряжение на АЦП
                        ToSendDataBuffer[1] = w.v[0];   //Передаем младший байт
                        ToSendDataBuffer[2] = w.v[1];   //старший байт
 
                        //готовим USB модуль для отправки данных хосту
                        USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
                    }                   
                }
                break;
        }
        //готовим выходную конечную точку, чтобы хост смог отправить нам еще пакет ифнормации
        USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&ReceivedDataBuffer, 64);
    }
 
    
}//end ProcessIO
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2014, 09:55
Ответы с готовыми решениями:

Оцифровка сигнала 0..100 мВ и передача на верхний уровень
Привет всем! Вот я и дожил до того момента, когда надо писать дипломную работу. 2 года я работал над привычной и понятной для меня...

Передача данных от АЦП по USART
Здравствуйте, есть задача: оцифровывать аналоговый сигнал на нескольких ножках МК (stm32f411) и полученный результат отправлять в ПК по...

Передача данных с АЦП по USART
Здравствуйте уважаемые форумчане подскажите пожалуйста я взял рабочий код по работе АЦП и DMA настроил USORT. DMA берет значения АЦП...

14
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
16.06.2014, 17:39
Цитата Сообщение от heked93 Посмотреть сообщение
На мк сформировать массив данных с АЦП, отфильтровать его и отправить на мк
Не понятно с мк на мк? С какого мк на какой мк? Каким способом надо передать с мк на мк?
0
 Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31
16.06.2014, 18:03  [ТС]
Извиняюсь,совсем забыл написать. С мк pic18f4550 на пк через USB
0
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
16.06.2014, 19:18
А у вас код что самый первый компилируется как удачно или ошибки выдаёт.
Что за замысел фильтрации АЦП.?
0
 Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31
16.06.2014, 22:00  [ТС]
Без фильтра и формирования массива все прекрасно работает. Это код из исходников microchip для hid устройств, смысл таков, я получаю с датчика напряжение, эти напряжения нужно отправить на ПК,чтобы увидеть результат,например, в виде графика,чтобы график был плавным необходимо отфильтровать массив напряжений, а более глубокий смысл таков: эмуляция контроллера для обработки сигнала с датчика давления. Поэтому хотелось бы разобраться с фильтрованием непосредственно на контроллере.
0
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
17.06.2014, 19:32
Я не пойму что именно фильтровать?
АЦП преобразованные данные сохраняет в 8-ми разрядные регистры данных ADRESL и ADRESH вот и передавайте их по USB, алгоритм построения графика организуете в исполняемой программе на ПК.

Если рассматривать данные АЦП то это значение от 0 до 1024 в зависимости от поданного напряжения на вход АЦП, что можно отфильтровать из значений от 0 до 1024?
1
 Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31
17.06.2014, 19:46  [ТС]
То есть сформировать массив с данными АЦП сложно? или данные операции лучше проводить на ПК? Насколько я сам понимаю, у меня получается массив из этих самых значений от 0 до 1024, во время изменения напряжения у меня получится массив с большим разбросом значений,график будет "ломанным", моя же задача "сгладить" этот график. Поэтому и надо применить фильтр.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
17.06.2014, 20:07
...лучше фильтрацию, а конкретней - сглаживание вынести на верхний уровень, перед построением графика, нечего нагружать лишний раз контроллер (пусть занимается выдачей реальных значений).

Сглаживание - экспоненциальное, например.
1
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
17.06.2014, 21:36
Цитата Сообщение от raxp Посмотреть сообщение
Сглаживание - экспоненциальное, например.
То такой способ наверное лучше выполнять на верхнем уровне. Сложный способ.
1
 Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31
17.06.2014, 21:42  [ТС]
Все равно хотелось бы разобраться с этой проблемой.Контроллер можно и нагрузить,главное понять как это сделать на МК. А на счет фильтра, хочу применить алгоритм скользящего среднего, так как он простой в реализации.
0
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
17.06.2014, 21:48
Я думаю что вам придётся задействовать таймер для использования "скользящего среднего" так как график рисуется во времени.
1
 Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31
18.06.2014, 08:37  [ТС]
А есть ли смысл рисовать график во времени? в проекте на VS 2010 c++ я могу построить график сразу,имея весь массив данных
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
18.06.2014, 19:03
...разве что вам понадобятся в дальнейшем знания временных меток значений, с другой стороны - никто не мешает массив данных иметь с временными метками при обработке данных и их записи.
1
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
18.06.2014, 19:09
heked93, а драйвер для вашего устройства вы уже написали?
1
 Аватар для heked93
6 / 6 / 0
Регистрация: 11.05.2013
Сообщений: 31
18.06.2014, 20:22  [ТС]
Устройство собрано и протестировано.Драйвер был готовый,из примера mirochip. Сделана программа для ПК,которая отображает напряжение на АЦП.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2014, 20:22
Помогаю со студенческими работами здесь

Передача данных по SPI, между АЦП и микроконтроллером
Добрый день. Понемногу разбираясь с микроконтроллерами, решил связать МК с АЦП посредством SPI. Но, как мне кажется, возникла проблема: ...

Передача данных (физический/канальный уровень)
Всем привет! Есть парочка вопросов, связанных с передачей данных=) 1)Идет передача данных. Может ли быть так, что драйвер...

Верхний уровень
Привет всем, может кто пожалуйста объяснить или дать ссылку, чтобы почитать, что за верхний уровень &quot;^&quot;? Используется в String^...

Переход области на верхний уровень слоя
Здравствуйте, хотел бы спросить: Короче мне шеф поручил создать во флеше карту области с разделением ее на районы, да так, чтобы при...

Библиотеки для работы с USB. Нижний и верхний уровень
LUFA - открытая библиотека для работы с USB в AVR под AVR-GCC, реализующая полный стек протоколов USB на микроконтроллерах ATmel с...


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

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

Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru