artos5

Moderators
  • Публикации

    2 749
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    7

Последний раз artos5 выиграл 22 января 2013

Публикации artos5 были самыми популярными!

Репутация

290 Хороший

1 подписчик

О artos5

  • Звание
    начинающий :)
  • День рождения 05.05.1985

Контакты

  • ICQ
    436015834
  • Skype
    artyomugr

Информация

  • Пол
    Мужчина
  • Город
    Украина, Ахтырка

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    Цифровая электроника, Силовая электроника, Аудио
  • Оборудование
    UNI-T UT71B, MASTECH MS8260E , LUKEY 852D, Паяльник 30W с тонким керамическим жалом, держатель плат с лупой.

Посетители профиля

21 750 просмотров профиля
  1. STM32 Keil Struct . доступ к структурам из других файлов

    Ну естественно СЭР... Кстати тот пример что выше завелся с пол пинка. Так что спасибо большое чувачку за пример
  2. STM32 Keil Struct . доступ к структурам из других файлов

    Так пробовал , не работает если надо из двух сишных файлов получить к структуре доступ , при чем чтобы был тот же блок памяти а не выделен новый . То есть нужен некий полный аналог переменной , к которой получаем доступ через extern только через структуру . Хотя , стоп ! По моему я делал чуток не так )) попробую утром! Создаётся несколько блоков памяти с идентичными полями .
  3. STM32 Keil Struct . доступ к структурам из других файлов

    Разобрался в чем дело... Не работает все равно , хоть и компилится...
  4. Всем привет! Столкнулся с проблемой которую не удается решить. прописал в файле Drive.h так: typedef struct { uint8_t FlgL; uint8_t FlgR; uint16_t Speed; uint16_t PulseL1; uint16_t PulseL2; uint16_t PulseR1; uint16_t PulseR2; } Motor_; typedef struct { uint8_t Status; } Button_; extern struct Motor_ Motor; extern struct Button_ Button; а в с файле: #include "Drive.h" Motor.Pulse = 3; // зададим значение переменной в структуре Motor в итоге 2 ошибки редефайн.... как правильно с ними работать? За вчера и за сегодня уже наверное 1000 вариантов попробовал.
  5. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Короче решил задачу) Взял два отдельных таймера в режиме pwm input mode . , Но считываю с одного регистра таймеров в лоб. Довольно стабильно работает
  6. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Чёт нихрена не пойму .. Я могу настроить один вход захвата второго таймера на ножку TI1 и читать регистр TIM2->CCR1 , и также настроить второй вход TI2 и читать с TIM2->CCR2 ? мне нужно на двух физически разных энкодерах получать период импульсов. Что то первый канал влияет на второй а второй на первый ... Я уже регистры считываю по мануалу. Или мне нужно для второго энкодера выбрать другой таймер с его входом захвата? Мне PWM_INPUT_MODE не нужен мне достаточно по любому из фронтов получать период сигнала.
  7. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Как тут в 6м посте?? : http://www.cyberforum.ru/arm/thread2090357.html Два пина получается нужно соединять вместе?
  8. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Да я тут походу готовлю неправильно... Я не совсем понимаю как таймер считает . Я то знаю что он считает вверх и он подсчитывает период сигнала . Кто может пояснить , нужно ли этот счётчик обнулять? Или он сам обнуляется аппаратно? Хочу все же использовать этот режим , так как он максимально подходит для данной задачи..
  9. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Нашел такую ерунду в ерата , и как мне это временное решение применить? Если мне надо постоянно захватывать сигнал?)) Щас не помню на память какие ноги (их две настроено) второй таймер , вход 1 и 2 . Настроено все 100% правильно и ноги те выбраны. На импульсы они откликаются , но какая-то каша происходит , вплоть до того что они друг на друга влияют )
  10. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Да мне и так сойдёт . Нужно считать период и немного подстраивать ШИМ . Я пробовал и в лоб , через модуль EXTI и таймер. Тоже результат хреновый . Значение таймера (что насчитал ) сильно отличалось . Например было так: 5 10 82 1 30 При том что меандр на осциллографе хороший показывает. Ооо, это завтра попробую , спасибо )
  11. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Нет , там регулятор ШИМ , максимум 5 строчек кода . Юарт в вечном цикле пару раз в секунду выводит показания с датчиков
  12. STM32 HAL_TIM_IC_CaptureCallback вычисление периода импульсов

    Совсем каша. Нет У меня на AVR без пид работало хорошо. Измерял период и подстраивал ШИМ если были расхождения . В двигателей тех инерционности практически нет .
  13. Всем доброго времени суток! Необходима стабилизация частоты вращения двигателей по энкодерам. Энкодеры состоят из одного датчика холла на валу двигателя. Эту задачу на АВР я решил при помощи INT0 и аппаратного таймера , попробовал перенести код на STM32 . Попробовал через EXTI , результат не понравился .. Решил через таймер . void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint8_t InpCaptIndexL=0, InpCaptIndexR=0; if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // =RISING= EDGE DETECTED { // Get =RISING= EDGE Capture value if(InpCaptIndexR==0) { Motor.TimerOldR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); InpCaptIndexR=1; } else { Motor.TimerNewR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); InpCaptIndexR=0; } if (Motor.TimerOldR > Motor.TimerNewR) { Motor.MotorRData = (Motor.TimerOldR - Motor.TimerNewR); } else { Motor.MotorRData = (Motor.TimerNewR - Motor.TimerOldR); } // Reset Counter After Input Capture Interrupt Occurs __HAL_TIM_SET_COUNTER(&htim1,0x00); } if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =FALLING= EDGE DETECTED { // Get =FALLING= EDGE Capture value if(InpCaptIndexL==0) { Motor.TimerOldL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); InpCaptIndexL=1; } else { Motor.TimerNewL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); InpCaptIndexL=0; } if (Motor.TimerOldL > Motor.TimerNewL) { Motor.MotorLData = (Motor.TimerOldL - Motor.TimerNewL); } else { Motor.MotorLData = (Motor.TimerNewL - Motor.TimerOldL); } // Reset Counter After Input Capture Interrupt Occurs } StabMotorSpeed1(); __HAL_TIM_SET_COUNTER(&htim2, 0x00); } в интернете подсмотрел применение захвата но получается какая то каша . Осциллографом четко вижу меандр одинаковой частоты , а в юарт сыпет постоянно разные значения ... (имею ввиду переменную Motor.MotorLData и Motor.MotorRData) Тактирование 64МГц настройки таймера такие: TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 6400; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } что то я или недопонимаю , или что то не так приготавливаю.. Пробовал и так: void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =RISING= EDGE DETECTED { // Get =RISING= EDGE Capture value Motor.TimerR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // Reset Counter After Input Capture Interrupt Occurs __HAL_TIM_SET_COUNTER(&htim1,0x00); } if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // =FALLING= EDGE DETECTED { // Get =FALLING= EDGE Capture value Motor.TimerL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // Reset Counter After Input Capture Interrupt Occurs } StabMotorSpeed(); __HAL_TIM_SET_COUNTER(&htim2, 0x00); } Результат тоже хуже чем на АВР , и в юарт сыпет каша (имею ввиду переменную Motor.TimerL и Motor.TimerR) Помогите пожалуйста разобраться в чем дело.
  14. С шаговиком много танцев и плясок , особенно если требуется высокий момент на валу. Там нужна стабилизация тока фаз . Тогда момент хороший на валу будет , но не такой как у коллекторных двигателях.
  15. Несложный ЦАП на AK4490

    Есть и такие : Высокое разрешение 1,3 дюймов ips TFT Дисплей ips ЖК-дисплей Экран 1,3 дюймов 3,3 В ST7789 ips Экран дисплея https://s.click.aliexpress.com/e/caaIkVqv Должны быть долговечнее , так как ips .