hi55234 发表于 2015-2-18 12:51:19

为了控制的迁移,串口控制是必须的:

当然,还是有待完善的地方,那就是对于串口字符串的检验






/*
djc3 无极调速 + 串口控制
规定Pin4口为一个判断点,
低电平则为串口控制,高电平为按键控制


*/


//电机的高电平持续时间 us
int maichongjiangeMax=1260;
int maichongjiangeMin=120;
long maichongjiangeSet;

//电机的高电平持续时间的初始值 0us
int maichongjiange=250;

//脉冲的占空比为1/maichongzhankongbi
int maichongzhankongbi=4;

//加减速时速度每隔300us变化一次
int jiajiansubianhuashijian=300;


////////////////////////////////////////////
int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
int jsq1=0;
char kongzhimingling;
boolean testxinxi=0;

int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

boolean fangxiang=0;//电机转动方向标识
int maichongjsq=0;//脉冲计数器


unsigned long time1=micros();
unsigned long time2=micros();


void setup(){

Serial.begin(9600);

//pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
pinMode(5, INPUT);
pinMode(6, INPUT);

/*
暂定A0 analogRead(0)的值来确定转速
为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
如果粗分为10档,就意味着每100个返回单位对应10%的速度
*/

pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)

digitalWrite(7, LOW);//电机默认联机
digitalWrite(8, LOW);//
digitalWrite(9, LOW);
}


void loop(){

kongzhifangshi = digitalRead(4);

if(kongzhifangshi==1){

//转速调节,通过可变电阻实现无极调速

//可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
do
{
maichongjiangeSet = analogRead(0);//0-1023
}while(maichongjiangeSet >1024);

// 25% us =1000,000/(圈/每秒*400*4)=625/(0.5【min】+4.5×analogRead(0)/1024)
//即把电压线性到转速上
maichongjiangeSet = 625/(0.5+4.5*maichongjiangeSet/1024);//0-1023

fangxiangchange(); //转动方向的切换

}else{

       
          while (Serial.available() > 0) {
                  
                  //格式:方向(1位),速度百分比(2位) 如012
        kongzhimingling= Serial.read();
       
       
delayMicroseconds(1200);
jsq1++;
if(jsq1==3) jsq1=0;

testxinxi=1;
}

if(testxinxi){
          testxinxi=0;
          jsq1=0;
          Serial.print("get:");
      Serial.println(kongzhimingling);
          //速度调节

          
          maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling-48)*10+kongzhimingling-48)/100);//0-1023
          
          Serial.print("maichongjiangeSet:");
      Serial.println(maichongjiangeSet);
          
          //方向调节
          
                if(kongzhimingling-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

                          Serial.print("bian");

          
                //1、把速度降到最低
                while(maichongjiange<maichongjiangeMax){
                jiansu();
                maichongqudong();
                }
               
                Serial.println("jiansuOK");
               
                //2、记录新的方向
                fangxiang=!fangxiang;
               
                //3、反方向
                digitalWrite(8, fangxiang);

                //4、在把速度加到原来值
                while(maichongjiange<maichongjiangeSet){
                jiasu();
                maichongqudong();
                }
               
                Serial.println("jiasuOK");

                }elseSerial.print("baochi");


        }


       
       
}



//加速过程
while(maichongjiange>maichongjiangeSet){
jiasu();
maichongqudong();
}

//加减过程
while(maichongjiange<maichongjiangeSet){
jiansu();
maichongqudong();
}

//在脉冲频率无变化的时候驱动电机正常运行
maichongqudong();





}






void jiasu() //脉冲加速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
maichongjiange--;
time1=micros();
}

}

void jiansu()//脉冲减速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
maichongjiange++;
time1=micros();
}

}


void maichongqudong()//脉冲驱动
{



//步进电机控制脉冲
if (micros()-time2 > maichongjiange){

      maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
      maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

      if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
      else digitalWrite(9, LOW);

   time2= micros();
}

}


void fangxiangchange() //转动方向的切换
{



//关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
/*本例中,
pin7, EN+,脱机,高电平有效
pin8, CW+,方向
pin9, CLK+,频率(转速)
已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

就实际操作而言,速度上测电阻分压,方向上用微动开关比较合适,即用2个数字口+1个PWM口实现具体控制
*/

Pinval = digitalRead(5);//pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

//1、把速度降到最低
while(maichongjiange<maichongjiangeMax){
jiansu();
maichongqudong();
    }
//2、反方向
digitalWrite(8, LOW);
//3、记录新的方向
fangxiang=0;
//4、在把速度加到原来值
while(maichongjiange<maichongjiangeSet){
jiasu();
maichongqudong();
    }

}

Pinval = digitalRead(6);//pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

//1、把速度降到最低
while(maichongjiange<maichongjiangeMax){
jiansu();
maichongqudong();
    }
//2、反方向
digitalWrite(8, HIGH);
//3、记录新的方向
fangxiang=1;
//4、在把速度加到原来值
while(maichongjiange<maichongjiangeSet){
jiasu();
maichongqudong();
    }

}




}

hi55234 发表于 2015-2-18 14:06:09

/*
djc3 无极调速 + 串口控制
规定Pin4口为一个判断点,
低电平则为串口控制,高电平为按键控制
对串口的输入做限制,必须为数字

*/


//电机的高电平持续时间 us
int maichongjiangeMax=1260;
int maichongjiangeMin=120;
long maichongjiangeSet;

//电机的高电平持续时间的初始值 0us
int maichongjiange=0;

//脉冲的占空比为1/maichongzhankongbi
int maichongzhankongbi=4;

//加减速时速度每隔300us变化一次
int jiajiansubianhuashijian=300;


////////////////////////////////////////////
int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
int jsq1=0;
int tempint;
char kongzhimingling;
boolean testxinxi=0;

int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

boolean fangxiang=0;//电机转动方向标识
int maichongjsq=0;//脉冲计数器


unsigned long time1=micros();
unsigned long time2=micros();


void setup(){

Serial.begin(9600);

//pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
pinMode(5, INPUT);
pinMode(6, INPUT);

/*
暂定A0 analogRead(0)的值来确定转速
为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
如果粗分为10档,就意味着每100个返回单位对应10%的速度
*/

pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)

digitalWrite(7, LOW);//电机默认联机
digitalWrite(8, LOW);//
digitalWrite(9, LOW);
}


void loop(){

kongzhifangshi = digitalRead(4);

if(kongzhifangshi==1){

//转速调节,通过可变电阻实现无极调速

//可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
do
{
maichongjiangeSet = analogRead(0);//0-1023
}while(maichongjiangeSet >1024);

// 25% us =1000,000/(圈/每秒*400*4)=625/(0.5【min】+4.5×analogRead(0)/1024)
//即把电压线性到转速上
maichongjiangeSet = 625/(0.5+4.5*maichongjiangeSet/1024);//0-1023

fangxiangchange(); //转动方向的切换

}else{


   while (Serial.available() > 0) {
   
    //格式:方向(1位),速度百分比(2位) 如012
//kongzhimingling= Serial.read();
if(jsq1==0){       
tempint=Serial.read();
if(tempint==48 || tempint==49)kongzhimingling= tempint;       
}else{
tempint=Serial.read();
if(tempint>47 && tempint<58)kongzhimingling= tempint;       

}

delayMicroseconds(1200);
jsq1++;
if(jsq1==3) jsq1=0;

testxinxi=1;
}

if(testxinxi){
   testxinxi=0;
   jsq1=0;
   Serial.print("get:");
      Serial.println(kongzhimingling);
   //速度调节

   
   maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling-48)*10+kongzhimingling-48)/100);//0-1023
   
   Serial.print("maichongjiangeSet:");
      Serial.println(maichongjiangeSet);
   
   //方向调节
   
if(kongzhimingling-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

   Serial.print("bian");

   
//1、把速度降到最低
while(maichongjiange<maichongjiangeMax){
jiansu();
maichongqudong();
}

Serial.println("jiansuOK");

//2、记录新的方向
fangxiang=!fangxiang;

//3、反方向
digitalWrite(8, fangxiang);

//4、在把速度加到原来值
while(maichongjiange<maichongjiangeSet){
jiasu();
maichongqudong();
}

Serial.println("jiasuOK");

}elseSerial.print("baochi");


}




}



//加速过程
while(maichongjiange>maichongjiangeSet){
jiasu();
maichongqudong();
}

//加减过程
while(maichongjiange<maichongjiangeSet){
jiansu();
maichongqudong();
}

//在脉冲频率无变化的时候驱动电机正常运行
maichongqudong();





}






void jiasu() //脉冲加速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
maichongjiange--;
time1=micros();
}

}

void jiansu()//脉冲减速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
maichongjiange++;
time1=micros();
}

}


void maichongqudong()//脉冲驱动
{



//步进电机控制脉冲
if (micros()-time2 > maichongjiange){

      maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
      maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

      if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
      else digitalWrite(9, LOW);

   time2= micros();
}

}


void fangxiangchange() //转动方向的切换
{



//关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
/*本例中,
pin7, EN+,脱机,高电平有效
pin8, CW+,方向
pin9, CLK+,频率(转速)
已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

就实际操作而言,速度上测电阻分压,方向上用微动开关比较合适,即用2个数字口+1个PWM口实现具体控制
*/

Pinval = digitalRead(5);//pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

//1、把速度降到最低
while(maichongjiange<maichongjiangeMax){
jiansu();
maichongqudong();
    }
//2、反方向
digitalWrite(8, LOW);
//3、记录新的方向
fangxiang=0;
//4、在把速度加到原来值
while(maichongjiange<maichongjiangeSet){
jiasu();
maichongqudong();
    }

}

Pinval = digitalRead(6);//pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

//1、把速度降到最低
while(maichongjiange<maichongjiangeMax){
jiansu();
maichongqudong();
    }
//2、反方向
digitalWrite(8, HIGH);
//3、记录新的方向
fangxiang=1;
//4、在把速度加到原来值
while(maichongjiange<maichongjiangeSet){
jiasu();
maichongqudong();
    }

}




}

1090805647 发表于 2015-2-19 12:35:55

好多代码..........

hi55234 发表于 2015-2-19 14:41:26

本帖最后由 hi55234 于 2015-2-19 14:49 编辑

http://www.tudou.com/programs/view/T7hX0uNxjFA/

TNND 土豆的流畅完全不能看,算了@百度盘,原始视频

http://pan.baidu.com/s/1kTHv6T5


hi55234 发表于 2015-2-25 15:12:26

丧心病狂的单字节控制,0延迟,纯ASCII分拆

/*
纯串口控制
加入脱机控制
*/


//电机的高电平持续时间 us
int maichongjiangeMax=1260;
int maichongjiangeMin=120;
long maichongjiangeSet=600;

//电机的高电平持续时间的初始值 120us
int maichongjiange=120;

//脉冲的占空比为1/maichongzhankongbi
int maichongzhankongbi=4;

//加减速时速度每隔300us变化一次
int jiajiansubianhuashijian=300;


////////////////////////////////////////////

int tempint;

boolean fangxiang=0;//电机转动方向标识
int maichongjsq=0;//脉冲计数器


unsigned long time1=micros();
unsigned long time2=micros();


void setup(){

Serial.begin(9600);

pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)

digitalWrite(7, HIGH);//电机默认脱机
digitalWrite(8, LOW);//
digitalWrite(9, LOW);

}


void loop(){




   while (Serial.available() > 0) {

    //丧心病狂的单字节控制,0延迟,纯ASCII分拆
      //定义1 0-9表示转速,每一个表示10%
      //定义2 A正转、B反转
      //定义3 C联机、D脱机
      
   tempint=Serial.read();
   
   //调速度
   if(tempint>47 && tempint< 58) maichongjiangeSet = 625/(0.5+4.5*(tempint-48)/10);//0-1023
   //调方向
   if(tempint==65)digitalWrite(8, 0);
   if(tempint==66)digitalWrite(8, 1);
    //脱机
   if(tempint==67)digitalWrite(7, 0);
   if(tempint==68)digitalWrite(7, 1);
   
   tempint=0;

}






//加速过程
while(maichongjiange>maichongjiangeSet){
jiasu();
maichongqudong();
}

//加减过程
while(maichongjiange<maichongjiangeSet){
jiansu();
maichongqudong();
}

//在脉冲频率无变化的时候驱动电机正常运行
maichongqudong();





}






void jiasu() //脉冲加速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
maichongjiange--;
time1=micros();
}

}

void jiansu()//脉冲减速过程
{

if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
maichongjiange++;
time1=micros();
}

}


void maichongqudong()//脉冲驱动
{



//步进电机控制脉冲
if (micros()-time2 > maichongjiange){

      maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
      maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

      if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
      else digitalWrite(9, LOW);

   time2= micros();
}

}


hi55234 发表于 2015-2-25 19:04:08

/*
纯串口控制
加入脱机控制
*/


//电机的高电平持续时间 us
int maichongjiangeMax=357;
int maichongjiangeMin=120;

//电机的高电平持续时间的初始值 357us,1.75圈/S

int maichongjiange=357;

//脉冲的占空比为1/maichongzhankongbi
int maichongzhankongbi=4;

////////////////////////////////////////////

int tempint;
int maichongjsq=0;//脉冲计数器


unsigned long time2=micros();


void setup(){

Serial.begin(9600);

pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)

digitalWrite(7, HIGH);//电机默认脱机
digitalWrite(8, LOW);//
digitalWrite(9, LOW);

}


void loop(){




   while (Serial.available() > 0) {

    //丧心病狂的单字节控制,0延迟,纯ASCII分拆
      //定义1 0-9表示转速,每一个表示10%
      //定义2 A正转、B反转
      //定义3 C联机、D脱机

   tempint=Serial.read();

   //调速度
   if(tempint>47 && tempint< 58) maichongjiange = 625/(1.75+3.25*(tempint-48)/10);//0-1023
   //调方向
   else if(tempint==65)digitalWrite(8, 0);
   else if(tempint==66)digitalWrite(8, 1);
    //脱机
   else if(tempint==67)digitalWrite(7, 0);
   else if(tempint==68)digitalWrite(7, 1);

//E jiansu   F jiasu
   else if(tempint==69){
           maichongjiange=maichongjiange+10;
           if(maichongjiange>maichongjiangeMax)maichongjiange=maichongjiangeMax;
   }
   else if(tempint==70){
           maichongjiange=maichongjiange-10;
           if(maichongjiange<maichongjiangeMin)maichongjiange=maichongjiangeMin;
   }
   
   



   //Serial.println(maichongjiange);
   
   tempint=0;

}


//在脉冲频率无变化的时候驱动电机正常运行
maichongqudong();


}



void maichongqudong()//脉冲驱动
{



//步进电机控制脉冲
if (micros()-time2 > maichongjiange){

      maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
      maichongjsq=maichongjsq%maichongzhankongbi;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

      if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
      else digitalWrite(9, LOW);

   time2= micros();
}

}

suoma 发表于 2015-3-2 14:56:10

TB6560和L298有什么区别吗?

吴亚南 发表于 2015-5-9 20:04:57

说好的6560最后怎么变了。

carney 发表于 2015-6-16 11:10:35

请教6560衰减设置如何设定,看了英文资料没有看懂。

707971617 发表于 2015-8-1 16:00:07

请问占空比大小会影响步进电机什么?
周期是影响他的速度对吧??

ly117 发表于 2015-9-2 13:43:53

楼主研究的太细致了,留着学习了

renhua18 发表于 2015-10-19 20:43:05

楼主能不能写51单片机程序呢

顺子 发表于 2015-11-8 22:57:57

感觉很牛,步进电机我还不是很会。。。

5992771 发表于 2016-4-4 11:22:18

hi55234 发表于 2015-2-25 15:12 static/image/common/back.gif
/*
纯串口控制
加入脱机控制


你好,可以把你演示视频的程序和接线图详细资料分享一下吗?邮箱:[email protected]

xuenyi 发表于 2016-6-28 16:55:27

我学搞同步电机,可以把你演示视频的程序和接线图详细资料分享一下吗?谢谢!邮箱:[email protected]
页: 1 [2] 3
查看完整版本: 菜鸟玩步进电机 与 TB6560 驱动频率的测试