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

STM32F407 помощь с шим


Гость constoff

Рекомендуемые сообщения

Здравствуйте! Есть небольшие недопонимания по генерации шим сигнала и изменению периода и скважности. Пробовал использовать несколько примеров, пробовал использовал CubeMX, все тщетно. Не получается в обработчике прерывания изменить период, причем, так же пытался напрямую записать значение в регистр ARR. Задача, в целом, управлять шаговым двигателем STEP/Dir. Прошу пояснить на примере вот этого кода, к сожалению, не могу проверить осциллографом, за его отсутствием, что выдает с ножек, потому на глаз проверяю светодиодами))

#include <stm32f4xx.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_tim.h>
#include <stm32f4xx_exti.h>
#include <misc.h>
#include <stm32f4xx_syscfg.h>


int flag=0;

void EXTI0_IRQHandler() {
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        TIM_OCInitTypeDef oc_init;
        TIM_OCStructInit(&oc_init);
        oc_init.TIM_OCMode = TIM_OCMode_PWM1;
        oc_init.TIM_OutputState = TIM_OutputState_Enable;
        oc_init.TIM_Pulse = 9000;
        
        oc_init.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init(TIM4,&oc_init);
        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
        //2
            
        oc_init.TIM_Pulse = 500;
        TIM_OC2Init(TIM4,&oc_init);
        TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
         
        //3
        oc_init.TIM_Pulse = 5000;
        TIM_OC3Init(TIM4,&oc_init);
        TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
         
        //4
        oc_init.TIM_Pulse = 500;
        TIM_OC4Init(TIM4,&oc_init);
        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
        EXTI_ClearITPendingBit(EXTI_Line0);    
 }
}

void init_gpio() {
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
 
    GPIO_InitTypeDef init;
    init.GPIO_Mode = GPIO_Mode_AF;
    init.GPIO_OType = GPIO_OType_PP;
    init.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    init.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOD,&init);
 
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4);
}

void tim_init(){
        TIM_TimeBaseInitTypeDef base_timer;
        TIM_TimeBaseStructInit(&base_timer);
 
        base_timer.TIM_Prescaler = 8400 - 1; 
        base_timer.TIM_Period = 10000;  
        base_timer.TIM_CounterMode = TIM_CounterMode_Up; 
        TIM_TimeBaseInit(TIM4, &base_timer);
 
        TIM_OCInitTypeDef oc_init;
        TIM_OCStructInit(&oc_init);
        oc_init.TIM_OCMode = TIM_OCMode_PWM1;   
        oc_init.TIM_OutputState = TIM_OutputState_Enable;
        oc_init.TIM_Pulse = 500;   
        oc_init.TIM_OCPolarity = TIM_OCPolarity_High; 
 
        TIM_OC1Init(TIM4,&oc_init);  
        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
        //2
        oc_init.TIM_Pulse = 5000; 
        TIM_OC2Init(TIM4,&oc_init); 
        TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
    
        oc_init.TIM_Pulse = 500;
        TIM_OC3Init(TIM4,&oc_init);
        TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
        //4  - D15
        oc_init.TIM_Pulse = 5000;
        TIM_OC4Init(TIM4,&oc_init);
        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
        TIM_ARRPreloadConfig(TIM4,ENABLE);
        TIM_Cmd(TIM4,ENABLE);   
}

void init_it() {
      EXTI_InitTypeDef   EXTI_InitStructure;
      GPIO_InitTypeDef   GPIO_InitStructure;
      NVIC_InitTypeDef   NVIC_InitStructure;
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); 
      EXTI_InitStructure.EXTI_Line = EXTI_Line0;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
}

int main(void){
    init_gpio();
    init_it();
    tim_init();
    while (1){
    }
    return 0;
}

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Чтобы аппаратуру понимать нужно не говнолибы юзать и пи..ить код с тЫрнЕтов ваших как вы это любите, а писать через CMSIS с чтением референс мануала тогда и вопросов таких простых не будет.

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

6 часов назад, mail_robot сказал:

при чем тут интересно ШИМ?

Подскажите, пожалуйста вариант, который нужно рассмотреть для управления шаговиками.

2 часа назад, Oxford сказал:

Чтобы аппаратуру понимать нужно не говнолибы юзать и пи..ить код с тЫрнЕтов ваших как вы это любите, а писать через CMSIS с чтением референс мануала тогда и вопросов таких простых не будет.

Согласен, вопрос глупый, но как учиться, если вопросов не задавать. Без примеров по-моему читай не читай референс, толку особенно не будет, вы изначально прочитали и сразу сообразили как код писать?)

Ссылка на комментарий
Поделиться на другие сайты

чтобы советы раздавать, надо сперва в говнолибах разобраться, а не советовать свою любимую кочку, тем более что называется она иначе

по существу - человеку надо непонятно что. Что он хочет изобразить тоже не совсем ясно. Для драйверов типа step/dir шим совершенно бесполезен, так как частота следования импульсов не меняется (в классическом понимании ШИМ). Нужен частотно-импульсный формирователь. Это не сложно, надо просто внимательно почитать мануал на таймер и на время забыть про ШИМ

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

10 минут назад, mail_robot сказал:

чтобы советы раздавать, надо сперва в говнолибах разобраться, а не советовать свою любимую кочку, тем более что называется она иначе

по существу - человеку надо непонятно что. Что он хочет изобразить тоже не совсем ясно. Для драйверов типа step/dir шим совершенно бесполезен, так как частота следования импульсов не меняется (в классическом понимании ШИМ). Нужен частотно-импульсный формирователь. Это не сложно, надо просто внимательно почитать мануал на таймер и на время забыть про ШИМ

То есть нужно управлять только периодом, если не ошибаюсь ARR регистр?

Ссылка на комментарий
Поделиться на другие сайты

Нужно управлять частотой следования импульсов. Минимальное время активного состояния (длинна импульса) прописана в доках на драйвер.

При использовании таймера для ШИМ частоту следования импульсов можно поменять только одним способом - прескаллером. Заполнением управляет CCRх регистр. Про остальное написан сикстилиард статей, которые легко гуглятся. Есть даже примеры кода под стандартные китайские сервомашинки и драйверы шаговиков на гитхабе. Их там тоже квинтилион хреналиардов

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...
18.09.2018 в 15:23, Oxford сказал:

Чтобы аппаратуру понимать нужно не говнолибы юзать и пи..ить код с тЫрнЕтов ваших как вы это любите, а писать через CMSIS с чтением референс мануала тогда и вопросов таких простых не будет.

Вас за такие слова куболибы закидают камнями.(Извиняюсь за спам.....больше не буду)

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

TIM10->CCMR1=0x0078;
      TIM10->CCER=0x0001;
      TIM10->PSC=0x0004;
      TIM10->ARR=0x0001;
      TIM10->CCR1=0x0001;
      TIM10->BDTR=0x8000;
      TIM10->CR1=0x0081;

ШИМ на TIM10(да можно на любом).  Ну тут нет инит выводов и начальной инициализации, Без всяких прерываний.Чистый ШИМ на ТИМ.Как говорится придумай проще. Без "птичьего языка"(типа шыр пыр, пыр шыр-TIM_TimeBaseInitTypeDef,   GPIO_InitStructure , TIM_TimeBaseStructure)и так далее, в одной инструкции больше букв , чем во всём моём коде. Ну кто скажет что на регистрах код большой. ВАще я понимаю этой птичий, но удивляюсь, кто его придумал,а а-а....якобы с камня на камень кидать легко. а вы часто кидаете с камня на камень.А потом  мы ешё вам и HAL кинем, чтоб USB (ваще хоть вы его и не понимаете,)но на STM32 вам СUB его запилит. Может быть:D

Изменено пользователем Shalfey
Ссылка на комментарий
Поделиться на другие сайты

Согласен. НА дату не посмотрел. Просто увидел "простынь" с кодом вверху и что то прорвало. Заглянет какой нибудь электрик продвинутый. Ну допустим на работе надо себя показать, допустим. Шим много где применяется, вот он и запилит просто. И получит разряд. У нас при повышении квалификации в комиссии  кто то задавал вопрос: "а вы умеете программировать STM32". Я тогда ещё не работал в этом отделе.Нахрен он его задавал. На заводе нигде я не нашёл STM32. Всюду Siemens.Вновь прибывшие начинающие забивают в поиск темы и они просматриваются всем инетом. Так что тема эта актуальная пока STM32 не скинет какой нибудь другой камень. А это будет всё равно когда то. Китайцы забили на STM . Это знак

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Лучше в облако загрузите и линк оставьте, многие спасибо скажут.
    • Скачал книгу. Если  кому надо, скину в личку торрент-файл для скачивания. искусство.pdf
    • Погуглил: стайлер такой-то - это фен с ёжиком. Зачем ему средняя точка?
    • Разводка земли и цепей питания полностью неправильная. Я свою плату разводил "звездой", а у вас вообще что по плюсу что по земле чëрти что получилось. Ещë и дорожки очень тонкие. Да и помимо этого косяков разводки хватает. Такая плата будет возбуждатся, и даже не факт что конденсаторов коррекции (тех самых на 100 пФ) даже при их увеличении хватит чтобы погасить это возбуждение. Либо при их увеличении "загрубите" коррекцию настолько, что усилитель станет значительно искажать сигнал и АЧХ. Купите нормальные выводные детали и соберите по моей печатке или печатке от @oleg_s, эти детали копейки стоят. Зато получите усилитель который сразу заработает корректно и может даже десятки лет проработает без проблем (если источник питания и кондëры будут хорошими).  И да, ещë, C7 и C2 увеличьте до 100-220 мкФ, это значительно улучшит АЧХ. 
    • @Богдан Назаренко , ты, вроде, говорил, что микросхема у тебя soic? А развёл под dip.
    • Разве это плохо? Разве не это есть истинный путь познания МК? Можно на ты, к чему эти политесы.
    • Не разделяю вашего мнения. Схема нужна - она как раз исключит "ползанье" с лупой и мультиметром. Например на плате подключен кан, 485 и рс232, два светодиода и две кнопки. Была бы схема сразу бы было понятно к каким портам. А новичку нужно открыть даташит на МК, разобраться как подключается кан, рс232, прозвонить подключение микросхем интерфейсных к портам, прозвонить подключение светодиодов, включая то как они подключены (+ или -), тоже с кнопками.
×
×
  • Создать...