OpenEdv-开源电子网

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

步进电机转速问题

[复制链接]

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2017-7-26
在线时间
43 小时
发表于 2017-8-5 21:01:13 | 显示全部楼层 |阅读模式
最近在研究步进电机,百度说步进电机的转速是脉冲频率决定的,于是在程序中不断更改arr的值,可是不管怎么改,步进电机转速还都是差不多,都很快,调细分器后也是一样,不知道如何才能实现步进电机转动时那种转一下顿一下那种感觉很慢的样子,还请论坛的各位大神指点!
以下是用细分器驱动步进电机的程序


int main(void)
{                         
        GPIO_InitTypeDef  GPIO_InitStructure;
           
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);       
//细分器 DIR 连接 PC2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
        GPIO_Init(GPIOC, &GPIO_InitStructure);                                       
        GPIO_SetBits(GPIOC,GPIO_Pin_2);       

        TIM3_PWM_Init(1500,0);
        TIM_SetCompare2(TIM3,500);

         while(1);
}



void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       

        TIM_TimeBaseStructure.TIM_Period = arr;                           //自动重装载寄存器的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
        TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);

        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
        TIM_Cmd(TIM3, ENABLE);
       
}


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

使用道具 举报

1

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2017-7-20
在线时间
51 小时
发表于 2017-8-7 13:35:32 | 显示全部楼层
本帖最后由 yu1347385993 于 2017-8-7 13:45 编辑

你设置的arr应该还是太小了  1 一般步进电机1.8度每个脉冲,也就是说电机转一圈是200个脉冲(360/1.8)
2 例程上  有这么一句 TIM3_PWM_Init(899,0); //不分频,PWM 频率=72000/900=80Khz    显然频率太高,不会出现你说的有明显的停顿感,假如你把频率设置为1hz,那绝对能保证有明显的停顿感arr寄存器是16位的,就算设置到最大,可能转速还是很快,不会出现你说的效果

不知道分析的对不对,大家有其他想法的也可一起讨论一下


回复 支持 1 反对 0

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2017-7-26
在线时间
43 小时
 楼主| 发表于 2017-8-5 21:02:36 | 显示全部楼层
我是在 TIM3_PWM_Init(1500,0) 中 修改第一个参数的值想实现改变PWM频率的
回复 支持 反对

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2017-7-26
在线时间
43 小时
 楼主| 发表于 2017-8-6 09:15:26 | 显示全部楼层
      顶起
回复 支持 反对

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
发表于 2017-8-7 10:32:58 | 显示全部楼层
psc和arr都改一下试试看,先把两个的值都设大一点
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-7-15
在线时间
12 小时
发表于 2017-8-7 17:25:23 | 显示全部楼层
有些道理
回复 支持 反对

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2017-7-26
在线时间
43 小时
 楼主| 发表于 2017-8-8 14:52:30 | 显示全部楼层
yu1347385993 发表于 2017-8-7 13:35
你设置的arr应该还是太小了  1 一般步进电机1.8度每个脉冲,也就是说电机转一圈是200个脉冲(360/1.8)
2  ...

恩,改了一下,加上延迟函数,看起来稍微有点改观,但还是没达到理想的状态
最近查阅了一些资料,感觉好像是可以控制脉冲个数的,但还不知道怎么实现
回复 支持 反对

使用道具 举报

10

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2017-7-26
在线时间
43 小时
 楼主| 发表于 2017-8-8 14:53:15 | 显示全部楼层
allaqppq 发表于 2017-8-7 10:32
psc和arr都改一下试试看,先把两个的值都设大一点

还是不太好
能否通过控制脉冲个数再加上延迟来实现呢?
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2017-7-20
在线时间
51 小时
发表于 2017-8-8 15:07:39 | 显示全部楼层
凯爷儿 发表于 2017-8-8 14:52
恩,改了一下,加上延迟函数,看起来稍微有点改观,但还是没达到理想的状态
最近查阅了一些资料,感觉好 ...

改一下预分频,将系统时钟变小
例子如下:
TIM1_PWM_Init(499,7199);    // 72M/7200=10khz, 1/10khz * 500=50ms
再试一下,这个方法应该可以
回复 支持 反对

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
发表于 2017-8-8 18:23:51 | 显示全部楼层
凯爷儿 发表于 2017-8-8 14:52
恩,改了一下,加上延迟函数,看起来稍微有点改观,但还是没达到理想的状态
最近查阅了一些资料,感觉好 ...

我以前写过一个步进电机的驱动,你试试
  TIM3_Int_Init(400,35999);
TIM7_Int_Init(7000,35999);
回复 支持 反对

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
发表于 2017-8-8 18:25:43 | 显示全部楼层
凯爷儿 发表于 2017-8-8 14:53
还是不太好
能否通过控制脉冲个数再加上延迟来实现呢?

试一下 TIM3_Int_Init(400,35999);
            TIM7_Int_Init(7000,35999);
                     if(KEY1==0) //支持连按模式
                {
               
                         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                         
                         GPIO_SetBits(GPIOB,GPIO_Pin_8);
                               
                         delay_us(1000);
              GPIO_ResetBits(GPIOB,GPIO_Pin_8);       
                       
                }  //一个引脚固定电平,一个引脚输出脉冲给PULSE引脚,(必须加微秒级延时)
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-8-10
在线时间
7 小时
发表于 2017-8-31 10:51:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-5-26
在线时间
76 小时
发表于 2017-8-31 14:44:18 来自手机 | 显示全部楼层
顶,,,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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