• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z pracą silnika krokowego
#1
Witam
Mam prośbę. Czy mógłby ktoś zerknąć na poniższy kod i powiedzieć mi, dlaczego to nie chce działać poprawnie?
Po wgraniu kodu silnika wszystko działa jak należy, problem zaczyna się po dodaniu kodu wskaźnika.
Kręcąc potencjometrem wskaźnik działa lecz silnik obraca się z prędkością jakieś 2 kroki na minute.
Kod:
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);
int xmax = 128;
int ymax = 62;
int xcenter = xmax / 2;
int ycenter = ymax / 2 + 10;
int arc = ymax / 2;
int angle = 0;
char* label[] = {"LOAD", "COOLANT", "INTAKE", "VOLT"};
int labelXpos[] = {53, 45, 49, 53};
#define potmeterPin A1
int p, w, m, a = 10;
u8g_uint_t xx = 0;

// Definiuje numery pinów sterownika
const int stepPin = 3 ;
const int dirPin = 4 ;

int customDelay, customDelayMapped; // Definiuje zmienne

void gauge(uint8_t angle) {
 // Narysuj granice wskaznika
 u8g.drawCircle(xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_RIGHT);
 u8g.drawCircle(xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_RIGHT);
 u8g.drawCircle(xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_LEFT);
 u8g.drawCircle(xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_LEFT);

 // Narysuj wskaznik igly, prosta linie na dole posrodku
 float x1 = sin(2 * angle * 2 * 3.14 / 360);
 float y1 = cos(2 * angle * 2 * 3.14 / 360);
 u8g.drawLine(xcenter, ycenter, xcenter + arc * x1, ycenter - arc * y1);
 u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT);
 u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT);
 u8g.setFont(u8g_font_chikita);

 // Pokaz etykiety skali
 u8g.drawStr( 20, 42, "0");
 u8g.drawStr( 25, 18, "25");
 u8g.drawStr( 60, 14, "50");
 u8g.drawStr( 95, 18, "75");
 u8g.drawStr( 105, 42, "100");

 // Pokaz etykiete wskaznika
 u8g.setPrintPos(labelXpos[0], 32);
 u8g.print(label[0]);

 // Pokaz wartosc cyfrowa i wyrownaj jej pozycje
 u8g.setFont(u8g_font_profont22);
 u8g.setPrintPos(54, 60);
 if (w < 10) {
   u8g.print("0");
 }
 if (w > 99) {
   u8g.setPrintPos(47, 60);
 }
 u8g.print(w);
}
void setup(void) {
 // Ustawia dwa piny jako Wyjścia
 pinMode ( stepPin, OUTPUT ) ;
 pinMode ( dirPin, OUTPUT ) ;

 digitalWrite ( dirPin, HIGH ) ; // Umożliwia ruch silnika w określonym kierunku

 u8g.setFont(u8g_font_chikita);
 u8g.setColorIndex(1);
 // Przypisz domyslna wartosc koloru
 if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
   u8g.setColorIndex(255);
 }
 else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
   u8g.setColorIndex(3);
 }
 else if ( u8g.getMode() == U8G_MODE_BW ) {
   u8g.setColorIndex(1);
 }
 else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
   u8g.setHiColorByRGB(255, 255, 255);
 }
}
void loop(void) {
 customDelayMapped = speedUp ( ) ; // Pobiera niestandardowe wartości opóźnień z niestandardowej funkcji speedUp
 // Tworzy pule z niestandardowym opóźnieniem, w zależności od Potencjometru, od którego zależy prędkość silnika
 digitalWrite ( stepPin, HIGH ) ;
 delayMicroseconds ( customDelayMapped ) ;
 digitalWrite ( stepPin, LOW ) ;
 delayMicroseconds ( customDelayMapped ) ;

 p = analogRead(A0);
 w = map(p, 0, 1023, 0, 100);
 m = map(p, 0, 1023, 0, 90);
 // Pokaz igle i pokretlo
 xx = m;
 if (xx < 45) {
   xx = xx + 135;
 }
 else {
   xx = xx - 45;
 }
 // petla obrazu
 {
   u8g.firstPage();
   do {
     gauge(xx);
   }
   while ( u8g.nextPage() );
 }
}
// Funkcja odczytu Potencjometru
int speedUp ( ) {
 int customDelay = analogRead ( A0 ) ; // Odczytuje potencjometr
 int newCustom = map ( customDelay, 0 , 1023 , 300 , 4000 ) ; // Zwiększa odczyty wartości potencjometru od 0 do 1023 do żądanych wartości opóźnienia (od 300 do 4000)
 return newCustom;
}
 
Odpowiedź
  


Wiadomości w tym wątku
Problem z pracą silnika krokowego - przez brodatyh - 18-05-2018, 08:38
RE: Problem z pracą silnika krokowego - przez es2 - 19-05-2018, 18:09

Skocz do:


Przeglądający: 1 gości