OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4835|回复: 6

定时器1通道1和通道4产生两路pwm控制两个电机,只有一个电机能转,一个电机转不了

[复制链接]

4

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-10-27
在线时间
3 小时
发表于 2016-1-23 13:43:07 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 kroosliu 于 2016-1-23 14:44 编辑

//初始化电机正反转IO口
void motor_io(void)
{
   GPIO_InitTypeDef GPIO_InitStruct;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB时钟
   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//推挽输出
   GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化PB12-PB15
   GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//PB12-PB15输出高   
}



void motor_pwm(u16 arr,u16 psc)
{
   GPIO_InitTypeDef GPIO_InitStruct;
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;

   motor_io();//初始化电机正反转IO口

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE);//使能定时器1和PA时钟
   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_11;
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//推挽输出
   GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化PA8,PA11

   //初始化定时器1   
   TIM_TimeBaseInitStruct.TIM_Period=arr;
   TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
   TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
   TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);

   //初始化定时器1的通道1为PWM模式1  
   TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
   TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
   TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
   TIM_OC1Init(TIM1,&TIM_OCInitStruct);
   //TIM1->CCMR1|=6<<4;         //CH1 PWM1模式  
   //TIM1->CCER|=1<<0;          //CH1输出使能

   //初始化定时器1的通道4为PWM模式1
   TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
   TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
   TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
   TIM_OC4Init(TIM1,&TIM_OCInitStruct);   


   //使能TIM1在CCR1和CCR4上的预装载寄存器
   TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
   TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);

   //使能定时器1外设的主输出
   TIM_CtrlPWMOutputs(TIM1,ENABLE);

   //使能自动重装载预装载寄存器
   TIM_ARRPreloadConfig(TIM1,ENABLE);

      //使能定时器1
   TIM_Cmd(TIM1,ENABLE);
}
通道1的电机转不了,通道4的电机可以转。
把初始化定时器1的通道1为PWM模式1的那几行库函数代码改成下面的两行寄存器代码,通道1的电机又可以转了。
请问这个程序哪里写错了?

程序原理图

程序原理图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-1-23 19:01:16 | 显示全部楼层
回复

使用道具 举报

4

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-10-27
在线时间
3 小时
 楼主| 发表于 2016-1-28 10:36:04 | 显示全部楼层
好奇怪啊,通道1和通道4的程序是一模一样的,通道1的电机转不了,通道4的电机可以转
回复

使用道具 举报

5

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2015-12-26
在线时间
54 小时
发表于 2016-1-28 14:10:19 | 显示全部楼层
/* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 999;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OC3Init(TIM3, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

  TIM_OC4Init(TIM3, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM3, ENABLE);

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);

同一个TIM,不通通道PWM设置。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-8-8
在线时间
2 小时
发表于 2016-8-8 16:28:20 | 显示全部楼层
解决了吗
回复

使用道具 举报

7

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2016-7-20
在线时间
36 小时
发表于 2016-8-8 18:32:59 | 显示全部楼层
zhangyimj007 发表于 2016-1-28 14:10
/* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 999;
  TIM_TimeBaseStructure.TI ...

通道一和通道四的pwm模式不一样吧,一个是选1.一个是选二
回复

使用道具 举报

国名坏叔叔 该用户已被删除
发表于 2016-10-17 15:11:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 02:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表