Здравствуйте. Имею следующую задачу. На мк pic18f4550 сформировать массив данных с АЦП, отфильтровать его и отправить на мк. Но мне немножко непонятен сам процесс. Ниже привел фрагмент кода.
После фильтра уже нет старшего и младшего байта,непонятно,как сделать обратное преобразование,поскольку по USB передача идет именно так.
Нужно ли вообще это преобразование?
Как передаются данные на мк, можно ли отправить весь отфильтрованный массив?
Без фильтра и формирования массива все прекрасно работает. Это код из исходников microchip для hid устройств, смысл таков, я получаю с датчика напряжение, эти напряжения нужно отправить на ПК,чтобы увидеть результат,например, в виде графика,чтобы график был плавным необходимо отфильтровать массив напряжений, а более глубокий смысл таков: эмуляция контроллера для обработки сигнала с датчика давления. Поэтому хотелось бы разобраться с фильтрованием непосредственно на контроллере.
Раздел: Начинающим
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 устройств, смысл таков, я получаю с датчика напряжение, эти напряжения нужно отправить на ПК,чтобы увидеть результат,например, в виде графика,чтобы график был плавным необходимо отфильтровать массив напряжений, а более глубокий смысл таков: эмуляция контроллера для обработки сигнала с датчика давления. Поэтому хотелось бы разобраться с фильтрованием непосредственно на контроллере.
Прикрепленные файлы:
Раздел: Начинающим