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

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


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

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

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

Где:

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

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

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


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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Stratix
      Здравствуйте, у меня проблема с прошивкой разных устройств из-за программаторов. Дело в том что у меня есть некоторое количество китайских и самодельных программаторов для разных производителей, с ними постоянно какие-то проблемы, некоторые отказываются нормально работать на windows 10(другие версии ПО не устраивают), другие не работают с последними версиями сред разработки и т.д. Так же нужно прошивать схемы памяти. Хочу прошивать устройства без постоянной сборки программаторов и неудобств. Думаю о двух вариантах: взять оригинальные программаторы для всех производителей: altera, xlinx, arm, pic, avr(некоторые найти сложно, например оригинальный usb-blaster и высокая стоимость в сумме), второй вариант: взять универсальный программатор, который бы поддерживал все новые микросхемы, а вот с этим проблема, большинство универсальных программаторов не шьют stm, плис. Есть ли вообще реально универсальные программаторы? Мне было бы намного удобнее если на столе б лежал один программатор, а не куча. Смотрел список микросхем chipprog-48, пока что самый большой, к сожалению не поддерживает новые fpga, например: cyclone IV. Связывался, сказали что поддержки не будет и в будущем. Стоит ли взять chipprog-48 в 2018 году или есть программаторы лучше, с большим списком микросхем?
    • Автор: Дмитрий Дмитрий
      Здравствуй, добрый Алл.
      Задумал сделать сенсорный выключатель (блокировщик) двери. Задача: при двойном прикосновении к поверхности пластикового выключателя подать на управляющий контакт +5В.
      Реализация:  Использовать контроллер емкостного сенсора AT42Q1010, микроконтроллер PIC10F200.
      Логика: при полном закрытии двери,  срабатывает геркон, подается +5В на схему. На схеме расположены емкостной контроллер AT42Q1010 и микроконтроллер PIC10F200. Емкостной контроллер при прикосновении пальца дает сигнал на цифровой выход. Этот выход соединен со входом PIC10F200. В PIC10F200 крутится программа, определяющая двойное прикосновение, с заданными промежутками времени (ориентируюсь на обычный двойной клик мыши). Как только определяет двойной клик - подает на три GPIO выхода +5В, и уходит в пустой цикл, до снятия питания.
      С одного GPIO питаются светодиоды: 2 шт, 1.8 В, 1 мА, удалены на 3 метра, подключены кабелем 3х2.5 мм2.
      Со второго GPIO активируется герконовое реле 5В, 10мА, размыкающее наружную клавишу открытия двери.
      С третьего GPIO питаются светодиоды: 2 шт, 1.8 В, 1 мА, удалены на 3 см. Они находятся в том же выключателе, где будет смонтирована схема.
      Для повторного запуска нужно открыть - закрыть дверь. Питание будет отключено-включено, программа запустится с нуля.
      Вопросы:
      1. Нормально ли цеплять светодиоды прямо к PIC контроллеру, на такую дистанцию? Потери посчитал, выходит в районе 1%. Думаю проблем быть не должно, но чувствую кощунственность решения.
      2. Нормально ли PIC контроллер отнесется к многократному хард ресету? Дверью пользуюсь 50 раз в день. Это каждый раз снятие питания, включение обратно.
      3. Какое время на загрузку ожидать от схемы? Т.е. через какое время после полного закрытия двери я смогу заблокировать дверь. Судя по документации на емкостной контроллер , оно меньше 100 мс. Микроконтроллер PIC около 30 мс (reset time). Я нигде не ошибся?  
      4. Нужно ли вставлять резистор между герконовым реле блокировки двери и микроконтроллером? Расстояние от микроконтроллера до реле около 2 метров. Насколько я понимаю, желательно использовать токоограничительный резистор около 1 кОм, но методика точного расчета номинала мне не известна.
      5. Нужно ли вставлять резистор между дальними свтодиодами и контроллером? Ближним и контроллером? Для понижения напряжения я планирую в обоих случаях использовать резисторы 1.5кОм и последовательно подключать два диода 1.8 В,  1 ма. Этого достаточно? Диоды и резистор располагаются на крышке выключателя.
      6. Для подбора конденсатора нужной емкости для сенсора прикосновения хочу использовать макетную плату (такая пластиковая, с много рядов отверстий), и кучку кондеров из чип и дипа, около рекомендованной емкости.  К ним припаять проводки и по очереди проверять, каждый раз скидывая питания. Это верная методика или есть способ лучше?
      7. Имел ли кто дело с таким емкостным контроллером? Насколько plug and play решение? На внутреннюю часть выключателя планирую наклеить медную фольгу, номиналы конденсаторов и резистора подобрать на столе. Потом все собрать на печатной плате, смонтировать в корпус выключателя. Не уплывет ли со временем точность такого сенсора? Может быть на плате предусмотреть какие-то элементы для подстройки в будущем?
      8. Я выбрал самый младший из PIC  контроллеров. Могу ли я столкнуться с нехваткой памяти в своей задаче? Портов хватает. Может быть я не учел какой-то еще ресурс, которого не хватит для выполнения этой задачи?
      Даташит на емкостной контроллер  https://ru.mouser.com/datasheet/2/268/40001946A-1145216.pdf
      Даташит на PIC  контроллер http://ww1.microchip.com/downloads/en/DeviceDoc/40001239F.pdf
      С уважением,
      Дмитрий.
    • Автор: eestyk
      Имеется микроконтроллер dsPIC30F5011. Хочу реализовать на нём ШИМ через Output Compare Module, так как у этого модуля есть как раз режим PWM. Всё проинициализировал, задал период и коэффициент заполнения ШИМ (duty cycle - 50%), выбрал Timer2. На соответствующей ноге тыкаюсь осциллографом, ничего нет. Не могу понять в чём проблема. Вроде по даташиту настроил правильно.
      #define PERIOD_PWM 12484 #define PERIOD_PWM_div2 6242 WriteTimer2 (0); OpenTimer2 (T2_ON & T2_GATE_OFF & T2_IDLE_STOP & T2_PS_1_8 & T2_32BIT_MODE_OFF & T2_SOURCE_INT, PERIOD_PWM); ConfigIntTimer2 (T2_INT_PRIOR_5 & T2_INT_ON); OpenOC3(OC_IDLE_STOP & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_ENABLE, PERIOD_PWM, PERIOD_PWM_div2); ConfigIntOC3(OC_INT_PRIOR_0 & OC_INT_ON); void __attribute__((interrupt, auto_psv)) _T2Interrupt(void) { IFS0bits.T2IF = 0; // Clear Timer interrupt flag Nop(); } void __attribute__((interrupt, auto_psv)) _OC3Interrupt(void) { IFS1bits.OC3IF = 0; // Clear interrupt flag }  
      dsPic30F5011-5013.pdf
    • Автор: Евгений Бабок
      Господа, здравствуйте. Не ругайтесь, пожалуйста, я студент и я учусь. Возможно, вопрос будет глуповат. Подскажите, пожалуйста, чем можно заменить PIC32MX775F256H для САПР Proteus. Или намеки как подобрать анлог. Имеется код и принципиальная схема некого проекта на данном микроконтроллере(в Proteus нету 32х битных PIC). Я хочу создать его в Proteus,разобрать его и с ним поработать, но необходим другой микроконтроллер(скорее всего 16битный PIC) т.к. данного в протеусе нету. 
      Повторюсь, что я учусь,а учиться лучше на примерах, а не изобретать колесо. Спасибо. 
    • Автор: Andreydobrui
      Всем привет! Очень нужен толковый человек по PIC контроллерам в Москве. Нужно ответить на все наши вопросы . Например к какой программе подключается, как слить прошивку, короче вопросов куча. За отдельную плату разумеется.