Skocz do zawartości

PWM o częstotliwość 50 Hz (czyli PWM powinien mieć częstotliwość 50 Hz (czyli okres 20 ms), a wypełnienie mieścić się w


Pomocna odpowiedź

Napisano (edytowany)

Witam !!

Prosiłbym o pomoc

Potrzebuję wygenerować PWM modelarskiego - okres 20 ms, a wypełnienie mieścić się w zakresie od 1 do 2 ms np >2 ms

Znalazłem coś takiego

const int PWM_CHANNEL = 0;    // ESP32 has 16 channels which can generate 16 independent waveforms
const int PWM_FREQ = 500;     // Recall that Arduino Uno is ~490 Hz. Official ESP32 example uses 5,000Hz
const int PWM_RESOLUTION = 8; // We'll use same resolution as Uno (8 bits, 0-255) but ESP32 can go up to 16 bits 

// The max duty cycle value based on PWM resolution (will be 255 if resolution is 8 bits)
const int MAX_DUTY_CYCLE = (int)(pow(2, PWM_RESOLUTION) - 1); 

const int LED_OUTPUT_PIN = 33;

const int DELAY_MS = 4;  // delay between fade increments

void setup() {
  
  Serial.begin(115200);

  // Sets up a channel (0-15), a PWM duty cycle frequency, and a PWM resolution (1 - 16 bits) 
  // ledcSetup(uint8_t channel, double freq, uint8_t resolution_bits);
  ledcSetup(PWM_CHANNEL, PWM_FREQ, PWM_RESOLUTION);

  // ledcAttachPin(uint8_t pin, uint8_t channel);
  ledcAttachPin(LED_OUTPUT_PIN, PWM_CHANNEL);
  Serial.println("OK" );
}
void loop() {

  // fade up PWM on given channel
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
  for(int dutyCycle = 0; dutyCycle <= MAX_DUTY_CYCLE; dutyCycle++){ 
  ledcWrite(PWM_CHANNEL, dutyCycle);
  delay(DELAY_MS);
  }
}

Czy możecie mi pomóc z konfiguracją  ? na (WT32)

Dziękuje i pozdrawiam !!

Edytowano przez robo1973

@robo1973 ten kod wygeneruje zwykły "symetryczny" PWM...ty potrzebujesz jeszcze tej pauzy ~18ms...a szukałeś jakichś bibliotek?? Napewno już coś takiego jest, i powiedz jeszcze do czego Ci taki PWM, nie możesz użyć standardowej biblioteki 'servo' ? 


#include <ESP32Servo.h>

#define przycisk 2
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 20; //Co ile ma się zmieniać pozycja serwa?

void setup() 
{ 
  pinMode(przycisk,INPUT_PULLUP);
  serwomechanizm.attach(33);  //Serwomechanizm podłączony do pinu 9
}  
void loop() 
{ 

  if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie
  serwomechanizm.write(pozycja); //Wykonaj ruch
 } else { //Jeśli nie, to powrót na początek
   pozycja = 0;
  }    
  
  pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa
  delay(200); //Opóźnienie dla lepszego efektu                        
}

standardowa to kręci chyba do 180 st

Ja potrzebuję 0-360 st

mam taki serwosilnik https://allegro.pl/oferta/serwo-robota-enkodera-360-stopni-wysoka-moc-stabilne-serwo-z-ok-17046845010?reco_id=2cb7e007-ee10-11ef-a166-7e63178ec10b&sid=f8bddad5d737919e6c726c989b66bdbe96499e13bc806f55bd0c404f69ac7020

i chcę posterować

 

Symetryczny to jest przebieg o wypełnieniu 50%, każdy inny jest niesymetryczny.

@robo1973 swój program musisz dostosować do założeń, które sam podałeś:

Okres 20ms, czyli jaka to będzie częstotliwość? (PWM_FREQ),

Impuls ma trwać 1 do 2 ms. Jakiemu wypełnieniu to odpowiada? Jak to obliczysz, to ustaw  odpowiednio granicę pętli for.

@robo1973 ale tam w aukcji jest coś o tym że dla trybu 360° potrzebujesz na wejście analogowe podawać napięcie z zakresu 0-5v, ja bym jeszcze spróbował odpalić normalny PWM a esp32 o częstotliwości ~250Hz tak żeby mieć zakres 0-4ms, może to przejdzie...nic więcej nie doradzę bo nie korzystałem z takich wynalazków jak zakres 0-360°, a jedynie wiem że można zwykle serwo przerobić na obrotowe...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...