TIM1为何没有PWM----PA8,PA9,PA10没有输出

2020-01-01 17:42发布


void NVIC_Configuration(void)
{

#ifdef  VECT_TAB_RAM
  // Set the Vector Table base location at 0x20000000 /
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  // VECT_TAB_FLASH  /
  // Set the Vector Table base location at 0x08000000 /
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

    NVIC_InitTypeDef NVIC_InitStructure;
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    ////////////////////////////////2017.1.2添加TIME1中断使能///////////////////////
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;       //  TIME1中断使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);  
    ////////////////////////////////2017.1.2添加TIME1中断使能///////////////////////
   
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;       //  TIME3中断使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
            
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     //  UART2中断配置使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);  
   
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;       //  TIME2中断使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
}


void TIM1_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        /* TIM2 clock enable */
        //PCLK1经过2倍频后作为TIM1的时钟源等于72MHz
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                                                 //使能TIM2时钟
        /* GPIOA and GPIOB clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);        //使能重映射后的GPIO口的时钟和重映射时钟
        /*GPIOA Configuration: TIM1 channel 1 and 2 as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10  ;   // PA8/9----PWM输出   //PA.8/9口设置为TIM1的CH1N/CH2N输出口
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);                        //进行重映射
}

/********************************************************************************
* 函数名:TIM1_Mode_Config
* 描述  :配置TIM1输出的PWM信号的模式,如周期、极性、占空比
* 输入  :无
* 输出  :无
* 调用  :内部调用
********************************************************************************/
void TIM1_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        //TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
         TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
        /* Time base configuration */                 
        TIM_TimeBaseStructure.TIM_Period = 8000;                               //当定时器从0计数到999,即为1000次,为一个定时周期
        TIM_TimeBaseStructure.TIM_Prescaler = 0;                                            //设置预分频:不预分频,即为72MHz 原0
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4 ;                //设置时钟分频系数:不分频
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //向上计数模式
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//循环计数次数(只是TIM1,8有)
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
         
        //TIM_ARRPreloadConfig(TIM1, ENABLE);   //启用ARR的影子寄存器(直到产生更新事件才更改设置) 2016.5.18添加

        
        /* PWM1 Mode configuration: Channel1 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                            //配置为PWM模式2
       //选择定时器模式:TIM脉冲宽度调制模式2(极性控制)
//   TIM3->CCMR1|=3<<5;//110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;
//   TIM3->CCMR1|=7<<12;//111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道2为无效电平,否则为有效电平
       
       
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 120;                                        //设置通道1的电平跳变值,输出另外一个占空比的PWM
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 2016.5.18添加
        
        /* PWM1 Mode configuration: Channel1 */
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                 //使能通道1
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
       
        /*PWM1 Mode configuration: Channel2*/                                        //设置通道2的电平跳变值,输出另外一个占空比的PWM
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                //使能通道2
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
        
        /*PWM1 Mode configuration: Channel3*/                                        //设置通道3的电平跳变值,输出另外一个占空比的PWM
        TIM_OC3Init(TIM1, &TIM_OCInitStructure);                                //使能通道3
        TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
      
      /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  TIM_BDTRInitStructure.TIM_DeadTime = 5;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
  TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

        TIM_ARRPreloadConfig(TIM1, ENABLE);                                         // 使能TIM1重载寄存器ARR
        //TIM1_OC通道输出PWM(一定要加)
        TIM_CtrlPWMOutputs(TIM1, ENABLE);  // 2016.5.18添加
        /* TIM1 enable counter */
        TIM_Cmd(TIM1, ENABLE);          //使能TIMx外设
        

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
705060359
1楼-- · 2020-01-01 18:49
20061002838
2楼-- · 2020-01-01 18:52
没有使能捕获比较通道,CCER寄存器,TIM_CCxCmd 函数
zhcj66
3楼-- · 2020-01-01 22:24
  1. void TIM8_PWM_Init(unsigned short arr,unsigned short psc)
  2. {  
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  6. //        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  7.        
  8. {
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟使能
  11.        
  12.         //PC6-CH1
  13.         //PC7-CH2
  14.         //PC8-CH3
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;//初始化GPIO
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                  //复用推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  19.                
  20.         TIM_TimeBaseStructure.TIM_Period = arr;                                                                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  21.         TIM_TimeBaseStructure.TIM_Prescaler =psc;                                                                 //设置用来作为TIMx时钟频率除数的预分频值  72MHz/(psc+1)/(arr+1)=频率
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                 //设置时钟分割:TDTS = Tck_tim
  23.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                          //TIM向上计数模式
  24.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);                                                 //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  25.          
  26.         {//CH1
  27.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  28.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  29.                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  30.                 TIM_OCInitStructure.TIM_Pulse = arr+1;                                                                         //设置待装入捕获比较寄存器的脉冲值
  31.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  32.                 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  33.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  34.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  35.                 TIM_OC1Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  36.                
  37.                 TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  38.         }
  39.         {//CH2
  40.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  41.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  42.                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  43.                 TIM_OCInitStructure.TIM_Pulse = arr+1;                                                                         //设置待装入捕获比较寄存器的脉冲值
  44.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  45.                 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  46.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  47.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  48.                 TIM_OC2Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  49.                
  50.                 TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  51.         }
  52.         {//CH3
  53.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  54.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  55.                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  56.                 TIM_OCInitStructure.TIM_Pulse = arr+1;                                                                         //设置待装入捕获比较寄存器的脉冲值
  57.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  58.                 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  59.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  60.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  61.                 TIM_OC3Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  62.                
  63.                 TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  64.         }
  65.         {//CH4
  66.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //选择定时器模式:TIM脉冲宽度调制模式1
  67.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能/失能OCx管脚
  68.                 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                 //使能/失能OCxN管脚(使用OCxN必须使能TIM_OutputState)
  69.                 TIM_OCInitStructure.TIM_Pulse = arr+1;                                                                         //设置待装入捕获比较寄存器的脉冲值
  70.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                 //输出极性:TIM输出比较极性高
  71.                 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                                //输出极性
  72.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                                //BDTR寄存器的MOE为0时对应管脚状态
  73.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;                        //BDTR寄存器的MOE为0时对应管脚状态
  74.                 TIM_OC4Init(TIM8, &TIM_OCInitStructure);                                                                  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  75.                
  76.                 TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);                                                  //使能TIMx在CCR2上的预装载寄存器
  77.         }
  78.        
  79.         TIM_ARRPreloadConfig(TIM8, ENABLE);                                                                         //使能TIMx在ARR上的预装载寄存器

  80.         TIM_CtrlPWMOutputs(TIM8, ENABLE);                                                                                //TIM8->BDTR|=1<<15; 主输出MOE
  81.        
  82.         TIM_Cmd(TIM8, ENABLE);                                                                                                  //使能TIMx外设
  83. //        TIM_SetCompare2(TIM8,30);                                                                                                //TIM8->CCR2 = 30;更改占空比(设置范围0~arr)
  84.        
  85.         RadiatingFanPwm = 100;
  86.         CodingInPWM = 0;
  87.         KnifeBitPWM = 0;
  88.         PressBoardPWM = 0;
  89.         RollCodingInACounter = 0;
  90. }
  91. }
复制代码
调用TIM8_PWM_Init(100-1,72-1);
然后
是对应PWM为设置值
TIM8->CCR1
TIM8->CCR2
TIM8->CCR3
TIM8->CCR4
这样TIM8就可以输出pwm信号了
yinye_jun
4楼-- · 2020-01-01 23:45
zhcj66 发表于 2017-1-8 16:54
调用TIM8_PWM_Init(100-1,72-1);
然后
是对应PWM为设置值

还是没有输出 能不能留联系方式 单独请教您!

一周热门 更多>