HEkeD

Обработка Массива

3 сообщения в этой теме

HEkeD    0

Здравствуйте. Имею следующую задачу. На мк pic18f4550 сформировать массив данных с АЦП, отфильтровать его и отправить на мк. Но мне немножко непонятен сам процесс. Ниже привел фрагмент кода(также он полностью прикреплен в архиве)

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 передача идет именно так.

Нужно ли вообще это преобразование?

И как передаются данные на мк, можно ли отправить весь отфильтрованный массив?

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

main.rar

Изменено пользователем HEkeD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Alex    545
После фильтра уже нет старшего и младшего байта
Нет старшего и младшего байта чего ? И куда они делись (судя по слову "уже") ?
Нужно ли вообще это преобразование?
Ну это вопрос не к нам, а, скорее всего, к себе. Нужно оно Вам или нет.
И как передаются данные на мк, можно ли отправить весь отфильтрованный массив?
А почему бы и нет ? Какая разница, 2 байта отправить или 100 ?

Вот отправка:

USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);

Где:

ToSendDataBuffer - указатель на передаваемый буфер.

64 - максимальное кол-во передаваемых байтов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
COKPOWEHEU    255

Эх, возможно лезу в тему, в которой не смыслю.

На мк pic18f4550 сформировать массив данных с АЦП, отфильтровать его и отправить на мк.
Так его надо снимать встроенным АЦП или передавать куда-то наружу? Что понимается под фильтрацией? Просто линейное сглаживание нескольких отсчетов или что-то более сложное?

фрагмент кода(также он полностью прикреплен в архиве)

WORD_VAL ReadPOT(void)

"for (i = 1; i <= 1000; i++)massiv1= (w.v[1] << 8) + w.v[0];" заполнение всего массива одним и тем же значением. С какой целью?

"for (i=1;i<n;i++){" Не увидел, где переменной n присваивается значение. Без этого будет цикл до какого-то произвольного числа. Аналогично переменная window.

Прокомментированы абсолютно неинтересные участки кода (вроде цикла), зато шаманство с переменными оставлено без внимания.

Что планировалось сделать с USB также непонятно. Какое-то обратное преобразование, какая-то фильтрация. Судя по коду - все-таки линейное усреднение по нескольким точкам. Вот только в начале процедуры все точки инициализируются одним и тем же значением, так что усреднения на самом деле никакого не будет.

Пример усреднения по нескольким токам, линейной фильтрации (не помню как точно называется, формула f(i) = f(i-1)*(1-k)+x(i)*k, где x - измеряемая величина, f - результат усреднения) и oversampling'а (увеличение разрядности за счет нескольких измерений) привести могу. Понять бы, что требуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Andreydobrui
      Всем привет! Очень нужен толковый человек по PIC контроллерам в Москве. Нужно ответить на все наши вопросы . Например к какой программе подключается, как слить прошивку, короче вопросов куча. За отдельную плату разумеется. 
    • Автор: Tulen
      Здарова, железячники. 
      Собираю клавиатуру из 12-ти кнопок, которую подключаю к пичку (PIC18F25K80). Но про клавиатуру не важно, там все разобрано и код сделал уже. Проблема в том, что сейчас нет времени самому писать библиотеку для работы с LCD дисплеем (через недельку-две я сяду и разберусь), поэтому я ищу готовые библиотеки. Дисплей - LM016L, контроллер - HD44780. 
      Нашел одну библиотеку, добавил в код. Компилятор ругается на выводы строчек и не хочет выводить переменные. 
      Прилагаю код:
      IDE - MPLAB X v4.05
      Компилятор - XC8 бесплатный.
      Варнинги от компилятора + строчки:
          PORTC = (data & 0x0F)*16; // newmain.c:46: warning: (373) implicit signed to unsigned conversion     PORTC = (data >> 4)*16; // newmain.c:54: warning: (373) implicit signed to unsigned conversion     PORTC = (data & 0xF)*16; // newmain.c:57: warning: (373) implicit signed to unsigned conversion     WriteByte(addLUT[row] + col); // newmain.c:65: warning: (373) implicit signed to unsigned conversion     SetLCDPosition(LCD_Line+1,0);  // newmain.c:87: warning: (373) implicit signed to unsigned conversion     WriteByte(i); // newmain.c:116: warning: (373) implicit signed to unsigned conversion     ShowStr(b); // newmain.c:160: warning: (357) illegal conversion of integer to pointer     ShowStr("BAD"); // newmain.c:172: warning: (359) illegal conversion between pointer types  
    • Автор: Serega4789
      Привет всем! пишу программу для pic16f84a кривошипный пресс, получилось запустить один режим (одноходовый) без блокировок и защит , для реализации двурукого включения нужно, чтобы нажимались 2 кнопки , при этом нужно чтобы программа следила за интервалом времени между нажатием 2х кнопок , при одновременном нажатии программа запоминает это событие и через 3-5 циклов сбрасывает ошибку и блокирует схему до сброса , при интервале 0,5 сек между нажатием кнопок программа выполниться без ошибок , при превышении интервала в 0,5с придется заново нажать на кнопки !
      Не хватает знаний команд и опыта для построения кода

    • Автор: Qwer11
      Здравствуйте.
      У меня есть микроконтроллер pic18f4550,
      я научился мигать светодиодом в flowcode и хотел бы сделать гирлянду,
      и небольшую вывеску из светодиодов.
      Как я понимаю на ножку микроконтроллера смогу не много поставить светодиодов т.к. там ограничение по току будет.
      поэтому исходя из схемы что я нашёл, используют транзистор для включения линии из светодиодов,
      какой транзистор по хар-кам подойдёт для включения 20 светодиодов в линии, (20мАх20=400мА)

      и как например я смогу включать светодиоды поочерёдно в одной линии,
      я читал что есть74HCT595, для экономии ножек например, при подключении индикатора светового,
      как я понимаю, для включения 20 светодиодов поочерёдно нужно или 20 портов использовать и 20 проводов,
      или перед каждым светодиодом поставить микросхемку какую нибудь, которая будет давать сигнал на включение.
      Спасибо.
    • Автор: Serge77
      Обязанности:
      · Разработка радиоэлектронных и GSM-устройств: разработка схем, программирование, разводка печатных плат, разработка документации.
      · Программирование микроконтроллеров STM, AVR, ARM, PIC на языке С/С++
       
      в личку или en@argument74.com