Jump to content
HEkeD

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

Recommended Posts

Здравствуйте. Имею следующую задачу. На мк 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

Edited by HEkeD

Share this post


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

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

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

Где:

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Илья Говжеев
      Поделитесь опытом , кто уже пробывал из arduino сделать программатор pic? 

    • By Терентенко Андрей
      Добрый день! Имею следующую ситуацию : на базе  PIC16f676  создал приблуду для "управления нештатной магнитолой с руля", а именно  сигнал с руля это 4,8в и в зависимости от нажатой кнопки падает дискретной до 0.8в мк с помощью АЦП отслеживает  на магнитолу паралельно кнопкам кинул оптрони которыми управляет МК. Питание от LM с фильтрующими конденсаторами. При тестових прогонах всё работало как надо (программно реализовано защиту от дребезга аж на 0.1 сек в поисках решений) и в машине  и от штатного БП . Но заметил закономерность сейчас на улице - 2 и при первом запуске минут 5, МК "шумит" несоотвецтвует нажатия на руле кнопке  на магнитоле ! Сигнал с руля смотрел стабильный без дребезга , притом когда тестил вынес магнитолу подключил всё работало гуд но пока устанавливал закручивал она остыла и начинались эти тацы . Кто что подскажет? МК или ЛМ могут так реагировать на температуру ? Прошу прощения у модераторов за повторение теми (может в этом разделе будет актуальней)
    • By Splav
      Речь пойдет о таймере цикличного включения вентиляции гаража.
      Стояла задача обеспечить принудительную вентиляцию гаража.
      Оставлять включенным вентилятор круглые сутки - неоправданно.
      Включать его периодически вручную... Неудобно и лишено смысла.
      Поэтому было решено включать его на определенное время через разные интервалы времени, в зависимости от субъективного восприятия наличия сырости в гараже.
      Вменяемых вариантов в продаже я не нашел.
      Можно, конечно, приобрести на Али программируемый суточный таймер или что-то подобное...
      Да, можно, но мне кажется, что собрать из подручных деталей тоже можно, ну и мозги потренировать.
      За основу был выбран PIC12F675, потому что он у меня был.
      По уму здесь должен стоять PIC12F629, он дешевле, в нем нет АЦП, который в конструкции не используется и отключен.
      Итак.
      Время работы выбрано фиксированным и неизменным - 1 час.
      Время простоя - в зависимости от режима.
      1 час - 2 часа - 3 часа.
      (Изначально я планировал другие задержки: 2-3-5 часов. На практике в моих гаражных условиях эти интервалы оказались слишком большими)
      Индикация осуществляется всего 1 светодиодом.
      Переключение режимов и управление - всего 1 кнопкой.
      Схема:

      Коротко о работе:
      Кнопка.
      Опрос кнопки 10 раз в секунду. Антидребезг и подавление помех 0,3с - 3 опроса подряд кнопка нажата.
      Короткое нажатие на кнопку(от 0,3 до 2 с) - переключение режимов по кругу. 1 - 2 - 3 - OFF - 1 - 2 -  ....
      Длинное нажатие на кнопку (дольше 2 с) - смена состояния реле.
      Если оно было включено - выключается.
      Если было выключено - включается. Интервалы работы реле при этом соответствуют режиму.
      В режиме OFF длинное нажатие ничего не меняет.
      Переключение режима или смена состояния реле происходят при отпускании кнопки.
      Светодиод.
      Индикация режимов светодиодом:
      1 - 1 раз в 2 секунды загорается, если реле не включено. Проблеск света.
            1 раз в 2 секунды гаснет, если реле включено. Проблеск тени.
      2 - 1 раз в секунду загорается, если реле не включено.
            1 раз в секунду гаснет, если реле включено.
      3 - 2 раза в секунду загорается, если реле не включено.
            2 раза в секунду гаснет, если реле включено.
      OFF - загорается раз в 5 секунд. Контроль того, что МК не завис.
      Режимы работы.
      Время работы циклического таймера по режимам:
      1 - 1 час работы / 3 часов отдых. 6/24
      2 - 1 час работы / 2 часа отдых.  8/24
      3 - 1 час работы / 1 часа отдых.  12/24
      Работа.
      При отключении питания, пока не разрядились конденсаторы фильтра, МК отключает все выходы, сохраняет текущие данные в память, ждет 15 сек в таком состоянии и возобновляет работу, если отключение было кратковременным и емкостей фильтра питания хватило.
      Если отключение питания было длительным то, при возобновлении питания, загружает сохраненные данные из памяти и продолжает работу.
      При первом включении, после программирования МК, устройство работает в 1-ом режиме.
      Программа писалась в MPLab X IDE v4.05.
      Прошивка:fan_cycle_timer.hex

      Плата для устройства не разрабатывалась. Все было собрано на макетке.
      В блоке питания использован стандартный трансформатор для монтажа на плату ТПК 2х9V с 2-мя вторичными обмотками на 9В.
      Использовал только одну из них. Вторая - не подключена, в "воздухе"
      Реле - HLS-14F1D-DC12V-C. С обмотка на 12В, и одной группой переключающих контактов на 10А/240VAC.
      Устройство собрано в корпусе щитка для автоматов на 8 модулей. Производитель VIKO.
      Закреплена плата на щиток через резьбовые дистанционные втулки с резьбой М3.
      В качестве вентилятора - вытяжной вентилятор диаметром 125мм ВЕНТС 125С
      Устройство на данный момент отработало в гараже все лето, температура воздуха в тени доходила до 32 градусов.
      Перегревов элементов и зависаний контроллера пока не было.
       
      Несколько фото для общего представления о конструкции.

    • By Rusteka
      Продам микросхемы. Все микросхемы новые, в наличие.
      1. PIC18LF4550-I/P Microchip 65шт
      2. ATtiny85-20PU [DIP-8] Atmel 200шт
      3. PIC18LF452-I/L Microchip 50шт
      4. A29L040L-70F Amic 50шт
       
       

       



       
    • By yarosh
      Не могу никаким софтом поменять текст в бегущей строке.  Год выпуска 2011,  сделана на pic,  есть ps\2 порт под клаву, с нее залить новый текст не вышло, разные варианты пробовал но так и не смог.
      Есть ком порт, по нему с компом связь есть, но ничем сменить текст или очистить немогу, в программе терминал после коннекта если нажать send и отправить что нибудь на строку происходит секундное моргание и текст остается прежний. 
      В проге Stroka 2.9 отправка ничего не меняет,  только моргает секунду.
      фото внутрянки прилогаю.





  • Сообщения

    • Вот рабочая ссылка на книгу Современные цифровые мультиметры Садченков Д.А. http://padabum.com/d.php?id=15203 Аналогичная ситуация. Только у меня вдобавок к заниженным показаниям напряжения  и тока ещё и сопротивление завышает. Пока причину не нашёл - будем искать.
    • Сгорел мой незаменимый помощник M830BZ - лет 15 наверное служил верой и правдой! На плате стоят полосатые резисторы и ещё дисплей на защёлках. Хотел скачать схему по Вашей ссылки, но не тут то было. Прошу помощи, сделайте доброе дело! Если есть у кого схемка на моего зверька, просьба выложить тут на форуме. Может ещё кому сгодиться.  За ранее благодарю отзывчивых и добрых людей! Возле предохранителя это контакты для перемычки J5. Но к сожалению у меня почти вся плата пустая и номиналы R32 и Q3 подсказать не могу. Может у Borodach есть мультиметр такой ревизии? Эта ссылка тоже не открывается. Хелпыы!!!
    • И я о том-же. А в конструкции по ссылке в первом посте, полюса получились одноименные.
    • путем чтения и анализа исходного кода. Ваш кэп
    • от номинала резистора зависит ток зарядки затвора и скорость открывания транзистора. И далеко не всегда оптимальный режим самый скоростной. От этого времени зависит уровень шумов на выходе ИБП и время стабилизации переходных процессов на паразитных емкостях/индуктивностях. Так что тут надо не просто - какой ставить, а отнестись посерьезнее
    • А что ты умеешь, каковы знания, опыт? Что-то раньше собирал и с каким результатом? Кто дал задание и какая тематика предмета (кружка)?
    • А проиграть этот файл (мелодии) в выборе мелодии звонка пробовали? Файл есть, играет?
  • Покупай!

×
×
  • Create New...