stm32 pwm 输出的对应通道(转载的网上一个无私的兄弟)
(1)定时器通道的管脚是定下的,不能随意改动.我现在用的是STM32f103c8,其它的查相应手册.
详细配置如下:TIM1_CH1->PA8; TIM1_CH2->PA9; TIM1_CH3->PA10; TIM1_CH4->PA11;
TIM2_CH1->PA0; TIM2_CH2->PA1; TIM2_CH3->PA2; TIM2_CH4->PA3;
TIM3_CH1->PA6; TIM3_CH2->PA7; TIM3_CH3->PB0; TIM3_CH4->PB1;
TIM4_CH1->PB6; TIM4_CH1->PB7; TIM4_CH1->PB8; TIM4_CH1->PB9;
(2)不是所有的芯片都有重映像功能的,STM32f103c8这四个定时器就不需要重映像.
(3)定时器输出需要设置向个模块:
1)相应时钟要使能,包括TIMx,GPIO(用到哪个可以开哪个,初学者也可以全开起,免得多事;
比如说:用TIM4
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
2)GPIO相应管脚模式设置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
3)定时器设置(下面的例子是产生4个通道的PWM)
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM4);
TIM_TimeBaseStructure.TIM_Period=144; //ARR的值
TIM_TimeBaseStructure.TIM_Prescaler=4000;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM4, ENABLE);//使能ARR预装载缓冲器
/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道无效
TIM_OCInitStructure.TIM_Pulse = 120; //占空时间
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补端的极性
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM4,&TIM_OCInitStructure); //通道1
TIM_OCInitStructure.TIM_Pulse = 80; //占空时间
TIM_OC2Init(TIM4,&TIM_OCInitStructure); //通道2
TIM_OCInitStructure.TIM_Pulse = 40; //占空时间
TIM_OC3Init(TIM4,&TIM_OCInitStructure); //通道3
TIM_OCInitStructure.TIM_Pulse = 20; //占空时间
TIM_OC4Init(TIM4,&TIM_OCInitStructure); //通道4
/* TIM1 counter enable */
TIM_Cmd(TIM4,ENABLE);
/* TIM1 Main Output Enable */
TIM_CtrlPWMOutputs(TIM4,ENABLE);
}