• 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
Modelarski sterownik silnika DC na Atmega8 według projektu AVT
#21
Tak ale najpierw jak zdefiniować zmienne PWM ? nie mogę się połapać bo mam 4 dwa 0=1 i dwa PWN ,do przodu bedzie na pinie 1 stan wysoki i PWN1 a przy do tyłu pin 2 wys a PWN2 i po powiedzmy powyżej 1500 jest fo przodu a piniowej do tyłu
 
Odpowiedź
#22
No nie wiem o czym gadasz. Zmienne przecież masz definiowane w przykładach, więc chyba kumasz jak to robić. Dla PWM 8 bit robisz zmienną uint8_t , to wartości 0-255. Zrób sobie ten przykład z analogami.
Reszta to typowa logika, jak masz odczytną wartość wysterowania W w zakresie 1000-2000, powiedzmy, że +/-50 to martwa strefa w okolicy 1500:
if(W>1550) //jedzie do przodu
{
sensorValue = map(W, 1550, 2000, 0, 255);

}
else if (W<1450) //jedzie do tylu (albo na odwrot)

{
sensorValue = map(W, 1450, 1000, 0, 255); //tu dane wejsciowe są odwrocone, bo min prędkość jest przy wyższej wartości
}
else sensorValue=0; //gdy 1451-1549, albo <1000 >2000
Potem tam gdzie masz wyjście wpisujesz ustaloną wartość PWM, analogWrite(pin, sensorWalue)
Mogą być też jakieś glitche z PWM w AVR, że jak się wpisuje skrajne wartości to i tak coś tam miga, czasami lepiej użyć przy 0 digitalWrite(pin,0);
{
W tych blokach robisz wszystko dla danego odczytu, ustalasz wartość PWM, ustawiasz kierunki, wpisujesz PWM
}
Nie nauczysz się programować robiąc ten jeden program, po to są proste przykłady by pokazywać dostępne funkcje i uczyć jak je używać migając LED czy wciskając przyciski, zanim się zacznie palić Arduino podłączając 230V lub silniki.
Tak jakbyś chciał zbudować jakiś model statku po tym jak nauczyłeś się używać ołówka, a nie wiesz nic o istnieniu młotka, gwoździ, wyrzynarki, drewna, wkrętarki, kleju, itp. , ani jak tego używać.
Jeśli jesteś w C/C++/Arduino na etapie "nie wiem jakie są typy zmiennych" to wróć do kursu, wyszukaj w Google podstawowe informacje, zrób 500 przykładów by Ci się nie myliło co jest białe a co czarne.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#23
Masz wiele racji, właśnie chce zrobić ten regulator w liczbie 4 szt. i może jeszcze jakieś przełączniki reagując na RC i chyba nic więcej, z tych listingów próbowałem usunąć sterowanie drugim kanałem ale nic z tego nie wychodzi.
 
Odpowiedź
#24
Zrobiłem jakiś postęp bo piny sterowania analogowego działaja tak jak chce ale mapowanie niestety nie przynajmnie nie widzę w serialu, jest to szkic z delay a resztę kosmetyki to zrobię, /jaki tym razem błąd ?
Kod:
/* test z monitorowaniem wartosci kanału na arduino nano
*/
//definicje kanalow
#define CH1 2
// Motor A Control Connections

#define pwmB 15 //Atmega PB1-15
#define pwmA 16 //Atmega PB2-16
#define in1A 13 //At PB5-13
#define in2A 12 //At PB5


//zmienne
//kontrola silnika
//void mControlA(int mspeed, int mdir) {


//  }
int ch1Value;
int pwnValue;
//czytaj kanał
int readChannel(int channelInput, int minLimit, int maxLimit, int defaultValue){
  int ch = pulseIn(channelInput, HIGH, 30000);
  if (ch < 100) return defaultValue;
  return map(ch, 1000, 2000, minLimit, maxLimit);

}
//
bool readSwitch(byte channelInput, bool defaultValue){
  int intDefaultValue = (defaultValue)? 100: 0;
  int ch = readChannel(channelInput, 0, 100, intDefaultValue);
  return (ch > 50);
}
  //***********************************************************************
  void setup(){
  // Set up serial monitor
  Serial.begin(115200);
  pinMode(CH1, INPUT);
 
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(in1A, OUTPUT);
  pinMode(in2A, OUTPUT);
  }
//*************************************************************************
void loop() {
// CH1 = readChannel(0, -100, 100, 0);
// Set forward/backward direction with channel 2 value
   if (ch1Value >= 0) {
     // Forward
     digitalWrite(in1A , HIGH);
     digitalWrite(in2A , LOW);
     pwnValue= map(ch1Value, 0 ,100 , 0 , 255);//nie mapuje
       //in1A==pwnValue;
       //analogWrite(int1A , pwnValue);
      Serial.println("   Forward");
       Serial.print(      pwnValue);//nie wyswietla
     
      } else {
     
       //Backward
    digitalWrite(in1A , LOW);
    digitalWrite(in2A , HIGH);
    Serial.println("   Backward");
    Serial.print(pwnValue);
   
   
   
        }
  ch1Value = readChannel(CH1, -100, 100, -100);
  Serial.print("Ch1: ");
  Serial.print(ch1Value);

  //Serial.print(in2a);


  delay(200);
  }
 
Odpowiedź
#25
Mam taki problem bo przy mapowamiu zmienna pwM1a przyjmuje wartości powyżej 255 a nie wiem jak zapisać ze jezeli pwm>od 255 to jest równe 255 i tez nie wiem dlaczego przy minimum jest równe 1
Kod:
  //poczatek do produ
    if(nThrottleIn>1550){
     
        pwM1a = map( nThrottleIn ,1550, 1995, 0, 255);
czyli poniżej 1550 jest 1 a powyżej 1995 przekracza 255
 
Odpowiedź
#26
Trzeba ustawiać prawidłowo drabinkę if.
Najpierw dzielisz if>1550 i tu map to nie zagra, będzie mapować też 2000, ale jeśli wcześniej dasz if>1950 pwM1a = 255, a potem else if>1550 pwM1a = map( nThrottleIn ,1550, 1995, 0, 255); to do funkcji map nie podasz wartości większej od 1995, bo jeśli taka będzie to w pierwszym if od razu zapodasz do zmiennej pwM1a 255.
 
Odpowiedź
#27
Czyli najpierw ograniczyć zakresy a potem mapować ? to ma sens ale jak to dokładnie zapisać ?
 
Odpowiedź
#28
No nie bardzo rozumiem problem, chodzi tylko o zachowanie stopniowania if'ów.
Wypisujesz wszystkie istotne granice, wybierasz operator >,<=,>=,> w zależności do którego zbioru ma wartość być przypisana, jak stopniujesz w górę to wybierasz te z <, jak w dół to od >. NP. 1050, 1450, 1550, 1950
Kod:
if(z<1050)
{
funkcja1();
funkcja2();
//wszystkie polecenia w tych klamerkach są do z<1050 i jeśli to się wykonuje to żaden kolejny else if już nie
}
else if (z<1450)
{
//wszystkie polecenia w tych klamerkach są do z<1450 i jeśli to się wykonuje to żaden kolejny else if już nie
//ale są też dla z>=1050  bo skoro tu się znaleźliśmy to poprzedni warunek nie był spełniony;
}
else if (z<1550)
{
//wszystkie polecenia w tych klamerkach są do z<1550 i jeśli to się wykonuje to żaden kolejny else if już nie
//ale są też dla z>=1450  bo skoro tu się znaleźliśmy to poprzedni warunek nie był spełniony
}
else if (z<=1950)
{
//itd.
}
else
{
//czyli pwm=255; i nic z powyzszych sie nie wykonywalo, z miało wartość powyżej 1950
//jak jest jedno polecenie za if lub else to nie musi być klamerek
}
ZupelnieInnafunkcjaNieZwiazanaZifami();//bo jest za klamra od bloku programu przypisanego do else i wykona się zawsze niezależnie od wcześniejszych porównań.


Przeczytałem cały watek i obawiam się, że jak nie przeczytasz jakiś podstaw języka C to będziesz się miotał jak ryba na plaży, bo każda elementarna zasada jest zaskoczeniem i stopuje Cię na wiele dni.
 
Odpowiedź
#29
Czytam na bieżąco i się uczę na tym przykładzie
 
Odpowiedź
#30
A jak zapisać pomiedzy czyli mniejsze niż 1550 a większe niż 1450 ?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości