OpenEdv-开源电子网

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

求助关于步进电机控制方面的问题

[复制链接]

1

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-30
在线时间
15 小时
发表于 2018-6-15 11:34:40 | 显示全部楼层 |阅读模式
100金钱
我用的控制芯片型号是LB1838,常用与针式打印机,控制方式近似于L298N,但是在控制的时候正反转不能转到同一个位置,比如定义一个原点,在转动不超过360度情况下,定义几个位置,从1-2,2-4都能正常到达指定位置,但是从4-2,2-1就跑偏。由于不能让电机发热太厉害,添加了PWM控制,代码下面贴上,求各路大神帮帮忙,万分感谢
[mw_shl_code=c,true]                if(Start_X_Flag == 1)
                {
                         if(Count_T > 0 || reset_flag == 1)                //Count_T为需要转动的步数
                                        if(Turn_dir == 1)
                                        {
                                                loop1(run_count_1);
                                                run_count_1 ++;
                                                Count_T--;
                                        }
                                        if(Turn_dir == 0)
                                        {
                                                loop2(run_conut_2);
                                                run_conut_2 ++;
                                                Count_T--;
                                        }
                         }
                         
                         if(run_count_1 > 4)
                                 run_count_1 = 1;
                         if(run_conut_2 > 4)
                                 run_conut_2 = 1;                         
                         
                         if(Count_T <= 0)
                         {       
                                        STOP_X();
                         }
                }[/mw_shl_code]
反向转动
[mw_shl_code=c,true]void loop2(u8 step)
{
                        switch (step)
                        {
                                case 3:                                                                        //0001
                                        GPIO_ResetBits(GPIOA,GPIO_Pin_15);
                                        GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                case 2:                                                                  //1000
                                        GPIO_ResetBits(GPIOA,GPIO_Pin_15);                               
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                case 1:                                                                        //0010
                                        GPIO_SetBits(GPIOA,GPIO_Pin_15);
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                case 0:                                                                        //0100
                                        GPIO_SetBits(GPIOA,GPIO_Pin_15);
                                        GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                default:
                                        GPIO_ResetBits(GPIOA,GPIO_Pin_15);                               
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                        break;
                        }
                        delay_us(150);
}[/mw_shl_code]
正向转动
[mw_shl_code=c,true]void loop1(u8 step)
{
                        switch (step)
                        {
                                case 0:                                                                        //0001
                                        GPIO_ResetBits(GPIOA,GPIO_Pin_15);
                                        GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                case 1:                                                                  //1000
                                        GPIO_ResetBits(GPIOA,GPIO_Pin_15);                               
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                case 2:                                                                        //0010
                                        GPIO_SetBits(GPIOA,GPIO_Pin_15);
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                case 3:                                                                        //0100
                                        GPIO_SetBits(GPIOA,GPIO_Pin_15);
                                        GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                        break;
                                default:
                                        GPIO_ResetBits(GPIOA,GPIO_Pin_15);                               
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                        break;
                        }
                        delay_us(150);
}[/mw_shl_code]
通过TTL IO来控制电机转动到某个指定位置
[mw_shl_code=c,true]void GPIO_AN_Task(void)
{

                s16 tmp;
          s16 Count_gpio;
       
                if(GPIO_TASK_FLAG == 0)
          {
                                Count_gpio = PAin(7)* 8 + PBin(0)* 4 + PBin(1)* 2 + PBin(2)* 1;
                                Count_gpio += 1;

                                if(Count_gpio == point)
                                        return;
                               
                                UART1_Putw_Dec(Count_gpio);
                                UART1_Put_String("\r\n");
                       
                                GPIO_TASK_FLAG = 1;

                                tmp = Count_gpio - point;
                               
                                if(tmp == 0)
                                        return;

                                if(Start_X_Flag == 0)
                                {
                                        if( tmp > 0)
                                        {
                                                Turn_dir = 0;
                                        }       
                                        else
                                        {
                                                Turn_dir = 1;
                                                tmp = tmp * (-1);
                                        }
                                }       
                               
                                Count_T = tmp * 8;          

                                point = Count_gpio;                //记录当前位置信息
                                START_X();
               
          }
}[/mw_shl_code]

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2018-6-15 11:45:19 | 显示全部楼层

这个LB1838只是功率驱动器,
正反转,应当是靠输入脉冲的相位差来控制。

所以,应当是软件控制有问题,反转不对头。
应当先懂得,怎样的相位关系才能使电机正确地反向转动?
然后用示波器查PWM波形的对应关系,和怎样编程实现正确的对应关系。

具体不懂了,只能帮到这里。

回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-30
在线时间
15 小时
 楼主| 发表于 2018-6-15 11:53:26 | 显示全部楼层
xuande 发表于 2018-6-15 11:45
这个LB1838只是功率驱动器,
正反转,应当是靠输入脉冲的相位差来控制。

而且有个比较奇怪的地方,如果我从位置4转到位置2出现偏差,但是从位置2却能正常转到位置4.。。一直找不到问题所在。。。由于自己折腾的东西,示波器太古老,很难录下完整波形。。。
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-30
在线时间
15 小时
 楼主| 发表于 2018-6-15 13:51:42 | 显示全部楼层
Datasheet连接双手呈上http://static6.arrow.com/aropdfconversion/d89a0c95adb05e33f5ddec2e926514bd81095a40/511andlb1838m-d.pdf
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-30
在线时间
15 小时
 楼主| 发表于 2018-6-15 17:14:34 | 显示全部楼层
顶上去下
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-30
在线时间
15 小时
 楼主| 发表于 2018-6-16 18:30:08 | 显示全部楼层
每日一顶。。。
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-30
在线时间
15 小时
 楼主| 发表于 2018-6-18 14:18:47 | 显示全部楼层
端午节也来顶顶把。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 06:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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