Jump to content

    

Olegus

Участник
  • Content Count

    43
  • 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. Не могу понять почему не рисует. Вроде как в хелпе пишу, по одному без проблем. Два без указания свойств тоже рисует. 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.
  2. Даже если так, то с передачей у меня как раз-то нет проблем (хотя на данном этапе я об этом думал что мои числа могут совпасть с значениями конца и начала- я просто выбрал для передачи числа заведомо не совпадающие). Эту проблему надо будет решать и наверно как вы правильно указали. Почему у меня прием на Arduino идет через раз? Если один раз проходит, а числа я не меняю (одни и тоже значение передаю) то совпадений для маркера начала пакета нет и Arduino принимает адекватно, но почему не постоянно.
  3. Привет. Возникла необходимость взаимного обмена данными 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; }
  4. Пересобрал проект все пошло. Что было так и не понял глюк какой-то.
  5. В True Studio написал простую функцию, подключил ее к main, все компилируется, пошагово ее выполняю в функцию заходит считает там правильно, но как только дохожу до конца функции и надо возращать полученное значение и выходить, все виснет. Что-то похожее у меня было с выводом в порт чисел с плавточкой но оказалась у меня были подключены обрезанные библиотеки (Проект генерю CubeMx). Раньше делал тоже самое все работало, а сейчас не пойму в чем дело. Может кто подскажет?
  6. Использую 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Гц. Почему так? Вроде один и тот же чип, с акселем работает, а с магнитометром нет.
  7. Может кто-нибудь сталкивался с AN3192 Application note ("Using LSM303DLH for a tilt compensated electronic compass"). Там описан процесс калибровки акселерометра и магнитометра. С акселерометром разобрался и проделал все работает, а с магнитометром не могу вдуплится. Не могу понять как получен вектор X (стр.28-29, выражения 27-28). Вдруг кто-то сталкивался.
  8. fixed-point это тип с фиксированным положением точки, т.е. не целый, а у меня предлагает матлаб типы (u)int16(32)_t и т.д. есть single and double? А если мне нужно фильтровать float? Еще вопросик: у меня в программе в которой я программирую свой stm32 нет типа single наверное она будет ругаться на этот тип, даже если я попробую осуществить приведение типов? Прошу прощения если задаю глупые вопросы.
  9. Я использую double потому что Matlab Coder не предлагает float, a только double или single и не для всех типов генериться код. Это вопрос точности, затрат ресурсов, а у меня дикое расхождение хотя фильтр живой!? можно привести в уже сгенеированном коде переменные к типу float, но не думаю, что это что-то даст, хотя может я неправ. Я фильтр скользящего окна так делал из Matlab Coder вроде все работала с double. Мне кажется тут у меня какая-то очевидная ошибка я просто не вижу ее.
  10. Исследую далее возможности 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
  11. Именно так, спасибо. Все получилось. Единственное из вектора сигнала с датчика (у меня размерность 100) первые 4 значения скачок а затем все ровно. Это связано с размерностью окна и начальными условиями наверное? От этого не избавится?
  12. Так и почему сгенерированная функция пустая. Проверил ее в Simulink все работает.
  13. И вроде на сайте Matlab https://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation-alphabetical-list.html написано, что данная функция поддерживает генерацию С/С++.
  14. Вот все сгенерировал Matlab Coder. Example особо не помог. Filter_moving_average.rar