Anton01 Опубликовано 3 октября, 2016 Поделиться Опубликовано 3 октября, 2016 Добрый день, есть следующий код он отлично вращает моторчик. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" void Delay(unsigned int t) { unsigned int i; for (i=0;i<t;i++); } void GPIOD_Initialize(){ GPIO_InitTypeDef GPIOC_Stepper; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIOC_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7; GPIOC_Stepper.GPIO_Mode=GPIO_Mode_Out_PP; GPIOC_Stepper.GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIOC_Stepper); } int main(void) { const int time = 10000; GPIOD_Initialize(); while(1) { GPIO_Write(GPIOC,GPIO_Pin_5); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_5| GPIO_Pin_3); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_3); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_3|GPIO_Pin_7); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_7); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_7|GPIO_Pin_1); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_1); Delay(time); GPIO_Write(GPIOC,GPIO_Pin_1|GPIO_Pin_5); Delay(time); } } Но хочу переделать данный код через таймер TIM2. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" void Delay(unsigned int t) { unsigned int i; for (i = 0; i < t; i++) ; } int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Включаем Таймер 2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitTypeDef PORT; // Настроим ноги со светодиодами на выход PORT.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); //Будем использовать альтернативный режим а не обычный GPIO PORT.GPIO_Mode = GPIO_Mode_AF_PP; PORT.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &PORT); //Разрешаем таймеру использовать ноги PA1,PA2,PA3 для ШИМа TIM2->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E); // Для всех трех каналов задаем инверсный ШИМ. TIM2->CCMR1 |= (TIM_CCMR1_OC2M_0 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2); TIM2->CCMR2 |= (TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_0 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2); //Запускаем таймер! TIM2->CR1 |= TIM_CR1_CEN; while (1) { TIM2->CCR1 = 20000; TIM2->CCR3 = 20000; Delay(10000); TIM2->CCR1 = 20000; Delay(10000); TIM2->CCR4 = 20000; TIM2->CCR1 = 20000; Delay(10000); TIM2->CCR4 = 20000; Delay(10000); TIM2->CCR2 = 20000; TIM2->CCR4 = 20000; Delay(10000); TIM2->CCR2 = 20000; Delay(10000); TIM2->CCR3 = 20000; TIM2->CCR2 = 20000; Delay(10000); TIM2->CCR3 = 20000; } } Проблема в том что когда прошиваю контроллер вторым кодом, мотор пищит но не вращается. Мне кажется что у меня неверно генерируется ШИМ. Но как определить без осцилографа какой он в первом варианте а какой во втором? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 3 октября, 2016 Поделиться Опубликовано 3 октября, 2016 Когда в первом пишите в порт единичку на пин 3 GPIO_Write(GPIOC,GPIO_Pin_3); то все остальные ноги GPIO_Pin_1,5,7 при этом автоматически зануляются, т.к. в этой команде в них записывется ноль. Во втором вариатне при записи TIM2->CCR1 = 20000; все другие регисты ШИМа не изменяются ! То есть один раз записали туда 20000 и всё, эта величина остаётся без изменения навсегда. Во втором варианте при изменении ШИМА остальные регистры надо каждый раз занулять вручную. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
mail_robot Опубликовано 3 октября, 2016 Поделиться Опубликовано 3 октября, 2016 если пищит, значит частота переключения фаз слишком высокая. Разбирайтесь с математикой настройки таймера 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Anton01 Опубликовано 4 октября, 2016 Автор Поделиться Опубликовано 4 октября, 2016 Использовал следующий код. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" void Delay(unsigned int t) { unsigned int i; for (i = 0; i < t; i++) ; } int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Включаем Таймер 2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitTypeDef PORT; // Настроим ноги со светодиодами на выход PORT.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); //Будем использовать альтернативный режим а не обычный GPIO PORT.GPIO_Mode = GPIO_Mode_AF_PP; PORT.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &PORT); //Разрешаем таймеру использовать ноги PA1,PA2,PA3 для ШИМа TIM2->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E); // Для всех трех каналов задаем инверсный ШИМ. TIM2->CCMR1 |= (TIM_CCMR1_OC2M_0 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2); TIM2->CCMR2 |= (TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_0 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2); //Запускаем таймер! TIM2->CR1 |= TIM_CR1_CEN; while (1) { TIM2->CCR1 = 60000; TIM2->CCR2 = 0; TIM2->CCR3 = 60000; TIM2->CCR4 = 0; Delay(60000); TIM2->CCR1 = 60000; TIM2->CCR2 = 0; TIM2->CCR3 = 0; TIM2->CCR4 = 0; Delay(60000); TIM2->CCR1 = 60000; TIM2->CCR2 = 0; TIM2->CCR3 = 0; TIM2->CCR4 = 60000; Delay(60000); TIM2->CCR1 = 0; TIM2->CCR2 = 0; TIM2->CCR3 = 0; TIM2->CCR4 = 60000; Delay(60000); TIM2->CCR1 = 0; TIM2->CCR2 = 60000; TIM2->CCR3 = 0; TIM2->CCR4 = 60000; Delay(60000); TIM2->CCR1 = 0; TIM2->CCR2 = 60000; TIM2->CCR3 = 0; TIM2->CCR4 = 0; Delay(60000); TIM2->CCR1 = 0; TIM2->CCR2 = 60000; TIM2->CCR3 = 60000; TIM2->CCR4 = 0; Delay(60000); TIM2->CCR1 = 0; TIM2->CCR2 = 0; TIM2->CCR3 = 60000; TIM2->CCR4 = 0; } } Вот что получилось: Подскажите что я не так делаю. В каком направление двигаться дальше? Спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 4 октября, 2016 Поделиться Опубликовано 4 октября, 2016 (изменено) В том примере из Интернета, что Вы скопировали, используются три ноги PA1, PA2 и PA3. У Вас же используются четыре ноги. Надо ещё добавить инициализацию ШИМа для PA0 в регистр TIM2->CCMR1 . И, потом, в примере используется инверсный ШИМ, т.е. при выполнении команды "TIM2->CCR1 = 0;" на выходе будет полное напряжение, а не нулевое. Вам же нужно как раз наоборот? Если так, то надо изменить на прямой ШИМ. Получится, типа, так: TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2; TIM2->CCMR2 |= TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; Изменено 4 октября, 2016 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.