3340|6

1158

帖子

2

TA的资源

版主

楼主
 

TIM1的PWM动态输出 [复制链接]

     现在做了一个小项目,要动态输出不同占空比的PWM波形来驱动电机的不同转速,但是为什么设置好了之后,调用TIM_SetCompare进行修改占空比只有第一次是有效的,之后修改的值仿真上有改变的,但是实际中的电机却不改变,可能有什么原因呢?
此帖出自stm32/stm8论坛

最新回复

给你参考一下~一样的~ #include "bsp_pwm_output.h" /**   * @brief  配置TIM3复用输出PWM时用到的I/O   * @param  无   * @retval 无   */ static void TIM3_GPIO_Config(void) {   GPIO_InitTypeDef GPIO_InitStructure;         /* 设置TIM3CLK 为 72MHZ */   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   /* GPIOA and GPIOB clock enable */   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_Init(GPIOA, &GPIO_InitStructure);   /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;   GPIO_Init(GPIOB, &GPIO_InitStructure); } /**   * @brief  配置TIM3输出的PWM信号的模式,如周期、极性、占空比   * @param  无   * @retval 无   */ /* * TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT 重新计数 *                    TIMx_CCR(电平发生变化) * 信号周期=(TIMx_ARR +1 ) * 时钟周期 * 占空比=TIMx_CCR/(TIMx_ARR +1) */ static void TIM3_Mode_Config(void) {         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;         TIM_OCInitTypeDef  TIM_OCInitStructure;         /* PWM信号电平跳变值 */         u16 CCR1_Val = 500;                 u16 CCR2_Val = 375;         u16 CCR3_Val = 250;         u16 CCR4_Val = 125; /* -----------------------------------------------------------------------     TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR+1)* 100% = 50%     TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR+1)* 100% = 37.5%     TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR+1)* 100% = 25%     TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR+1)* 100% = 12.5%   ----------------------------------------------------------------------- */   /* Time base configuration */                    TIM_TimeBaseStructure.TIM_Period = 999;       //当定时器从0计数到999,即为1000次,为一个定时周期   TIM_TimeBaseStructure.TIM_Prescaler = 0;            //设置预分频:不预分频,即为72MHz   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频(这里用不到)   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);   /* PWM1 Mode configuration: Channel1 */   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;          TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平   TIM_OC1Init(TIM3, &TIM_OCInitStructure);         //使能通道1   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);   /* PWM1 Mode configuration: Channel2 */   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM   TIM_OC2Init(TIM3, &TIM_OCInitStructure);          //使能通道2   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);   /* PWM1 Mode configuration: Channel3 */   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   TIM_OCInitStructure.TIM_Pulse = CCR3_Val;        //设置通道3的电平跳变值,输出另外一个占空比的PWM   TIM_OC3Init(TIM3, &TIM_OCInitStructure);         //使能通道3   TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);   /* PWM1 Mode configuration: Channel4 */   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   TIM_OCInitStructure.TIM_Pulse = CCR4_Val;        //设置通道4的电平跳变值,输出另外一个占空比的PWM   TIM_OC4Init(TIM3, &TIM_OCInitStructure);        //使能通道4   TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);   TIM_ARRPreloadConfig(TIM3, ENABLE);                         // 使能TIM3重载寄存器ARR   /* TIM3 enable counter */   TIM_Cmd(TIM3, ENABLE);                   //使能定时器3        } /**   * @brief  TIM3 输出PWM信号初始化,只要调用这个函数   *         TIM3的四个通道就会有PWM信号输出   * @param  无   * @retval 无   */ void TIM3_PWM_Init(void) {         TIM3_GPIO_Config();         TIM3_Mode_Config();        }   详情 回复 发表于 2015-3-27 09:13
点赞 关注
 

回复
举报

940

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
是不是要先DISABLE定时器,再修改其值,再ENABLE?再看看datasheet或者参考手册
此帖出自stm32/stm8论坛

点评

好的,我试试看。谢谢你的回复了  详情 回复 发表于 2015-3-26 17:15
 
 

回复

1158

帖子

2

TA的资源

版主

板凳
 
wgsxsm 发表于 2015-3-26 17:07
是不是要先DISABLE定时器,再修改其值,再ENABLE?再看看datasheet或者参考手册

好的,我试试看。谢谢你的回复了
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
不需要disable,你不要锁定定时器,另外呢如果开启预装载需要在up里更新.
此帖出自stm32/stm8论坛

点评

具体是什么意思呢?我不是很明白你说的  详情 回复 发表于 2015-3-27 13:10
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

5
 
给你参考一下~一样的~
#include "bsp_pwm_output.h"

/**
  * @brief  配置TIM3复用输出PWM时用到的I/O
  * @param  无
  * @retval 无
  */
static void TIM3_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

        /* 设置TIM3CLK 为 72MHZ */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/**
  * @brief  配置TIM3输出的PWM信号的模式,如周期、极性、占空比
  * @param  无
  * @retval 无
  */
/*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT 重新计数
*                    TIMx_CCR(电平发生变化)
* 信号周期=(TIMx_ARR +1 ) * 时钟周期
* 占空比=TIMx_CCR/(TIMx_ARR +1)
*/
static void TIM3_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        /* PWM信号电平跳变值 */
        u16 CCR1_Val = 500;        
        u16 CCR2_Val = 375;
        u16 CCR3_Val = 250;
        u16 CCR4_Val = 125;

/* -----------------------------------------------------------------------
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR+1)* 100% = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR+1)* 100% = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR+1)* 100% = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR+1)* 100% = 12.5%
  ----------------------------------------------------------------------- */

  /* Time base configuration */                 
  TIM_TimeBaseStructure.TIM_Period = 999;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = 0;            //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频(这里用不到)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);         //使能通道1
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);          //使能通道2
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;        //设置通道3的电平跳变值,输出另外一个占空比的PWM
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);         //使能通道3
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;        //设置通道4的电平跳变值,输出另外一个占空比的PWM
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);        //使能通道4
  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM3, ENABLE);                         // 使能TIM3重载寄存器ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                   //使能定时器3       
}

/**
  * @brief  TIM3 输出PWM信号初始化,只要调用这个函数
  *         TIM3的四个通道就会有PWM信号输出
  * @param  无
  * @retval 无
  */
void TIM3_PWM_Init(void)
{
        TIM3_GPIO_Config();
        TIM3_Mode_Config();       
}
此帖出自stm32/stm8论坛

点评

好的,谢谢了,我试试看  详情 回复 发表于 2015-3-27 13:09
 
 
 

回复

1158

帖子

2

TA的资源

版主

6
 
13chfang 发表于 2015-3-27 09:13
给你参考一下~一样的~
#include "bsp_pwm_output.h"

/**
  * @brief  配置TIM3复用输出PWM时用到的I/O
  * @param  无
  * @retval 无
  */
static void TIM3_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

        /* 设置TIM3CLK 为 72MHZ */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/**
  * @brief  配置TIM3输出的PWM信号的模式,如周期、极性、占空比
  * @param  无
  * @retval 无
  */
/*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT 重新计数
*                    TIMx_CCR(电平发生变化)
* 信号周期=(TIMx_ARR +1 ) * 时钟周期
* 占空比=TIMx_CCR/(TIMx_ARR +1)
*/
static void TIM3_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        /* PWM信号电平跳变值 */
        u16 CCR1_Val = 500;        
        u16 CCR2_Val = 375;
        u16 CCR3_Val = 250;
        u16 CCR4_Val = 125;

/* -----------------------------------------------------------------------
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR+1)* 100% = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR+1)* 100% = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR+1)* 100% = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR+1)* 100% = 12.5%
  ----------------------------------------------------------------------- */

  /* Time base configuration */                 
  TIM_TimeBaseStructure.TIM_Period = 999;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = 0;            //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频(这里用不到)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);         //使能通道1
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);          //使能通道2
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;        //设置通道3的电平跳变值,输出另外一个占空比的PWM
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);         //使能通道3
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;        //设置通道4的电平跳变值,输出另外一个占空比的PWM
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);        //使能通道4
  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM3, ENABLE);                         // 使能TIM3重载寄存器ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                   //使能定时器3       
}

/**
  * @brief  TIM3 输出PWM信号初始化,只要调用这个函数
  *         TIM3的四个通道就会有PWM信号输出
  * @param  无
  * @retval 无
  */
void TIM3_PWM_Init(void)
{
        TIM3_GPIO_Config();
        TIM3_Mode_Config();       
}

好的,谢谢了,我试试看
此帖出自stm32/stm8论坛
 
 
 

回复

1158

帖子

2

TA的资源

版主

7
 
huo_hu 发表于 2015-3-27 09:08
不需要disable,你不要锁定定时器,另外呢如果开启预装载需要在up里更新.

具体是什么意思呢?我不是很明白你说的
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表