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

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

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

Где:

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

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

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


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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: 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 градусов.
      Перегревов элементов и зависаний контроллера пока не было.
       
      Несколько фото для общего представления о конструкции.

    • Автор: 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шт
       
       

       



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





    • Автор: 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
      С уважением,
      Дмитрий.
  • Сообщения

    • у нулевой серии и RTC лучше сделан и I2C даже с внутренними подтяжечками. Сказывается всетки что они посвежее. Жаль только ядро М0, но это уже всяко лучше любой 8-битки. И их стоит применять вместо СТМ8 или тини не только по причине того что "типа хватит и такого", а просто потому что средства разработки и отладки унифицированные. А под 8-ку надо свое пальто навешивать. Оно нужен этот венегрет? Как я радовался, когда узнал, что для работы со всем семейством 32-ых мне нужен один и тот же набор софта и железа! Ну наконец то они додумались )
    • Коротить R5 нельзя. Видите два одинаковых плеча R6-C3, R5-C6? Думаете они для красоты? Китайский капсуль не подходит, для этой схемы надо ставить именно панасоник WM-61A или WM-60. Сравните параметры панаса и китайца- они разные как небо и земля. Плата должна быть в экранированном тубусе а капсуль в трубке. Видели как сделаны измерительные микрофоны? Вот так и надо делать. 
    • Я не только читал но и до сих пор читаю. И давно распедалил орто на атомы... вывел свою систему расчёта ТРОСОРТО, можно сказать, что на орто я собаку съел и пудом соли закусил.  Визатоновский Топаз как был ЧВР с переменным сечением так и остаётся. А вот расположение нч излучателя (головки) влияет на гармошки. Могу показать эскизы ЧВОРТО. Практически всё тоже самое что у Топаза, только выхлоп-головка ортогональны. В любом волноводе волна плоская. На выходе она ещё плоская и разворачивается в сферическую лишь на расстоянии радиуса полуволны резонанса т.е в дальнем поле. Допустим Fb35 тогда радиус сферы будет 4.95м, практически в зоне прослушки. Четвертьволновый радиус будет на расстоянии 2.47м, что опять под ближнее поле никак не попадает. А то, что выдаёт мидбасовая головка вне полосы пропускания ЧВР вообще никак не интерферирует с плоской волной выхлопа т.к ортогональные волны не интерферируют. Смотрим рисунок одного патента и соображаем, есть тут ортогональность? Можно глянуть любой "тапок" -таппед хорн, это тоже самое что в этом патенте только хорн иной конфигурации. Смотрим два варианта ВЧР, один из которых орто. Смотрим ратент Суправокс. Французы его называют "RJ наизнанку". Есть тут ортогональность? А это эскиз ЧВОРТО на 4а32, которую собрал человечек из Новосиба и доволен ими как никогда.
    • Умные и адекватны люди все делают из соображений разумной достаточности, потому-что хорошо понимают, что минимизировать, улучшать, стремится к идеалу можно столько угодно долго, но какие-то неидеальности все равно останутся - мир не идеален. По этой же причине, те же умные и адекватные люди, придумывают нормы и ГОСТы, где четко прописано что такое хорошо, что такое удовлетворительно, а что такое плохо. У вас же какое-то свое личное представление о том, что хорошо и что плохо - как тараканы в голове нашептали так и сделаю + бесконечное стремление к улучшениям.  Два с половиной квардата хорошо, а четыре еще лучше, но восемь же еще лучше, шестнадцать вообще почти идеально, шестьдесят три квадрата вообще вообще хорошо.... ну и так далее, пока дело не дойдет до клиники:

    • Не думаю, что кто-то будет даже три метра на стоваттные АС кидать 0,75. А тем более на двухОмный саб с пиковыми токами под 20 Ампер. Но, конечно, это мое мнение. Никто не делает проводку из соображений минимальной разумной достаточности. Все стремятся минимизировать потери, даже пусть они и небольшие. Потому спор считаю высосанным из пальца ( в очередной раз) а провода на картинке- тонкими. МОЕ МНЕНИЕ, имею право.   А вы продолжайте скакать и бить балалайки об стены, дадуда. (с)