Question
PWM with Buzzer
Posted on May 16, 2012 at 10:45
Salut a tous,
SVP quelqu'un peut m'aider, j'ai créer un application sur PWM de stm32f100rb pour générer une tonalité sur un buzzer, mais je sais pas comment générer les notes Do,Ré,Mi ... svp quelqu'un peut me donner une conseille : Code :
//#include ''stm32f10x.h''
//#include ''stm32f10x_gpio.h''
//#include ''stm32f10x_rcc.h''
#include ''stm32f10x_tim.h''
//Formule PWM
//tH : temps au niveau haut
//tB : temps au niveau bas
//T : tH + tB = période
//tH/T = rapport cyclique d'impulsion
void
PWM(
void
) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
//APB2PeriphClockCmd
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//APB1PeriphClockCmd
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
//LED's
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//Alt Function Push Pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
//TIM3_CH3 vers GPIOC.Pin8, TIM3_CH4 vers GPIOC.Pin9 (voir datasheet)
//Laisser la freque. de PWM = 100Hz.
//Laisser la période = 1000. Par conséquent, la minuterie fonctionne à partir de zéro à 1000, pour donner la résolution 0.1Hz.
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV4;
TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1;
//0..999
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_Pulse = 0;
// 0 .. 1000 (0=Off, 1000=On) exemple 500 = 3.3v/2...
TIM_OC2Init(TIM3, &TIM_OCInitStruct);
// Channel 2 PC7 BUZZZZZZ
TIM_OC3Init(TIM3, &TIM_OCInitStruct);
// Channel 3 Blue LED
TIM_OC4Init(TIM3, &TIM_OCInitStruct);
// Channel 4 Green LED
TIM_Cmd(TIM3, ENABLE);
}
int
variation(
int
brightness) {
PWM();
int
i;
// if (brightness == 0 || brightness > 1000) {
// brightness = 1;
// }
while
(1) {
brightness++;
//TIM3->CCR2 = 100;
TIM3->CCR3 = brightness;
TIM3->CCR4 = brightness;
for
(i = 0; i < 9000; i++)
;
if
(brightness == 1000) {
//TIM3->CCR2 = 100;
brightness = 0;
}
}
}
#pwm-adnen