1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| #define LED ( 13 ) #define MOTOR\_PIN0 ( 8 ) #define MOTOR\_PIN1 ( 9 ) #define MOTOR\_PIN2 ( 10 ) #define MOTOR\_PIN3 ( 11 ) #define KEY\_Add ( 4 ) #define KEY\_Sub ( 5 ) static unsigned char Speed = 110;//初始速度值 unsigned char ButtonAdd = 0 ;//按键+状态 unsigned char ButtonSub = 0 ;//按键-状态
unsigned char CW_flag = 0 ;//按键正转状态 unsigned char CCW_flag = 0 ;//按键反转状态 unsigned char phasecw[8] ={0x01,0x02,0x04,0x08};// 逆时针 unsigned char phaseccw[8]={0x08,0x04,0x02,0x01};// 顺时针
void SetMotor(unsigned char InputData);//根据传送的数据Inputdata设置脉冲引脚输出 void motorNcircle(bool DIR);//position为正转或者反转 void Add() { Speed +=10; if(Speed > 250) Speed =250;//最大值 } void Sub() { Speed -=10; if(Speed < 100) Speed =110;//最小值 } void Trg\_CW(){CCW_flag = 0; CW_flag = !CW_flag;} void Trg\_CCW(){CW_flag = 0; CCW_flag = !CCW_flag;} void StepperCW(){ motorNcircle(1);} void StepperCCW(){ motorNcircle(0);} void setup() { pinMode( LED, OUTPUT );//指示灯 pinMode( MOTOR_PIN0, OUTPUT );//电机控制相线 pinMode( MOTOR_PIN1, OUTPUT ); pinMode( MOTOR_PIN2, OUTPUT ); pinMode( MOTOR_PIN3, OUTPUT ); pinMode(2, INPUT_PULLUP);//加速按键 pinMode(3, INPUT_PULLUP);//减速按键 pinMode(KEY_Add, INPUT_PULLUP);//正转/停止检测按钮 pinMode(KEY_Sub, INPUT_PULLUP);//反转/停止检测按钮 attachInterrupt(0, Trg_CW, FALLING); //外部中断号 0,接引脚IO 2,触发方式:高电平变为低电平触发(下降沿触发) attachInterrupt(1, Trg_CCW, FALLING); //外部中断号 1,接引脚I0 3,触发方式:高电平变为低电平触发(下降沿触发) }
void loop() { static unsigned char i = 0; unsigned char ButtonAdd = digitalRead(KEY_Add);//正转按键被按下 unsigned char ButtonSub = digitalRead(KEY_Sub);//反转按键被按下 if(ButtonAdd == 0){//检测到有按键按下 delay(10);//消抖处理 if(ButtonAdd == 0){//确认按键被按下 ButtonAdd = 1 - ButtonAdd ; while(!digitalRead(KEY_Add));//等待按键被释放抬起 } } if(ButtonSub == 0){//检测到有按键按下 delay(10);//消抖处理 if(ButtonSub == 0){//确认按键被按下 ButtonSub = 1 - ButtonSub ; while(!digitalRead(KEY_Sub));//等待按键被释放抬起 } } if(ButtonAdd){ Add(); } if(ButtonSub){ Sub(); } if(CW_flag){StepperCW();}//正转 if(CCW_flag){StepperCCW();}//反转 else{ //这里可以填写其他控制代码 digitalWrite( MOTOR_PIN0, LOW ); digitalWrite( MOTOR_PIN1, LOW ); digitalWrite( MOTOR_PIN2, LOW ); digitalWrite( MOTOR_PIN3, LOW ); digitalWrite( LED, HIGH ); } }
void SetMotor(unsigned char InputData)//根据传送的数据Inputdata设置脉冲引脚输出 {//根据传送的数据Inputdata设置IO8-IO11引脚输出 if(InputData&0x01) { digitalWrite( MOTOR_PIN0, HIGH ); } else { digitalWrite( MOTOR_PIN0, LOW ); } if(InputData&0x02) { digitalWrite( MOTOR_PIN1, HIGH ); } else { digitalWrite( MOTOR_PIN1, LOW );
} if(InputData&0x04) { digitalWrite( MOTOR_PIN2, HIGH ); } else { digitalWrite( MOTOR_PIN2, LOW ); } if(InputData&0x08) { digitalWrite( MOTOR_PIN3, HIGH ); } else { digitalWrite( MOTOR_PIN3, LOW ); } }
//position 方向 void motorNcircle(bool DIR)//n为步进电机转动的圈数,position为正转或者反转 { byte k=0; for(k=0;k<4;k++) {//4相单双8拍 if(DIR) { SetMotor(phasecw[k]); } else { SetMotor(phaseccw[k]); } delay(110);//延时:速度控制,数值越大速度越慢。电流0.65A } }
|