你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f301使用tim15产生PWM输出无反应,求解

[复制链接]
轩宝 提问时间:2017-9-6 14:50 /
源代码如下:
/**
  * @brief  ÅäÖÃTIM15¸´ÓÃÊä³öPWMʱÓõ½µÄI/O
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void TIM15_GPIO_Config(void)
{
                /*¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå*/
                GPIO_InitTypeDef GPIO_InitStructure;

                /*¿ªÆôµç»úÏà¹ØµÄGPIOÍâÉèʱÖÓ*/
                RCC_AHBPeriphClockCmd(MOTOR_TIM_GPIOA_CLK, ENABLE);

                GPIO_PinAFConfig(MOTOR_P_GPIO_PORT,MOTOR_P_PINSOURCE,MOTOR_P_AF);
                GPIO_PinAFConfig(MOTOR_N_GPIO_PORT,MOTOR_N_PINSOURCE,MOTOR_N_AF);
       
                /*µç»úÕý¼«*/                                                                                                                          
                GPIO_InitStructure.GPIO_Pin = MOTOR_P_PIN;       
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(MOTOR_P_GPIO_PORT, &GPIO_InitStructure);
               
               
    /*µç»ú¸º¼«*/                                                                                                                          
                GPIO_InitStructure.GPIO_Pin = MOTOR_N_PIN;       
    GPIO_Init(MOTOR_N_GPIO_PORT, &GPIO_InitStructure);       
//                GPIO_InitStructure.GPIO_Pin = MOTOR_N_PIN;       
//                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
//    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//                GPIO_Init(MOTOR_N_GPIO_PORT, &GPIO_InitStructure);
                GPIO_SetBits(MOTOR_P_GPIO_PORT,MOTOR_P_PIN);       
                GPIO_ResetBits(MOTOR_N_GPIO_PORT,MOTOR_N_PIN);               


                   
}



/**
  * @brief  ÅäÖÃMOTOR_TIMxÊä³öµÄPWMÐźŵÄģʽ£¬ÈçÖÜÆÚ¡¢¼«ÐÔ
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void TIM15_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;


        // ¿ªÆôTIMx_CLK,x[2,3,4,5]
  MOTOR_TIM_APBxClock_FUN(MOTOR_TIM_CLK, ENABLE);
       
  /* ÀÛ¼Æ TIM_Period¸öºó²úÉúÒ»¸ö¸üлòÕßÖжÏ*/                 
  TIM_TimeBaseStructure.TIM_Period = 256-1;       //µ±¶¨Ê±Æ÷´Ó0¼ÆÊýµ½255£¬¼´Îª256´Î£¬ÎªÒ»¸ö¶¨Ê±ÖÜÆÚ
       
        //¶¨Ê±Æ÷ʱÖÓÔ´TIMxCLK = 2 * PCLK1  
  //                                PCLK1 = HCLK / 4
  //                                => TIMxCLK = HCLK / 2 = SystemCoreClock /2
        // ¶¨Ê±Æ÷ƵÂÊΪ = TIMxCLK/(TIM_Prescaler+1) = (SystemCoreClock /2)/((SystemCoreClock/2)/1000000)*30 = 1000000/30 = 1/30MHz

        /*»ù±¾¶¨Ê±Æ÷ÅäÖÃTIM_Prescaler¸ù¾ÝЧ¹ûÀ´ÉèÖü´¿É£¬ÖжÏÖÜÆÚС µÆÉÁ˸¿ì£¬´óÔòÉÁ˸»ºÂý*/
        TIM_TimeBaseStructure.TIM_Prescaler = 1000;//((SystemCoreClock/2)/1000000)*30-1;            
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2 ;                 //ÉèÖÃʱÖÓ·ÖƵϵÊý£º²»·ÖƵ(ÕâÀïÓò»µ½)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //ÏòÉϼÆÊýģʽ
         
        // ³õʼ»¯¶¨Ê±Æ÷TIMx, x[2,3,4,5]
        TIM_TimeBaseInit(MOTOR_TIM, &TIM_TimeBaseStructure);       
       
       
        /*PWMģʽÅäÖÃ*/
        /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                            //ÅäÖÃΪPWMģʽ1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //ʹÄÜÊä³ö
  TIM_OCInitStructure.TIM_Pulse = 100;                                                                                                                          //ÉèÖóõʼPWMÂö³å¿í¶ÈΪ0       
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;            //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR_ValʱΪµÍµçƽ
  //ʹÄÜͨµÀ  
  MOTOR_P_TIM_OCxInit(MOTOR_TIM, &TIM_OCInitStructure);                                                                
        /*ʹÄÜͨµÀÖØÔØ*/
        MOTOR_P_TIM_OCxPreloadConfig(MOTOR_TIM, TIM_OCPreload_Enable);
       
       
        /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                            //ÅäÖÃΪPWMģʽ1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //ʹÄÜÊä³ö
  TIM_OCInitStructure.TIM_Pulse = 100;                                                                                                                          //ÉèÖóõʼPWMÂö³å¿í¶ÈΪ0       
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;            //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR_ValʱΪµÍµçƽ
  //ʹÄÜͨµÀ  
  MOTOR_N_TIM_OCxInit(MOTOR_TIM, &TIM_OCInitStructure);                                                                
        /*ʹÄÜͨµÀÖØÔØ*/
        MOTOR_N_TIM_OCxPreloadConfig(MOTOR_TIM, TIM_OCPreload_Enable);
       
        TIM_ARRPreloadConfig(MOTOR_TIM, ENABLE);                        //ʹÄÜTIMÖØÔؼĴæÆ÷ARR
       
        // ʹÄܼÆÊýÆ÷
        TIM_Cmd(MOTOR_TIM, ENABLE);                                                                                                                                               
}



/********************¶¨Ê±Æ÷ͨµÀ**************************/

#define MOTOR_TIM                                                           TIM15
#define MOTOR_TIM_CLK                                                       RCC_APB2Periph_TIM15
#define MOTOR_TIM_APBxClock_FUN        RCC_APB2PeriphResetCmd

#define MOTOR_TIM_GPIOA_CLK             RCC_AHBPeriph_GPIOA


/************Õý¼«***************/

#define MOTOR_P_PIN                          GPIO_Pin_2                 
#define MOTOR_P_GPIO_PORT        GPIOA                     
#define MOTOR_P_PINSOURCE        GPIO_PinSource2
#define MOTOR_P_AF                        GPIO_AF_9

#define  MOTOR_P_TIM_OCxInit                       TIM_OC1Init            //ͨµÀ³õʼ»¯º¯Êý
#define  MOTOR_P_TIM_OCxPreloadConfig       TIM_OC1PreloadConfig //ͨµÀÖØÔØÅäÖú¯Êý

//ͨµÀ±È½Ï¼Ä´æÆ÷£¬ÒÔTIMx->CCRx·½Ê½¿É·ÃÎʸüĴæÆ÷£¬ÉèÖÃеıȽÏÖµ£¬¿ØÖÆÕ¼¿Õ±È
//ÒÔºê·â×°ºó£¬Ê¹ÓÃÕâÖÖÐÎʽ£ºMOTOR_TIMx->MOTOR_RED_CCRx £¬¿É·ÃÎʸÃͨµÀµÄ±È½Ï¼Ä´æÆ÷
#define  MOTOR_P_CCRx                               CCR1       

/************¸º¼«***************/
#define MOTOR_N_PIN                        GPIO_Pin_3                 
#define MOTOR_N_GPIO_PORT           GPIOA                     
#define MOTOR_N_PINSOURCE            GPIO_PinSource3
#define MOTOR_N_AF                            GPIO_AF_9

#define  MOTOR_N_TIM_OCxInit                      TIM_OC2Init            //ͨµÀ³õʼ»¯º¯Êý
#define  MOTOR_N_TIM_OCxPreloadConfig       TIM_OC2PreloadConfig //ͨµÀÖØÔØÅäÖú¯Êý

//ͨµÀ±È½Ï¼Ä´æÆ÷£¬ÒÔTIMx->CCRx·½Ê½¿É·ÃÎʸüĴæÆ÷£¬ÉèÖÃеıȽÏÖµ£¬¿ØÖÆÕ¼¿Õ±È
//ÒÔºê·â×°ºó£¬Ê¹ÓÃÕâÖÖÐÎʽ£ºMOTOR_TIMx->MOTOR_GREEN_CCRx £¬¿É·ÃÎʸÃͨµÀµÄ±È½Ï¼Ä´æÆ÷
#define  MOTOR_N_CCRx                       CCR2


配置参数检查多次,没有发现有问题,求大哥大姐们看看问题出在哪里,谢谢了




收藏 2 评论2 发布时间:2017-9-6 14:50

举报

2个回答
努力的人 回答时间:2018-1-24 10:54:43
把这两句删了,试一下
GPIO_SetBits(MOTOR_P_GPIO_PORT,MOTOR_P_PIN);        
GPIO_ResetBits(MOTOR_N_GPIO_PORT,MOTOR_N_PIN);

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

xmshao 回答时间:2018-1-24 12:09:44
时钟配置、管脚复用配置,好好检查下。整体上配置不复杂。
TIM15 只支持通道1/2.

你可以使用STM32CUBEMX配置测试下。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版