Jump to content

    

Olegus

Участник
  • Content Count

    44
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Olegus

  • Rank
    Участник

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Передаю и принимаю пакеты через COM порт. Прием и передачу по Rx и Tx осуществляю последовательно. Вопрос нельзя ли это делать параллельно для увеличения скорости передачи по каждой линии. Пакеты по 63 байта, если только передаю то вроде скорость получается около 100 Гц, но если еще принимать, то скорость падает. Использую стандартные fwrite(port, data) и fread(port, data) последовательно, но как бы их вызывать параллельно чтобы скорость 100 Гц сохранить. Спасибо.
  2. Не могу понять почему не рисует. Вроде как в хелпе пишу, по одному без проблем. Два без указания свойств тоже рисует. y1 = sin(x); y2 = cos(x); plot(x,y1,'LineWidth',2, 'Color','red', x,y2); Error using plot Data must be a single matrix Y or a list of pairs X,Y.
  3. Даже если так, то с передачей у меня как раз-то нет проблем (хотя на данном этапе я об этом думал что мои числа могут совпасть с значениями конца и начала- я просто выбрал для передачи числа заведомо не совпадающие). Эту проблему надо будет решать и наверно как вы правильно указали. Почему у меня прием на Arduino идет через раз? Если один раз проходит, а числа я не меняю (одни и тоже значение передаю) то совпадений для маркера начала пакета нет и Arduino принимает адекватно, но почему не постоянно.
  4. Привет. Возникла необходимость взаимного обмена данными float между Matlab и Arduino. Взял пример https://github.com/leomariga/Simulink-Arduino-Serial. Но возникает проблема неустойчивого приема данных на Arduino. Могу два раза запустить число из Matlab в Arduino и затем опять в Matlab для отображения на графике все будет ок, а на третий раз бред полный потом несколько запусков все хорошо, потом опять бред или пару секунд норм, а потом все скачет прыгает, т.е. начинается раздрай. Передача с Arduino на Matlab идет устойчиво (передаются float без сбоя) значит проблема именно в передаче из Matlab в Arduino . Использую Header для проверки начала пакета. Может кто что подскажет. //In Arduino IDE Float(4 byte) and In Matlab Single(4 byte) --> We can exchange these varibales between Matlab and Arduino // Create a union to easily convert float to byte typedef union{ float number; // for this variable allocated 4byte uint8_t bytes[4]; // for this variable allocated 4*1byte(8 bit) = 4 byte } FLOATUNION_t; uint8_t test = 'A'; // for check transmitting packet uint8_t header = 0; // initial conditions // Create the variables you want to receive FLOATUNION_t myValue1; FLOATUNION_t myValue2; FLOATUNION_t myValue3; FLOATUNION_t myValue4; FLOATUNION_t myValue5; FLOATUNION_t myValue6; // Create the variables to send FLOATUNION_t send1; FLOATUNION_t send2; FLOATUNION_t send3; void setup() { // initialize serial, use the same boudrate in the Simulink Config block Serial.begin(38400); } void loop(){ // Get the floats from serial if (Serial.available()>1) { header = Serial.read(); if (header == test)// { myValue1.number = getFloat(); // Give your float a value myValue2.number = getFloat(); // Give your float a value myValue3.number = getFloat(); // Give your float a value myValue4.number = getFloat(); // Give your float a value myValue5.number = getFloat(); // Give your float a value myValue6.number = getFloat(); // Give your float a value } } // do something with numerals from serial send1.number =myValue1.number+myValue2.number; // new variables 2.4;// send2.number = myValue3.number+myValue4.number; // 3.6;// send3.number = myValue5.number+myValue6.number; //4.7;// // Print header: Important to avoid sync errors! Serial.write('A'); // Print float data for (int i=0; i<4; i++){ Serial.write(send1.bytes[i]); } for (int i=0; i<4; i++){ Serial.write(send2.bytes[i]); } for (int i=0; i<4; i++){ Serial.write(send3.bytes[i]); } // Print terminator Serial.print('\n'); //Serial.flush(); // Use the same delay in the Serial Receive block delay(50); } float getFloat(){ int cont = 0; FLOATUNION_t f; while (cont < 4 ){ f.bytes[cont] = Serial.read() ; cont = cont +1; } return f.number; }
  5. Пересобрал проект все пошло. Что было так и не понял глюк какой-то.
  6. В True Studio написал простую функцию, подключил ее к main, все компилируется, пошагово ее выполняю в функцию заходит считает там правильно, но как только дохожу до конца функции и надо возращать полученное значение и выходить, все виснет. Что-то похожее у меня было с выводом в порт чисел с плавточкой но оказалась у меня были подключены обрезанные библиотеки (Проект генерю CubeMx). Раньше делал тоже самое все работало, а сейчас не пойму в чем дело. Может кто подскажет?
  7. Использую LSM303DLHC. Задал скорость считывания данных для акселерометра 50 Гц, а для магнитометра 30Гц. Для акселерометра проверяю в регистре STATUS_REG_A (с.28 LSM303DLHC datasheet)состояние 3-го бита и в момент =1 считываю данные из выходных регистров, и у меня этот флаг поднимается с частотой 50 Гц. int8_t n_bit_status_ready_Acc = 3; status_ready_Acc = Accel_IO_Read(0x32,LSM303DLHC_STATUS_REG_A); if ( ((1 << n_bit_status_ready_Acc) & status_ready_Acc) == (1 << n_bit_status_ready_Acc) ) { ptr = Accel_ReadAcc(); Ax_3 = ptr[0]; Ay_3 = ptr[1]; Az_3 = ptr[2]; Ax_sum3 = Ax_sum3 + Ax_3; Ay_sum3 = Ay_sum3 + Ay_3; Az_sum3 = Az_sum3 + Az_3; Ncal_current = Ncal_current + 1; free(ptr); } т.е. переменная Ncal_current за 1 секунду достигает значение 50. То же самое делаю для магнитометра. Регистр статуса SR_REG_M (09h) (с.39 LSM303DLHC datasheet). Вижу по графику данных с магнитометра, что частота меняяется (если меняю частоту выдачи данных), т.е. магнитометр программируется адекватно, но также как с акселерометром проверяю нулевой бит Регистр статуса SR_REG_M (09h) а там почти все время 1. И получается скорость сотни Гц вместо моих 30Гц. Почему так? Вроде один и тот же чип, с акселем работает, а с магнитометром нет.
  8. Может кто-нибудь сталкивался с AN3192 Application note ("Using LSM303DLH for a tilt compensated electronic compass"). Там описан процесс калибровки акселерометра и магнитометра. С акселерометром разобрался и проделал все работает, а с магнитометром не могу вдуплится. Не могу понять как получен вектор X (стр.28-29, выражения 27-28). Вдруг кто-то сталкивался.
  9. fixed-point это тип с фиксированным положением точки, т.е. не целый, а у меня предлагает матлаб типы (u)int16(32)_t и т.д. есть single and double? А если мне нужно фильтровать float? Еще вопросик: у меня в программе в которой я программирую свой stm32 нет типа single наверное она будет ругаться на этот тип, даже если я попробую осуществить приведение типов? Прошу прощения если задаю глупые вопросы.
  10. Я использую double потому что Matlab Coder не предлагает float, a только double или single и не для всех типов генериться код. Это вопрос точности, затрат ресурсов, а у меня дикое расхождение хотя фильтр живой!? можно привести в уже сгенеированном коде переменные к типу float, но не думаю, что это что-то даст, хотя может я неправ. Я фильтр скользящего окна так делал из Matlab Coder вроде все работала с double. Мне кажется тут у меня какая-то очевидная ошибка я просто не вижу ее.
  11. Исследую далее возможности Matlab по генерации кода на Си. С помощью Filter Design создал ФНЧ, затем генернул m-функцию этого фильтра, промоделировал в Simulink, все работает, затем с помощью Matlab Coder сгенерировал Си код, запрограммировал контроллер stm32F303. Подаю для теста единицу на фильтр, а он дает значение в два раза большее, не могу понять почему!!! (в Simulink на ту же единицу на выходе "1" в установ. режиме). Подаю на этот фильтр сигнала с акселерометра фильтр динамику повторяет с учетом своей полосы т.е. вроде живет, но эта большая постоянная ошибка, в разы!? Код такой: Сначала инициализация фильтра (без вызова этой функции не работает) Low_pass_for_accel_initialize(); затем в бесконечном цикле кручу функцию: double Ax_calib_out_LPF = Low_pass_for_accel((double)1); Matlab Coder создает в папке сгенерированного Си-кода пример использования этой функции (чтобы понять как ей пользоваться). Вот он. Может я что-то делаю не так? main.c
  12. Именно так, спасибо. Все получилось. Единственное из вектора сигнала с датчика (у меня размерность 100) первые 4 значения скачок а затем все ровно. Это связано с размерностью окна и начальными условиями наверное? От этого не избавится?
  13. Так и почему сгенерированная функция пустая. Проверил ее в Simulink все работает.
  14. И вроде на сайте Matlab https://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation-alphabetical-list.html написано, что данная функция поддерживает генерацию С/С++.