Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 22:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: первый бой с ШИМ
СообщениеДобавлено: 10 апр 2012, 23:42 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
пытаюсь разобраться в шиме и помигать диодиком шимом на PD13 (stm32f4discovery)... набросал с примера программку немного изменив, вроде в дебагере таймер запускается а шима на диодике так и не видно :(((

void InitPWM(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseConfig;
TIM_OCInitTypeDef TIM_OCConfig;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);


TIM_BaseConfig.TIM_Prescaler = (SystemCoreClock / 10000) - 1;

TIM_BaseConfig.TIM_Period = 9999;
TIM_BaseConfig.TIM_ClockDivision = 0;
TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4, &TIM_BaseConfig);

TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCConfig.TIM_Pulse = 4999;
TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;


TIM_OC2Init(TIM4, &TIM_OCConfig);

TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);

TIM_Cmd(TIM4, ENABLE);
}


int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOD , &GPIO_InitStructure);

InitPWM();
while (1) {

};

где я ошибся? :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 07:50 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 14 июл 2011, 01:36
Сообщения: 72
Откуда: Москва
Отсутствует вызов GPIO_PinAFConfig. Желателно до GPIO_Init.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 08:49 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
md5sum писал(а):
Отсутствует вызов GPIO_PinAFConfig. Желателно до GPIO_Init.


как я понял это для переназначения выводов? там же вроде на PD13 висит TIM4_CH2 и ничего переназначать не нужно, хотя перед инициализацией портов написал
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
тоже не помогло :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 14:07 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
перед работой с GPIO_InitStructure нужно вызвать GPIO_StructInit(&GPIO_InitStructure); для TIM_TimeBaseInitTypeDef и TIM_OCInitTypeDef есть похожие функции инициализации.
попробуйте задать тип выхода GPIO_Mode_AF_PP
Цитата:
ам же вроде на PD13 висит TIM4_CH2 и ничего переназначать не нужно
он назначен как альтернативная функция после ремапа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 20:41 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
перед работой с GPIO_InitStructure нужно вызвать GPIO_StructInit(&GPIO_InitStructure); для TIM_TimeBaseInitTypeDef и TIM_OCInitTypeDef есть похожие функции инициализации.
попробуйте задать тип выхода GPIO_Mode_AF_PP
Цитата:
ам же вроде на PD13 висит TIM4_CH2 и ничего переназначать не нужно
он назначен как альтернативная функция после ремапа.


А можете пример накидать? а то я совсем запутался :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 21:03 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
перед работой с GPIO_InitStructure нужно вызвать GPIO_StructInit(&GPIO_InitStructure); для TIM_TimeBaseInitTypeDef и TIM_OCInitTypeDef есть похожие функции инициализации.
попробуйте задать тип выхода GPIO_Mode_AF_PP
Цитата:
ам же вроде на PD13 висит TIM4_CH2 и ничего переназначать не нужно
он назначен как альтернативная функция после ремапа.


GPIO_Mode_AF_PP на это ругается, есть только GPIO_Mode_AF :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 21:08 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
какая у вас версия библиотеки ?
у меня - V3.5.0, и у меня нет GPIO_PinAFConfig


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 22:33 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
какая у вас версия библиотеки ?
у меня - V3.5.0, и у меня нет GPIO_PinAFConfig


Август 2011, странно, если они говорят что все стандартизованно, то почему плывут объявление параметров?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 22:35 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
какая у вас версия библиотеки ?
у меня - V3.5.0, и у меня нет GPIO_PinAFConfig


Август 2011, странно, если они говорят что все стандартизованно, то почему плывут объявление параметров?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 22:55 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 14 июл 2011, 01:36
Сообщения: 72
Откуда: Москва
andrikus писал(а):
md5sum писал(а):
Отсутствует вызов GPIO_PinAFConfig. Желателно до GPIO_Init.


как я понял это для переназначения выводов? там же вроде на PD13 висит TIM4_CH2 и ничего переназначать не нужно, хотя перед инициализацией портов написал
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
тоже не помогло :(

Все работает!
Вставил Ваш код и проверил... перейдем к разбору полетов:
Код:
TIM_BaseConfig.TIM_Prescaler = (SystemCoreClock / 10000) - 1;
TIM_BaseConfig.TIM_Period = 9999;

Первой строкой Вы делите частоту таймера на 10000, получили 8.4кГц, далее во второй строке
указали период 10000, в итоге светодиодик мигает с частотой 0.84Гц

Поставил TIM_BaseConfig.TIM_Prescaler = 0 и получил шим с частотой 120 микросекунд :)

2 andrikus Вы говорите про библиотеку для STM32F1xx а мы про STM32F4xx_DSP_StdPeriph_Lib


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 23:21 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
md5sum писал(а):
andrikus писал(а):
md5sum писал(а):
Отсутствует вызов GPIO_PinAFConfig. Желателно до GPIO_Init.


как я понял это для переназначения выводов? там же вроде на PD13 висит TIM4_CH2 и ничего переназначать не нужно, хотя перед инициализацией портов написал
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
тоже не помогло :(

Все работает!
Вставил Ваш код и проверил... перейдем к разбору полетов:
Код:
TIM_BaseConfig.TIM_Prescaler = (SystemCoreClock / 10000) - 1;
TIM_BaseConfig.TIM_Period = 9999;

Первой строкой Вы делите частоту таймера на 10000, получили 8.4кГц, далее во второй строке
указали период 10000, в итоге светодиодик мигает с частотой 0.84Гц

Поставил TIM_BaseConfig.TIM_Prescaler = 0 и получил шим с частотой 120 микросекунд :)

2 andrikus Вы говорите про библиотеку для STM32F1xx а мы про STM32F4xx_DSP_StdPeriph_Lib



Заработало!! Ступил, думал при дебагинге автоматом ребилд проекта происходит, оказывается нет. Я про библиотеку для которая с дискавери идет для f4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 апр 2012, 23:28 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 14 июл 2011, 01:36
Сообщения: 72
Откуда: Москва
andrikus писал(а):
Я про библиотеку для которая с дискавери идет для f4

Sorry ошибся... это послание (про библиотеку) для reptile


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 12 апр 2012, 01:42 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
>>Sorry ошибся... это послание (про библиотеку) для reptile

понял. Пока работаю с STM32F1xx


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 май 2012, 01:29 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 10 фев 2012, 16:40
Сообщения: 197
Откуда: Украина г.Кировоград
Вопрос следующий !
Хочу подкинуть для таймера работу DMA. Хочу генерить ШИМ независимо по двум каналам без прерываний с постоянно загружающимся массивом _К1_[..].
Фрагмент кода.
/* DMA1 channel2 configuration ----------------------------------------------*/
/*ONLY for CODE TRANSACTION*/
DMA_DeInit(DMA1_Channel2);

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&TIM2->CCR1;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)_K1_; //32 bit
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 1000; //start value
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // read from continious address
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //write to different
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //2 bytes
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //2 bytes
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);

//---------------------------------------------------------------------------------------
DMA_DeInit(DMA1_Channel7);

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&TIM2->CCR2;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)_K1_; //32 bit
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 1000; //start value
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // read from continious address
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //write to different
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //2 bytes
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //2 bytes
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel7, &DMA_InitStructure);

DMA_Cmd(DMA1_Channel2, ENABLE);
DMA_Cmd(DMA1_Channel7, ENABLE);


Перепробовал много вариантов, запускается только канал DMA1_Channel2, а DMA1_Channel7 ни в какую.((
Если использовать два разных таймера - работает на ура!
Эту тему реально осуществить или тут ограничения есть по работе с DMA? Мож я фигней страдаю..
Как наладить передачу даных в регистры CCR1, CCR2 из одного массива _K1_?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 11 май 2012, 05:56 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4921
Откуда: Усинск, республика Коми
Осуществить реально. ОДин таймер. Отсчитывает контрольные тики, по которым растут счетчики. При достижении счетчиками нужных значений происходит смена состояния на ноге контроллера.
Подробнее с примерами можно посмотреть, если нагуглить "Аппаратный шим" ;)

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: первый бой с ШИМ
СообщениеДобавлено: 13 май 2012, 22:42 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 10 фев 2012, 16:40
Сообщения: 197
Откуда: Украина г.Кировоград
BigLeha писал(а):
Осуществить реально. ОДин таймер. Отсчитывает контрольные тики, по которым растут счетчики. При достижении счетчиками нужных значений происходит смена состояния на ноге контроллера.
Подробнее с примерами можно посмотреть, если нагуглить "Аппаратный шим" ;)


Да, разобрался. Для генерации с помощью TIM8 и комплиментарного к основному каналу нужно такую настройку сделать

/*Structure NAME*///-------------------------------------------------------------
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
DMA_InitTypeDef DMA_InitStructure;

/* Enable peripheral clocks ------------------------------------------------*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
/*Enable TIM2 clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
/* DMA clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

/* DMA1 channel2 configuration ----------------------------------------------*/
/*ONLY for CODE TRANSACTION*/
/*Working for TIM1_CC1 mode*/
DMA_DeInit(DMA2_Channel3);

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&TIM8->CCR1; //8 bit
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)_K1_; //32 bit
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 100; //start value
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // read from continious address from
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //write t
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //2 bytes
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //2 bytes
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);

// DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE); //TCIE bit enable interrupt
//---------------------------------------------------------------------------------------

/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = PRESC_VALUE;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = ARR_VALUE;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

/* Channel 1, Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = ARR_VALUE/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM8, ENABLE);
/* Main Output Enable */
TIM_CtrlPWMOutputs(TIM8, ENABLE);

TIM_DMACmd(TIM8, TIM_DMA_CC1, ENABLE);

/*TIM1 ---complementary CH1-PA7*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*TIM1 ---CH1-PC6*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);


После этого будет оппозитная генерация (2 канала) с помощью DMA и никаких прерываний.
Массив _K1_ с данными размером 100 значений будут постоянно грузиться, циклически.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB