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);

}

posted @ 2016-09-12 09:22  MartinHO  阅读(9881)  评论(0编辑  收藏  举报