当然,还是有待完善的地方,那就是对于串口字符串的检验
/*
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();
}
}
}
/*
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();
}
}
}
好多代码.......... 本帖最后由 hi55234 于 2015-2-19 14:49 编辑
http://www.tudou.com/programs/view/T7hX0uNxjFA/
TNND 土豆的流畅完全不能看,算了@百度盘,原始视频
http://pan.baidu.com/s/1kTHv6T5
丧心病狂的单字节控制,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();
}
}
/*
纯串口控制
加入脱机控制
*/
//电机的高电平持续时间 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();
}
}
TB6560和L298有什么区别吗? 说好的6560最后怎么变了。 请教6560衰减设置如何设定,看了英文资料没有看懂。 请问占空比大小会影响步进电机什么?
周期是影响他的速度对吧?? 楼主研究的太细致了,留着学习了 楼主能不能写51单片机程序呢 感觉很牛,步进电机我还不是很会。。。 hi55234 发表于 2015-2-25 15:12 static/image/common/back.gif
/*
纯串口控制
加入脱机控制
你好,可以把你演示视频的程序和接线图详细资料分享一下吗?邮箱:[email protected] 我学搞同步电机,可以把你演示视频的程序和接线图详细资料分享一下吗?谢谢!邮箱:[email protected]