标题: 求用C语言写控制步进电机和伺服电机每次按键转动45° [打印本页]
作者: xiong123154 时间: 2017-7-25 16:36
标题: 求用C语言写控制步进电机和伺服电机每次按键转动45°
用C语言写控制步进电机和伺服电机每次按键转动45°
按键一次转动45°
按键二次加45°
作者: HC6800-ES-V2.0 时间: 2017-7-25 16:36
第一:你的伺服电机是什么样的?是不是就是舵机?如果是舵机——SG90——它的控制是这样的:知识:舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
程序是这样的:
void DJZD (void)//舵机转动子函数
{
unsigned char i;//舵机信号脉冲次数
for (i=0;i<75;i++)//通过试验,从0度转动到180度,至少要循环75次
{
DJ=1;
Delay50us(GT);
DJ=0;
Delay50us(DT);
}
DJ=0;
}
GT=20;DT=380;转动到45度
GT=30;DT=370;转动到90度,其它角度自己可以算。
这里的角度是固定的,不存在45度加45度的说法。注意!!!
第二:步进电机——以下以四相五线步进电机为例
知识:我的步进电机参数为:步距角5.625度,是减速电机1:64;即是说:每一次脉冲,电机转动角度为5.625/64度
所以,转动45度,就应该有45*64/5.625=512次脉冲。
程序如下:
- void Motor() //电机旋转子函数
- {
- unsigned char i;
- for(i=0;(i<8);i++) //四相单双八拍
- {
- if (jd==0) //jd为0则停转
- {
- Rotation=0xf0;
- break;
- }
- if (k==0)
- {
- Rotation=FFW2[i]; //输出正转的相
- }
- else
- {
- Rotation=FFW1[i]; //输出反转的相
- }
- Delay(Time); //Time改变这个参数可以调整电机转速
- jd--;
- }
- }
复制代码
其中,变量jd(角度)在主程序中就应该赋值512,若再加45度,则可以再来一次就行。这里的角度,是可以累加的,不是固定的。其它角度自己可以算,当然要注意自己的步进电机参数。
作者: xiong123154 时间: 2017-7-27 23:02
谢谢,我参考着改进下
作者: xiong123154 时间: 2017-7-31 15:56
我这样写 控制不了
#include <reg51.h>
unsigned char i;//舵机信号脉冲次数
unsigned char GT; //高
unsigned char DT; //低
typedef unsigned int uint;
typedef unsigned int uchar;
sbit key1 = P3^6;//按键45°
sbit key2 = P3^7;//按键90°
sbit DJ = P1^0; //接舵机
void Delay50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//void InitTimer(void)
//{
// TMOD=0x01;//开定时器0
// TH0=(65536-10000)/256;//20MS为一个周期 舵机的控制一般需要一个20ms左右的时基脉冲
// TL0=(65536-10000)%256;
// EA=1;//开总断
// TR0=1;//开定时器0
// ET0=1;
//}
//void timer0(void) interrupt 1//定时器0中断函数
//{
// unsigned char count;
// TH0=(65536-10000)/256;
// TL0=(65536-10000)%256;
// TR1=1;
// count++;
//}
void DJZD (void)//舵机转动子函数
{
for (i=0;i<75;i++)//通过试验,从0度转动到180度,至少要循环75次
{
if(key1==0) //扫描独立键盘key1
{
DJ=1; //舵机停
Delay50us(20);
DJ=0; //电机转
Delay50us(380); //转动到45度
}
if(key2==0) //扫描独立键盘key2
{
DJ=1;
Delay50us(30);
DJ=0;
Delay50us(370);//转动到90度。
}
}
// DJ=0; //舵机转
}
void main()
{
while(1) //总循环
{
DJZD();
}
}
作者: whgh 时间: 2017-7-31 17:24
不清楚你说的控制不了是什么样子的?? 似乎逻辑上有问题涅~尤其key2,另,你考虑了当你按下key时你的i是多少吗?
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |