Jump to content

    

Olegus

Участник
  • Content Count

    40
  • 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. Пересобрал проект все пошло. Что было так и не понял глюк какой-то.
  2. В True Studio написал простую функцию, подключил ее к main, все компилируется, пошагово ее выполняю в функцию заходит считает там правильно, но как только дохожу до конца функции и надо возращать полученное значение и выходить, все виснет. Что-то похожее у меня было с выводом в порт чисел с плавточкой но оказалась у меня были подключены обрезанные библиотеки (Проект генерю CubeMx). Раньше делал тоже самое все работало, а сейчас не пойму в чем дело. Может кто подскажет?
  3. Использую 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Гц. Почему так? Вроде один и тот же чип, с акселем работает, а с магнитометром нет.
  4. Может кто-нибудь сталкивался с AN3192 Application note ("Using LSM303DLH for a tilt compensated electronic compass"). Там описан процесс калибровки акселерометра и магнитометра. С акселерометром разобрался и проделал все работает, а с магнитометром не могу вдуплится. Не могу понять как получен вектор X (стр.28-29, выражения 27-28). Вдруг кто-то сталкивался.
  5. fixed-point это тип с фиксированным положением точки, т.е. не целый, а у меня предлагает матлаб типы (u)int16(32)_t и т.д. есть single and double? А если мне нужно фильтровать float? Еще вопросик: у меня в программе в которой я программирую свой stm32 нет типа single наверное она будет ругаться на этот тип, даже если я попробую осуществить приведение типов? Прошу прощения если задаю глупые вопросы.
  6. Я использую double потому что Matlab Coder не предлагает float, a только double или single и не для всех типов генериться код. Это вопрос точности, затрат ресурсов, а у меня дикое расхождение хотя фильтр живой!? можно привести в уже сгенеированном коде переменные к типу float, но не думаю, что это что-то даст, хотя может я неправ. Я фильтр скользящего окна так делал из Matlab Coder вроде все работала с double. Мне кажется тут у меня какая-то очевидная ошибка я просто не вижу ее.
  7. Исследую далее возможности 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
  8. Именно так, спасибо. Все получилось. Единственное из вектора сигнала с датчика (у меня размерность 100) первые 4 значения скачок а затем все ровно. Это связано с размерностью окна и начальными условиями наверное? От этого не избавится?
  9. Так и почему сгенерированная функция пустая. Проверил ее в Simulink все работает.
  10. И вроде на сайте Matlab https://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation-alphabetical-list.html написано, что данная функция поддерживает генерацию С/С++.
  11. Вот все сгенерировал Matlab Coder. Example особо не помог. Filter_moving_average.rar
  12. Мне тут советовали попробовать Matlab Coder для генерации кода для работы с матрицами для контроллера, быстро и хорошо получилось. Теперь я решил таким же образом генернуть c помощью Matlab Coder фильтр скользящего среднего используя функцию y = filter(b,a,x); Генерация прошла успешно, но как я обнаружил в сишных файлах моя функция пустая, может я не туда смотрю. M.файл function y = Moving_averig_my(x) windowSize = 5; b = (1/windowSize)*ones(1,windowSize); a = 1; y = filter(b,a,x); Ну и сишный (основной как я понимаю) /* * File: Moving_averig_my.c * * MATLAB Coder version : 3.2 * C/C++ source code generated on : 09-Apr-2019 21:15:12 */ /* Include Files */ #include "rt_nonfinite.h" #include "Moving_averig_my.h" /* Function Definitions */ /* * Arguments : double x * Return Type : double */ double Moving_averig_my(double x) { return x * 0.2; } /* * File trailer for Moving_averig_my.c * * [EOF] */ Вход на 0,2 умножается и на выход.(Откуда эта цифра 0,2 вообще взялась). Это что значит? При генерации никаких сообщений, что мол Coder не поддерживает данную функцию не было, весь пакет файлов сгенерировался.
  13. Ну мне так выше подсказали или я не правильно понял?!((
  14. uint8_t R1 = 0;//8 bit word uint8_t read_byte(uint32_t addr) { return (volatile uint8_t *)addr; } R1 = read_byte(START_ADDR_USER_PAGE + 0); По отладчику показывает ноль. Хотя там у меня по STM32 ST-Link Utility значение 0xEE. В чем ошибка?