OpenEdv-开源电子网

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

stm32中TIM1编码器输入与PWM波输出

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-23
在线时间
0 小时
发表于 2014-6-23 20:22:30 | 显示全部楼层 |阅读模式
5金钱
用stm32芯片控制两个带编码器的步进电机,现在是TIM1的通道1和2做右电机的编码器输入而通道3和4做左电机的控制输出。请问该怎么设置 TIM1让它在接收右电机编码器的信号时还能对左电机进行调速控制。现在遇到的问题时当不设置TIM1的编码器模式只设置PWM输出时,对左电机可以正常控制和调速。但当TIM1的编码器模式和PWM输出模式同时开启时,电机不受TIM1控制,电机向一个方向最高速运行,改变TIM1通道3和通道4都没用。请各位大侠帮忙想想办法,怎么样才能使TIM1正常工作。下面是我的TIM1的初始化程序。 
void Time1_Configuration(void) 
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;             //TIM输出比较结构体定义     设置通道3和通道4
TIM_ICInitTypeDef TIM_ICInitStructure;                //TIM输入比较结构体定义     设置通道1和通道2   可是我的程序里面没有专门的通道设置 是填入的默认值 


  TIM_TimeBaseStructure.TIM_Period = (SYSCLK_FREQ/3)/MOTOR_DRIVER_FREQ-1;    //这一部分是编码器和PWM波共用的部分       是对应PWM波输出设置的 
  TIM_TimeBaseStructure.TIM_Prescaler = 3-1;                                                                  //PWM输出频率最大为72M-9=8M
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                          //不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                             //向上计数
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                                                        //初始化TIMx的时基单元
//对通道3的PWM波输出设置
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;                                         //被动输出模式    强制输出低电平   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                             //输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                          //互补失能
  TIM_OCInitStructure.TIM_Pulse = 50;                                                                           //占空比设置
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                     //高电平有效
//高级定时器部分初始化设置
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;      
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;


  TIM_OC3Init(TIM1, &TIM_OCInitStructure);                                                                 //初始化TIM1的3通道
  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);                                              //使能TIM1在CCR3上的预装载寄存器
//通道4设置 基本与通道3一样
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  TIM_OCInitStructure.TIM_Pulse = 50;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM1, ENABLE);                 // 使能TIM1在ARR上的预装载寄存器
///////////////////////////////////////编码器设置部分
TIM_DeInit(TIM1);                                              //将外设TIMx寄存器重设为缺省值
TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);    //编码器模式3在AB两相的上下沿都计数

 TIM_ICStructInit(&TIM_ICInitStructure);          //让每个TIM_ICInitStruct成员设为默认值     个人认为这里是问题的关键  这里可能把TIM1的通道3和4也默认设置了导致PWM波不能输出     
  TIM_ICInitStructure.TIM_ICFilter = 6;            //输入滤波器 
  TIM_ICInit(TIM1, &TIM_ICInitStructure);        //初始化TIM1的外设
                         
TIM_ClearFlag(TIM1, TIM_FLAG_Update);         //清除TIMx的待处理标志位
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);  //开启定时器中断
 //Reset counter
TIM_SetCounter(TIM1, 0);                      //设置计数值为0


  TIM_Cmd(TIM1, ENABLE);                    //TIM1开启

TIM_CtrlPWMOutputs(TIM1, ENABLE);     //使能外围输出       关闭后会使PWM没有输出
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序的其他部分没有写,这是出问题的部分。主要是用到了定时器的溢出中断和比较中断。
那位大侠帮我解决问题,小弟感激不尽。好人一生平安!

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

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-23
在线时间
0 小时
 楼主| 发表于 2014-6-23 22:25:36 | 显示全部楼层
原子哥,你看这个可不可以实现?不可以的话我就准重画板子了,这是我做电脑鼠的第3块板子了。前一次的那个板子是定时器通道3和4不能做编码器输入,想不到改好了后又出现了这个问题,看来要做第4块板子了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-23 22:26:23 | 显示全部楼层
用2个定时器吧,何必这么省呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2013-4-15
在线时间
0 小时
发表于 2014-6-24 10:08:45 | 显示全部楼层
我也正在弄编码器   查了一些资料 一个定时器不好处理
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-23
在线时间
0 小时
 楼主| 发表于 2014-6-24 11:20:55 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
画板子的时候忽视了,再次悲剧了。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-23
在线时间
0 小时
 楼主| 发表于 2014-6-24 11:22:03 | 显示全部楼层
回复【4楼】如意620:
---------------------------------
是啊,定时器还有很多东西要学,有好多东西都没写出来,遇到了才知道。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2013-4-15
在线时间
0 小时
发表于 2014-6-24 16:32:16 | 显示全部楼层
回复【6楼】qq314777895:
---------------------------------
恩  我用两个继电器来解决这个问题的  运行还能满足我的要求
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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