| Форум РадиоКот https://radiokot.ru/forum/ |
|
| STM32 Wave плеер. Проблемы с PWM. https://radiokot.ru/forum/viewtopic.php?f=59&t=107304 |
Страница 1 из 1 |
| Автор: | Vendict [ Пн сен 01, 2014 08:59:57 ] |
| Заголовок сообщения: | STM32 Wave плеер. Проблемы с PWM. |
Делаю на stm32 (именно на STM32F103C8) кассу для сына, одна из задач - научить кассу говорить. Взял вот этот готовый плеер: http://projectproto.blogspot.ru/2010/06 ... layer.html Поправил под библиотечку с карточкой, что заработала, в итоге в оригинальной конфигурации, ШИМ на PB7 - звук отлично играет. Вот тут и проблема, PB7 у меня изначально занят под I2C для экрана 16х02, попробовал сменить таймер на 1й и ногу на PA8. Получил в итоге шум, треск, скрежет. Вот в чем различия при инициализации ШИМ: Оригинальный код: СпойлерКод: TIM_OCInitTypeDef TIM_OCInitStructure; void PWM_init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM4 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE ); /* GPIOB Configuration:TIM4 Channel 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PB7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Time base configuration */ /* PWM frequency = 72MHz / [Period*(Prescaler+1)] */ TIM_TimeBaseStructure.TIM_Period = 350;//256;//360; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 128; //CCR2 Value; duty cycle = CCR/Period TIM_OC2Init(TIM4, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM4, ENABLE); /* TIM4 enable counter */ TIM_Cmd(TIM4, ENABLE); } void set_pwm_duty(unsigned char duty) { TIM_OCInitStructure.TIM_Pulse = duty; TIM_OC2Init(TIM4, &TIM_OCInitStructure); } void pwm_output_enable(bool on) { GPIO_InitTypeDef GPIO_InitStructure; if(on){ /* GPIOB Configuration:TIM4 Channel 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PB7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } else{ /* GPIOB7 as input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PB7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } } вот мой код: СпойлерЦитата: void PWM_init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM1 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE ); /* GPIOA Configuration:TIM1 Channel 1 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // PA8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Time base configuration */ /* PWM frequency = 72MHz / [Period*(Prescaler+1)] */ TIM_TimeBaseStructure.TIM_Period = 350;//256;//360; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 128; //CCR2 Value; duty cycle = CCR/Period TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); /* TIM4 enable counter */ TIM_Cmd(TIM1, ENABLE); } void set_pwm_duty(unsigned char duty) { TIM_OCInitStructure.TIM_Pulse = duty; TIM_OC2Init(TIM1, &TIM_OCInitStructure); } void pwm_output_enable(int on) { GPIO_InitTypeDef GPIO_InitStructure; if(1==on){ /* GPIOA Configuration:TIM4 Channel 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // PA8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } else{ /* GPIOA8 as input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // PB8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } } во втором случае без форматирования, отличия выделил жирным. Помогите, может неправильно таймер/ШИМ иницируется ? Может какие-то различия должны быть между 1м и 4м таймерами ? |
|
| Автор: | HHIMERA [ Пн сен 01, 2014 09:26:21 ] |
| Заголовок сообщения: | Re: STM32 Wave плеер. Проблемы с PWM. |
А не проще I2C ремапом на другие ноги переселить??? Там на PB8 PB9??? Там даже ДВА I2C... |
|
| Автор: | Vendict [ Пн сен 01, 2014 09:48:13 ] |
| Заголовок сообщения: | Re: STM32 Wave плеер. Проблемы с PWM. |
Тут тоже загвоздка. Второй I2C висит на PB10-PB11 , на которые я уже повесил клавиатуру... А это переписывать массив клавиш, не хочется. Всё-таки не должно быть таких глюков просто из-за смены таймера и ноги. UPD. Хотя PB8-PB9 вроде свободны, тогда ремапом. Но может будет ещё решение ? UPD.1 На соседнем форуме подсказали что тут ошибка: RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); но этого оказалось недостаточно. |
|
| Автор: | Vendict [ Пн сен 01, 2014 23:52:42 ] |
| Заголовок сообщения: | Re: STM32 Wave плеер. Проблемы с PWM. |
Вот мои ошибки: Цитата: TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); и не хватало строки Код: TIM_CtrlPWMOutputs(TIM1, ENABLE); Теперь всё заработало. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


