我用Arduino2560连接步进电机驱动M420B控制步进电机滑台,用位移传感器检测位置。可是我编好程序步进电机只运行一步。我哪里出错了。
- const int PUL = 13;
- const int DIR = 12;
- const int ENA = 11;
- long delta;
- long dt1;
- long dt; float vol; float t,t_1;
- volatile float v = 0, v_1, v_11;
- unsigned long lasttime;
- long unsigned mm;
- int i = 2000;
- int temp;
- float ss;
- int target_position; float old_position;float current_position;
- int s_acc, s_dec;
- boolean flag;
- void setup()
- {
- pinMode(PUL, OUTPUT);
- pinMode(DIR, OUTPUT);
- pinMode(ENA, OUTPUT);
- Serial.begin(9600);
- lasttime = 0;
- //**************************理想速度曲线**************************//
- if (current_position < -200) {
- t_1 = 400; v_1 = 2500;
- }
- if (current_position > 200) {
- t_1 = -400; v_1 = -2500;
- }
- else {
- t_1 = -80000/current_position; v_1 = -12.5*current_position;
- }
- /********************************************************************/
- }
- void loop() {
- //**************************检测位置**************************//
- int V1 = analogRead(A0);
- vol = V1 * (5.0 / 1023.0) * 1000;
- current_position = 270 * vol / 4690;
- current_position -= 120;
- current_position = round(current_position / 0.3);
- // if (current_position == ss) {
- // ss = current_position;
- // }
- // else {
- // Serial.println(current_position);
- // ss = current_position;
- // }
- /********************************************************************/
-
- v_1 = -12.5*(current_position + sgn(v)); //下一拍的理想速度
- int f = sgn(v-v_1); float new_position = round(-v/12.5);
- v_11 = -12.5 * (new_position + f);//下一拍的期望速度
- if ((v_11-v_1) * (v-v_1) < 0) {
- mm = micros();
- v = v_1;
- dt = round(1000000/v);
- dt1 = round(dt/2);
- digitalWrite(DIR, LOW);
- digitalWrite(ENA, HIGH);
-
- delta = mm - lasttime;
- if (delta < dt1) {
- digitalWrite(PUL, LOW);
- }
- else if (delta < dt) {
- digitalWrite(PUL, HIGH);
- }
- else {
- lasttime = mm;
-
- }
- }
- else if (v_11 * v < 0) {
- v = 0;
- // digitalWrite(ENA, LOW);
- }
- else {
- mm = micros();
- v = v_11;
- dt = round(1000000/v);
- dt1 = round(dt / 2);
- digitalWrite(DIR, LOW);
- digitalWrite(ENA, HIGH);
-
- delta = mm - lasttime;
- if (delta < dt1) {
- digitalWrite(PUL, LOW);
- }
- else if (delta < dt) {
- digitalWrite(PUL, HIGH);
- }
- else {
- lasttime = mm;
-
- }
- }
- }
- int sgn(float x) {
- if (x > 0) return 1;
- else if (x < 0) return -1;
- else return 0;
- }
复制代码 |