Перейти к содержанию

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


HEkeD

Рекомендуемые сообщения

Здравствуйте. Имею следующую задачу. На мк 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
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

Где:

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

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

На мк 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'а (увеличение разрядности за счет нескольких измерений) привести могу. Понять бы, что требуется.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...