OpenEdv-开源电子网

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

怎样用输出脉冲个数和频率可调的方波用来驱动步进电机

[复制链接]

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
发表于 2014-7-7 10:34:47 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 亲亻尔嘴 于 2020-5-8 10:24 编辑

我现在的思路是:使用两个定时器TIM2和TIM3用STM32定时器的主从模式。
手册上说可以使用一个定时器使能另一个定时器,但是怎样关闭从定时器?
可不可以在主定时器使能了从定时器时,主定时器开始计时,到达想要关闭从定时器的时间时,触发中断在中断服务程序中清从定时器的CEN位。
有没有更好的办法??








目前的解决方案 请移步到49楼我上传的   ST官方的步进电机驱动库,里面使用了梯形加速算法,加速度和脉冲个数均可调

最佳答案

查看完整内容[请看2#楼]

回复【6楼】亲亻尔嘴: --------------------------------- 你这个方法是比较简单的了. 复杂就是我前面说的门控模式. 另外,貌似用高级定时器有个重复计数器(RTR?),利用那个家伙,应该也可以很好的实现脉冲个数控制.
在你没有做出成绩之前,这个世界不会在乎你的自尊。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-7 10:34:48 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
你这个方法是比较简单的了.
复杂就是我前面说的门控模式.
另外,貌似用高级定时器有个重复计数器(RTR?),利用那个家伙,应该也可以很好的实现脉冲个数控制.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2014-7-7 10:36:42 | 显示全部楼层
还有一个问题就是 实现一个功能时在手册上知道需要配置哪些寄存器,但是不知道该找哪个库函数···   很蛋疼···
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-7 12:47:50 | 显示全部楼层
门控模式比较复杂,简单一点的,就用定时器的溢出中断进行脉冲个数计数。坏处就是要频繁中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2014-7-7 13:57:11 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
关键是 系统中已经不允许用很频繁的中断了  所以才想起来用门控模式的 但是看手册看的晕呼呼的····
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-7 17:48:48 | 显示全部楼层
回复【4楼】亲亻尔嘴:
---------------------------------
门控模式比较麻烦,好好研究下定时器吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2014-7-8 15:51:19 | 显示全部楼层
 回复【5楼】 正点原子 :
---------------------------------
[mw_shl_code=c,true]/**************************** **TIM2的通道1使用单脉冲模式 **TIM3使用门控模式用来输出PWM ** ****************************/ //TIM2per:重装值 //Compare1:比较捕获1的预装载值 void Motor_Init(u16 TIM2per, u16 TIM3per, u16 TIM3Compare1) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; GPIO_InitTypeDef GPIO_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能定时器2的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用IO时钟 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6;//PA0 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); //TIM2工作在单脉冲下 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//没有时钟分割 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseInitStruct.TIM_Prescaler = 7200;//预分频值,每100us计数一次 TIM_TimeBaseInitStruct.TIM_Period = TIM2per;//重装值 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止 TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器 TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高 TIM_OCInitStruct.TIM_Pulse = 1;//比较捕获1的预装载值 TIM_OC1Init(TIM2,&TIM_OCInitStruct); TIM_Cmd(TIM2,DISABLE);//先不使能能TIM2 //TIM3工作在从模式的门控模式下的PWM输出模式 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//没有时钟分割 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseInitStruct.TIM_Prescaler = 720;//预分频值,10us计数一次 TIM_TimeBaseInitStruct.TIM_Period = TIM3per;//重装值 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式 TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式 TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部触发,从TIM2触发 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高 TIM_OCInitStruct.TIM_Pulse = TIM3Compare1;//比较捕获1的预装载值 TIM_OC1Init(TIM3,&TIM_OCInitStruct); TIM_Cmd(TIM3,ENABLE);//使能TIM3 } //设置PWM的输出 //Cycle:为周期,单位(us) //Pulse_Num:为脉冲个数(小于3200) void TIM2_TIM3_PWM(u16 Cycle, u16 Pulse_Num) { u16 TIM3per = 0; u32 Time = 0; //改变TIM3的重装值改变脉冲频率这里设置脉冲占空比为50% //改变TIM2的预分频器和重装值改变脉冲个数 Time = Cycle * Pulse_Num; Time /= 100; //预分频为7200,100us计数一次 TIM3per = Cycle/10; //预分频为720,10us计数一次 TIM_SetAutoreload(TIM2, Time+1);//设置TIM2的重装值 TIM_SetAutoreload(TIM3, TIM3per-1);//设置TIM3的重装值 TIM_SetCompare1(TIM3,TIM3per/2);//设置占空比为50% TIM_Cmd(TIM2,ENABLE);//使能TIM2 } [/mw_shl_code]


这样实现了脉冲个数可控的PWM输出,要是实现电机的加速和减速就需要频繁修改PWM的频率,原子大哥,有没有什么比较好的思路去修改频率???
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-18 17:00:56 | 显示全部楼层
我怎么把从定时器TIM3换成TIM1就不行了呢? 

void Motor_Init(u16 TIM2per, u16 TIM3per, u16 TIM3Compare1) 



  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; 

  TIM_OCInitTypeDef TIM_OCInitStruct; 

  GPIO_InitTypeDef GPIO_InitStruct; 

    

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能定时器2的时钟 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能定时器3的时钟 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用IO时钟 

    

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;//PA0 

  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 

  GPIO_Init(GPIOA,&GPIO_InitStruct); 

    

  //TIM2工作在单脉冲下 

  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//没有时钟分割 

  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 

  TIM_TimeBaseInitStruct.TIM_Prescaler = 7200;//预分频值,每100us计数一次 

  TIM_TimeBaseInitStruct.TIM_Period = TIM2per;//重装值 

  TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); 

    

  TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止 

  TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器 

  TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); 

    

  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平 

  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能 

  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高 

  TIM_OCInitStruct.TIM_Pulse = 1;//比较捕获1的预装载值 

  TIM_OC1Init(TIM2,&TIM_OCInitStruct); 

    

  TIM_Cmd(TIM2,DISABLE);//先不使能能TIM2 

    

    

  //TIM3工作在从模式的门控模式下的PWM输出模式 

  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//没有时钟分割 

  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 

  TIM_TimeBaseInitStruct.TIM_Prescaler = 720;//预分频值,10us计数一次 

  TIM_TimeBaseInitStruct.TIM_Period = TIM3per;//重装值 

  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct); 

    

  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//TIM3为门控模式 

  TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式 

  TIM_SelectInputTrigger(TIM1,TIM_TS_ITR1);//内部触发,从TIM2触发 

    

  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平 
  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能 
  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高 
  TIM_OCInitStruct.TIM_Pulse = TIM3Compare1;//比较捕获1的预装载值 
  TIM_OC1Init(TIM1,&TIM_OCInitStruct); 
  

  TIM_Cmd(TIM1,ENABLE);//使能TIM3 



  

//设置PWM的输出 

//Cycle:为周期,单位(us) 

//Pulse_Num:为脉冲个数(小于3200) 

void TIM2_TIM3_PWM(u16 Cycle, u16 ulse_Num) 



  u16 TIM3per = 0; 
  u32 Time = 0; 

  //改变TIM3的重装值改变脉冲频率这里设置脉冲占空比为50% 

  //改变TIM2的预分频器和重装值改变脉冲个数 

      

  Time = Cycle * ulse_Num; 

  Time /= 100;              //预分频为7200,100us计数一次 

  TIM3per = Cycle/10;       //预分频为720,10us计数一次 

    

  TIM_SetAutoreload(TIM2, Time+1);//设置TIM2的重装值 

  TIM_SetAutoreload(TIM1, TIM3per-1);//设置TIM3的重装值 

  TIM_SetCompare1(TIM1,TIM3per/2);//设置占空比为50% 

  TIM_Cmd(TIM2,ENABLE);//使能TIM2 


TIM1的PA8口没输出。奇怪……>
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2014-11-18 17:41:39 | 显示全部楼层
回复【8楼】laoguren1122:
---------------------------------
TIM1在使用PWM的时候是需要有TIM1_CtrlPWMOutputs();这个函数的。
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-18 19:04:23 | 显示全部楼层
回复【9楼】亲亻尔嘴:
---------------------------------
谢谢楼上的大哥,果然加上就有了,非常感谢!!
但是为什么T3输出不需要加这个呢?
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-18 20:00:06 | 显示全部楼层
明白了,TIM1有个TIMx->BDTR
回复

使用道具 举报

11

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2014-4-1
在线时间
0 小时
发表于 2014-11-24 19:12:38 | 显示全部楼层
请问一下你这个程序TIM3的脉冲频率怎么计算?能不能该出个计算公式,我实在是没看懂。
TIM_OCInitStruct.TIM_Pulse = 1;//比较捕获1的预装载值 这句话是个什么意思?
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-11-25 11:16:22 | 显示全部楼层
回复【12楼】dengyang09:
---------------------------------
就是说在period内,计数到了pluse的值就会比较输出。
这个period的时钟要么跟系统有关,要么就跟它的上一级定时器时钟有关。
不用谢了……
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2014-12-6 11:52:07 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
自己做的板子加了光耦,IO那边有脉冲波形,可是光耦那边一直是高,是因为AF_PP驱动能力不好吗?可是换了Out_PP,IO那边就没有波形
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-8 00:31:17 | 显示全部楼层
回复【14楼】justin_1ee:
---------------------------------
你得看下电路了,计算下电流。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-11-13
在线时间
0 小时
发表于 2014-12-10 22:21:47 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
原子兄,
   请教一下,我用的你5楼列出的代码,只有main函数略有不同,为什么PA6没有输出呢?
int main(void)
{
delay_init();        //延时函数初始化   
//NVIC_Configuration();    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);   //串口初始化为9600
  //LED_Init();
  Motor_Init(10,10,2);
TIM2_TIM3_PWM(300,11);
  while(1);

}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-10 22:28:12 | 显示全部楼层
回复【16楼】西江月:
---------------------------------
检查代码了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-9-17
在线时间
0 小时
发表于 2014-12-15 16:10:07 | 显示全部楼层
回复【16楼】西江月:
---------------------------------
解决了吗?我的也是,不知道哪出问题了。帮忙指点下
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-9-17
在线时间
0 小时
发表于 2014-12-15 16:29:35 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
我把你的程序照搬下来,只有主程序不一样,为什麽我的不会输出波形,是不是还需要设置其他的啊??谢谢了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-9-17
在线时间
0 小时
发表于 2014-12-15 16:44:35 | 显示全部楼层

这样为什麽不会出来波形???求帮助
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-12-25
在线时间
0 小时
发表于 2015-1-16 09:00:17 | 显示全部楼层
Mark下 这个有需求
试试就知道
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-1-16
在线时间
0 小时
发表于 2015-1-16 22:59:05 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
能发整个程序给我吗?1589491200
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-1-20 08:43:25 | 显示全部楼层
这种方法可以实现定时器的四个通道输出可控个数脉冲吗?
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-28 21:21:04 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
为什么要开PA0和PA6 两个IO口呢?只开一个产生脉冲不就行了吗?
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-3-19
在线时间
11 小时
发表于 2015-5-6 13:06:58 | 显示全部楼层
能给共享下你的这个历程吗
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-3-19
在线时间
11 小时
发表于 2015-5-6 15:09:45 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
大神,能给我共享一下你的历程吗
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-5-17 22:51:49 | 显示全部楼层
回复【6楼】亲亻尔嘴:
---------------------------------
为什么我用你写的函数
void Task2()
{
TIM2_TIM3_PWM(70,1700);   //步进电机驱动函数 70代表一个脉冲的周期,1700代表脉冲个数
while(1);
}  按下按键后进入这个函数,来驱动步进电机转动,为啥有的时候电机转够1700个脉冲,有的时候只稍微动一下就停下了 ,根本不够1700个脉冲所转的度数。
while(1)
{
TIM2_TIM3_PWM(70,1700);
Delay_ms(500);
}
如果是这个程序,他就会转1700个脉冲,然后停一会,再转1700,这样循环。
求解答。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-5-17 22:52:31 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
为什么我用5楼写的函数驱动步进电机
void Task2()
{
TIM2_TIM3_PWM(70,1700);   //步进电机驱动函数 70代表一个脉冲的周期,1700代表脉冲个数
while(1);
}  按下按键后进入这个函数,来驱动步进电机转动,为啥有的时候电机转够1700个脉冲,有的时候只稍微动一下就停下了 ,根本不够1700个脉冲所转的度数。
while(1)
{
TIM2_TIM3_PWM(70,1700);
Delay_ms(500);
}
如果是这个程序,他就会转1700个脉冲,然后停一会,再转1700,这样循环。
求解答。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-5-18 08:51:26 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
补充一下27楼的问题,我的按键接的是pc0-3和pc13这几个接口,会不会是这几个接口对Tim2,Tim3这两个定时器有干扰。
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-5-18
在线时间
0 小时
发表于 2015-5-18 17:11:12 | 显示全部楼层
楼主,你问题解决了吗?我现在跟你差不多想实现步进电机变速控制,但是我现在一个单片机带了三台步进电机,是不是这样不太好实现啊?
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2015-5-7
在线时间
20 小时
发表于 2015-6-11 17:12:02 | 显示全部楼层

楼主,我用的你的代码,用逻辑分析仪仿真的,PA0和PA6都没输出,如果把TIM2的CHANNEL1设置成这种形式才会有波形输出:TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Repetitive),这是为什么呢??

回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-9-4
在线时间
0 小时
发表于 2015-9-12 16:41:58 | 显示全部楼层



加减速波形这样 为啥电机动不了
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-11-7
在线时间
8 小时
发表于 2015-11-8 16:42:30 | 显示全部楼层
请问有没有单片机驱动舵机的程序,能不能分享一下?我的qq1418232452,谢谢!
回复

使用道具 举报

82

主题

194

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-10-16
在线时间
72 小时
发表于 2016-5-15 17:19:25 | 显示全部楼层
laoguren1122 发表于 2014-11-18 17:00
我怎么把从定时器TIM3换成TIM1就不行了呢?&nbsp;

void&nbsp;Motor_Init(u16&nbsp;TIM2per,&nbsp;u16&nb ...

哥们,你有波形输出了?我用的程序没有波形....
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-4-16
在线时间
11 小时
发表于 2016-5-15 22:54:10 | 显示全部楼层
Error_J 发表于 2015-9-12 16:41
加减速波形这样 为啥电机动不了

变化的太快了吧
回复

使用道具 举报

5

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2016-5-17
在线时间
41 小时
发表于 2016-5-30 22:12:38 | 显示全部楼层
Error_J 发表于 2015-9-12 16:41
加减速波形这样 为啥电机动不了

你怎么实现加减速波形的
回复

使用道具 举报

29

主题

311

帖子

0

精华

高级会员

Rank: 4

积分
747
金钱
747
注册时间
2016-5-21
在线时间
199 小时
发表于 2016-5-31 08:24:12 | 显示全部楼层
好麻烦,我的办法是串口通信控制一块dspic33fgs……
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2016-7-22 15:18:33 | 显示全部楼层
现在使用在产品上方案是:

    TIM1发送脉冲给驱动电路,同时将这个脉冲信号接入TIM3的外部时钟输入口进行计数,如果16位不够,就将TIM3的更新事件接到TIM2的外部时钟输入。

具体细化以及临界脉冲的处理比较烦,但是处理好了,这种方案还是比较可行的。
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-7-12
在线时间
4 小时
发表于 2016-7-22 19:46:50 | 显示全部楼层
L298N和42步进电机的硬件接线是怎么样的啊,是怎么给L298N和步进电机PWM的?求教
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2016-7-26 19:05:34 | 显示全部楼层
理工女Free 发表于 2016-7-22 19:46
L298N和42步进电机的硬件接线是怎么样的啊,是怎么给L298N和步进电机PWM的?求教

L298N是一个H桥吧,可以驱动直流电机,步进电机的话最好还是买一个可以细分的驱动器吧
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2016-11-25 15:32:19 | 显示全部楼层
亲亻尔嘴 发表于 2016-7-26 19:05
L298N是一个H桥吧,可以驱动直流电机,步进电机的话最好还是买一个可以细分的驱动器吧

楼主你驱动步进电机用的细分驱动器型号是什么可以说一下嘛,或则让我看一下照片多谢了
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2016-12-4 09:43:32 | 显示全部楼层
jpaekeo 发表于 2016-11-25 15:32
楼主你驱动步进电机用的细分驱动器型号是什么可以说一下嘛,或则让我看一下照片多谢了

好久了,我都忘了什么型号了。。。以前在学校玩步进的时候用的
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2016-12-6 22:08:18 | 显示全部楼层
本帖最后由 jpaekeo 于 2016-12-6 22:10 编辑
亲亻尔嘴 发表于 2016-12-4 09:43
好久了,我都忘了什么型号了。。。以前在学校玩步进的时候用的

好吧,你最后实现了没有,用STM32F103最多可以独立控制几路步进电机,如果用在机械手上各个电机用PT模式运转
回复

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2016-12-7 04:17:00 | 显示全部楼层
本帖最后由 jpaekeo 于 2016-12-7 04:19 编辑
追忆童年200x 发表于 2015-4-28 21:21
回复【6楼】亲亻尔嘴:
---------------------------------
为什么要开PA0和PA6 两个IO口呢?只开一个 ...

估计开主定时器的IO还有其他用途,再就是楼主自己编写的单脉冲+门控程序还是不错的
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2016-10-30
在线时间
3 小时
发表于 2016-12-8 10:27:26 | 显示全部楼层
追忆童年200x 发表于 2015-5-17 22:52
回复【17楼】正点原子:
---------------------------------
为什么我用5楼写的函数驱动步进电机
void&nbsp; ...

你的延时函数太长了,而且加上while后就无法切换按键了
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2016-7-16
在线时间
22 小时
发表于 2017-6-13 09:09:36 | 显示全部楼层
楼主的例程还有吗?方便借鉴一下吗?
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2018-1-23
在线时间
30 小时
发表于 2018-1-25 19:19:14 | 显示全部楼层
怎么楼层这么乱。。。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-4-26
在线时间
1 小时
发表于 2019-4-26 16:36:14 | 显示全部楼层
亲亻尔嘴 发表于 2014-7-8 15:51
&nbsp;回复【5楼】 正点原子 :
---------------------------------

可否发一份源代码,谢谢!邮箱是:984360021@qq.com
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2019-5-6 14:34:57 | 显示全部楼层
上传一个ST官方的步进电机驱动程序,使用的是梯形加速算法,脉冲发送使用的是定时器的比较输出模式,CLK的每个电平变化进入一次中断,每两次中断为一个脉冲。

X_CUBE_SPN14_V1.0.0.zip

12.5 MB, 下载次数: 643

在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
 楼主| 发表于 2019-5-6 14:36:12 | 显示全部楼层
Chalrs1518893 发表于 2019-4-26 16:36
可否发一份源代码,谢谢!邮箱是:

可以分析49楼的代码
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 09:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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