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

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


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;
window = 5;
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

Без фильтра и формирования массива все прекрасно работает. Это код из исходников microchip для hid устройств, смысл таков, я получаю с датчика напряжение, эти напряжения нужно отправить на ПК,чтобы увидеть результат,например, в виде графика,чтобы график был плавным необходимо отфильтровать массив напряжений, а более глубокий смысл таков: эмуляция контроллера для обработки сигнала с датчика давления. Поэтому хотелось бы разобраться с фильтрованием непосредственно на контроллере.

main.rar

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

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

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

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

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

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

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

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

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

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

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

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