Перейти к содержанию
    

peroid

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о peroid

  • Звание
    Участник
    Участник
  1. Круто, спасибо за подсказку. Контроллер я уже запитал через КР142ЕН5А. Полет нормальный, контроллер кушает мало, перепад напряжения 2.4 В. микросхема холодная. Со свободным местом не мог точно определиться, так как батарейку только выбрал и заказал. Приедет, установлю и буду думать, куда правильнее было бы пихнуть преобразователей. Судя по характеристикам, мне двух штук за глаза хватит. 1 на левую половину туловища а второй на правую. Ну и фото выложу, сейчас стыдновато малеха :) обрубок, а не паук.
  2. Но все равно лучше делать это на импульсном стабилизаторе?
  3. У меня отладочная плата Discovery - она кушает 5 Вольт в том числе, если подать на соответствующий пин. С диодами классно придумано, очень места жалко внутри. Берегу его под батарейку. Спасибо за помощь, завтра побегу в магазин. :santa2:
  4. Добрый день. В процессе создания гексапода, возникла необходимость в 3х уровнях питания: 1) 5 Вольт - питание контроллера STM32F4 (планирую выделить на него 1 А, так как может придется подвесить на это питание еще что-нибудь маломощное); 2) 6 Вольт - питание 18ти сервоприводов MG996r (планирую выделить на них 18 А. 6 ног - на каждую свой преобразователь на 3 А. Преобразователи решил разделить на 6 штук, так как просто некуда поместить один здоровый); 3) 8.3 Вольт - питание беспроводного модуля джойстика PlayStation 2 (кушает в режиме поиска 100 мА, так что думаю 200мА более чем хватит). В качестве основного источника питания планирую использовать LiPo батарею с выходом 7.4 Вольт, емкостью 3000 мАч и постоянной токоотдачей 20С. Подумывал поставить батарею 14.8 Вольт, но там размер слегка побольше. Изначально хотел понизить напряжение с помощью КР142ЕН22А. Подумал, что раз падение напряжения на нем невелико (с 7.4 до 5) то и греться будет не сильно + займет меньше места чем импульсный стабилизатор. А вот как быть с питанием модуля джойстика? Дело в том, что я проверял его на 7.5 Вольтах, он не входит в режим поиска. Поиск начинается только от 8 с небольшим Вольт на входе питания. Подскажите, как правильно организовать питание этого модуля и насколько вернО мое предположение насчет КР142ЕН22А (может лучше и там использовать импульсные стабилизаторы)?
  5. Спасибо большое за разъяснения! Собственно именно идиотский вопрос и не давал мне покоя.
  6. У джойстика минимум 3.3 Вольта на питание.
  7. Добрался я до платки, вот выкладываю то, что получилось: На плату поступает питание 5 Вольт от источника питания Вот что имеем на выходе ноги PA5 (SPI1_SCK) Не выходит каменный цветок.
  8. Спасибо. Вот только не понятно. Я питаюсь от usb, цепляю осциллограф к ножками SPI1 и наблюдаю 2.997 Вольт. Попробую завтра запитать его через пин 5В.
  9. У мастера на борту 3 В максимум, а у слейва минимум 3.3 В для восприятия единицы. Бытует мнение, что данное соединение должно просто ограничить ток, но никак не поможет мне в согласовании разного напряжения. Нашел txb0104. Думаю, что это оно. Спасибо за помощь.
  10. А в чем собственно проблема? Ну вот не знаю я как это организовать физически, через этот самый буфер. Точнее как его подобрать, чтобы не облажаться. Прочитал про уровни вот тут: http://virtual-shed.blogspot.ru/2013/03/pl...erface.html?m=1 И еще, я слышал где-то, что эта ветка для новичков или что-то типа этого. Моей фантазии пока хватило на оптопару, вместо буфера :)
  11. Доброго всем времени суток. Проблема следующего характера: Пытаюсь вкрячить джойстик от PS2 dualshock в связку с stm32f4discovery. В инете нарыл информацию, что уровень логической единицы у SPI джойстика = 3.3 Вольт, а у SPI stm32f4 уровень единицы = 3.0 вольт. Там же нашел девайс для согласования уровней - CMOS HEX buffer (CD4050B). Правильно ли я понимаю, что это некий неинвертирующий логический элемент с возможностью усиления уровня напряжения? Просто никак не могу подобрать аналог, чтобы точно быть уверенным что это он. Уже подумал присобачить какой нибудь транзистор для развязки, но микруха вроде как-то кошернее.
  12. Блин! Вот я Алень =) Сейчас перечитал пост тов. alexeyv и на меня снизошла благодать и полная алилуя! Можно ж не только формировать импульс, но и посчитать его тупо по прерываниям :maniac: Пока вход == 1 инкрементировать значение счетчика таймера каждый раз в прерывании по переполнению, а как только он упадет (сигнал) в ноль, то передать это значение в обработку!!! Но неужели нельзя прикрутить сюда таймер? по-любому можно =) Думал по переднему фронту принудительно обнулять таймер и начинать захват, но не могу понять как отловить задний фронт... подумывал уже запаралелить ногу на другой вход, по заднему фронту генерить прерывание и тянуть значение таймера в обработку, но жаба душит безумно! Отдать ногу на такую хрень - это очень плохо. Таймер 2 у меня занят, так что оба фронта не получится тут отслеживать.. только передний или задний.
  13. Сделал следующим образом - у таймера 9 настроил канал на сравнение: // Настроил Пин 6 как альтернативную функцию таймера 9. GPIO_InitTypeDef USonic_GPIOE_init; TIM_TimeBaseInitTypeDef USonic__TIMER_9_init; TIM_ICInitTypeDef USonic__IC_TIMER_9_def; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE); USonic_GPIOE_init.GPIO_Mode = GPIO_Mode_AF; USonic_GPIOE_init.GPIO_OType = GPIO_OType_PP; USonic_GPIOE_init.GPIO_Pin = GPIO_Pin_6; USonic_GPIOE_init.GPIO_PuPd = GPIO_PuPd_DOWN; USonic_GPIOE_init.GPIO_Speed = GPIO_High_Speed; GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9); GPIO_Init(GPIOE, &USonic_GPIOE_init); // Думается, что при частоте 168 МГц и предделителе 16800, частота таймера будет 10'000 тиков в секунду // Устанавливаю период, равный 10'000, чтобы таймер обнулялся каждые 10 милисекунд // Мне все время кажется, что где то тут у меня ошибка :) USonic__TIMER_9_init.TIM_ClockDivision = TIM_CKD_DIV1; USonic__TIMER_9_init.TIM_CounterMode = TIM_CounterMode_Up; USonic__TIMER_9_init.TIM_Period = 10000; USonic__TIMER_9_init.TIM_Prescaler = 16799; TIM_TimeBaseInit(TIM9, &USonic__TIMER_9_init); // Говорю таймеру считать по нарастающему фронту. USonic__IC_TIMER_9_def.TIM_Channel = TIM_Channel_2; USonic__IC_TIMER_9_def.TIM_ICFilter = 0; USonic__IC_TIMER_9_def.TIM_ICPrescaler = TIM_ICPSC_DIV1; USonic__IC_TIMER_9_def.TIM_ICSelection = TIM_ICSelection_DirectTI; USonic__IC_TIMER_9_def.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInit(TIM9, &USonic__IC_TIMER_9_def); // Включаю прерывания NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); TIM_ITConfig(TIM9, T// Vkluchaem TIMER // И сам таймер TIM_Cmd(TIM9, ENABLE); } void TIM1_BRK_TIM9_IRQHandler(void) { if (TIM_GetITStatus(TIM9,TIM_IT_CC2)!=RESET) { TIM_ClearITPendingBit(TIM9, TIM_IT_CC2); // Пишу значение, что насчитал таймер, в память. delay_us = TIM_GetCapture2(TIM9); } } Теперь беру таймер 7 и прикручиваю к нему ногу Е5: GPIO_InitTypeDef USonic_GPIOEout_init; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); USonic_GPIOEout_init.GPIO_Mode = GPIO_Mode_OUT; USonic_GPIOEout_init.GPIO_OType = GPIO_OType_PP; USonic_GPIOEout_init.GPIO_Pin = GPIO_Pin_5; USonic_GPIOEout_init.GPIO_PuPd = GPIO_PuPd_DOWN; USonic_GPIOEout_init.GPIO_Speed = GPIO_High_Speed; GPIO_Init(GPIOE, &USonic_GPIOEout_init); И таймер 7 наконец: TIM_TimeBaseInitTypeDef Delay_TIM_BASE_Settings; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); //Планируется, что таймер обнуляется каждую микросекунду Delay_TIM_BASE_Settings.TIM_ClockDivision = TIM_CKD_DIV1; Delay_TIM_BASE_Settings.TIM_CounterMode = TIM_CounterMode_Up; Delay_TIM_BASE_Settings.TIM_Period = 1; Delay_TIM_BASE_Settings.TIM_Prescaler = 83; Delay_TIM_BASE_Settings.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM7, &Delay_TIM_BASE_Settings); // Включаю прерывание NVIC_EnableIRQ(TIM7_IRQn); TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); // Запускаю таймер TIM_Cmd(TIM7, ENABLE); // Вот тут планируется, что пока счетчик меньше 10 мкС, идет импульс. В противном случае - выход подтянут к земле. void TIM7_IRQHandler(void) { if (TIM_GetITStatus(TIM7,TIM_IT_Update)!=RESET) { if (us_delay < 10) { GPIO_SetBits(GPIOE, GPIO_Pin_5); }else { GPIO_ResetBits(GPIOE, GPIO_Pin_5); } us_delay++; if (us_delay >= 10000) { us_delay=0; } } Получилось .... какая то хрень получилась... Бытует мнение, что счетчик показывает часы до апокалипсиса, но вот только не эхо =(
  14. Всем доброго времени суток. Пытаюсь прикрутить к STM32f4-Discovery ультразвуковой дальномер US-015. Как я понял, нужно подать на ножку датчика импульс длиной 10 микросекунд, а потом посчитать ширину эха. Думаю, что решение через задержку в главном цикле не совсем правильно, поэтому пытаюсь прикрутить все это аппаратно. Как вариант решения, решил использовать режим одновибратора ТIM_SelectOnePulseMode(TIM9, TIM_OPMode_Single), но не могу понять как перезапустить импульс заново. Перезапускать его хочу его из TIM1_BRK_TIM9_IRQHandler, после того, как произойдет считывание ширины эха. Помогите пожалуйста подкостылить код, дабы запускать импульс по мере необходимости :smile3046: P.S. Длительность импульса задаю из главного цикла командой TIM_SetCompare1(TIM9, length); Вот настройки GPIO и TIM9: #include "UltraSonic_timer_ini.h" int capture=0; void UltraSonic_init(void) { GPIO_InitTypeDef UltraSonic_GPIO_init; TIM_TimeBaseInitTypeDef UltraSonic_TIM_BASE_Settings; TIM_OCInitTypeDef UltraSonic_TIM_OC_Settings; TIM_ICInitTypeDef UltraSonic_TIM_IC_Settings; //TAKTIRUEM RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE); UltraSonic_GPIO_init.GPIO_Mode=GPIO_Mode_AF; UltraSonic_GPIO_init.GPIO_OType=GPIO_OType_PP; UltraSonic_GPIO_init.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6; UltraSonic_GPIO_init.GPIO_PuPd=GPIO_PuPd_DOWN; UltraSonic_GPIO_init.GPIO_Speed=GPIO_Low_Speed; GPIO_Init(GPIOE, &UltraSonic_GPIO_init); GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9); GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9); UltraSonic_TIM_BASE_Settings.TIM_ClockDivision = TIM_CKD_DIV1; UltraSonic_TIM_BASE_Settings.TIM_CounterMode = TIM_CounterMode_Up; UltraSonic_TIM_BASE_Settings.TIM_Period = 1000; UltraSonic_TIM_BASE_Settings.TIM_Prescaler = 167; UltraSonic_TIM_BASE_Settings.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM9, &UltraSonic_TIM_BASE_Settings); UltraSonic_TIM_OC_Settings.TIM_OCIdleState = TIM_OCIdleState_Reset; UltraSonic_TIM_OC_Settings.TIM_OCMode = TIM_OCMode_PWM1; UltraSonic_TIM_OC_Settings.TIM_OCPolarity = TIM_OCPolarity_High; UltraSonic_TIM_OC_Settings.TIM_OutputState = TIM_OutputState_Enable; UltraSonic_TIM_OC_Settings.TIM_Pulse = 10; TIM_OC1Init(TIM9, &UltraSonic_TIM_OC_Settings); UltraSonic_TIM_IC_Settings.TIM_Channel = TIM_Channel_2; //Ispolzuem 2y kanal TIMER 9 UltraSonic_TIM_IC_Settings.TIM_ICFilter = 2; //Ne filtruem nichego UltraSonic_TIM_IC_Settings.TIM_ICPolarity = TIM_ICPolarity_Rising; //Schitaem po narastauschemu frontu UltraSonic_TIM_IC_Settings.TIM_ICPrescaler = TIM_ICPSC_DIV1; //Schitaem kajdiy impuls UltraSonic_TIM_IC_Settings.TIM_ICSelection = TIM_ICSelection_DirectTI; //Napryamuiu so vhoda!!! TIM_ICInit(TIM9, &UltraSonic_TIM_IC_Settings); TIM_ITConfig(TIM9, TIM_IT_CC2, ENABLE); TIM_Cmd(TIM9, ENABLE); TIM_SelectOnePulseMode(TIM9, TIM_OPMode_Single); NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); } void TIM1_BRK_TIM9_IRQHandler(void) { if (TIM_GetITStatus(TIM9, TIM_IT_CC2) != RESET) { TIM_ClearITPendingBit(TIM9, TIM_IT_CC2); capture = TIM_GetCapture2(TIM9); TIM_ClearFlag(TIM9,TIM_FLAG_Update); } } Спасибо.
  15. Доброго времени суток всем. Делаю дома шестилапого механического паука. Возник вопрос, как правильно описать движение ног в пространстве? Написал алгоритм, оно вроде даже ходит... но как-то все не то.. и тут напоролся на инверсную кинематику. В рамках одной плоскости, решение задачи по нахождению необходимых углов звеньев манипулятора не составляет большого труда (как тут http://robocraft.ru/blog/mechanics/756.html ), но не ясен метод расчета углов для пространственного перемещения. Прошу помощи у знающих людей, может кто подскажет не слишком замудреную книжку или статью, или лучше даже поможет ответами в личке на возникающие вопросы?
×
×
  • Создать...