PWM a Servo

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

PWM a Servo

Příspěvek od Ludek » 26 dub 2022, 06:59

Lidi zdravím,
máte někdo nějakou myšlenku, jak mohu použít současně Modelářské servo a PWM pro DC motorek?
Zvedl jsem frekvenci na 3,9kHz,
TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
to funguje, ale jakmile přidám servo, PWM nejde. Zřejmě stejný časovač.
díky za radu.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: PWM a Servo

Příspěvek od Ludek » 26 dub 2022, 09:21

Tak zpatky na stromy ...
Ono to není konflikt Serva a PWM, ale s knihovnou VirtualWire, kterou potřebuji pro přijímaš 433MHz.
a tak musím znovu a najít něco lepšího pro Rx. Kdyby Někoho něco napadlo, budu velmi Happy

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: PWM a Servo

Příspěvek od kiRRow » 26 dub 2022, 14:26

Zkus jinaci pwm pin. VirtualWire obsazuje timer0. Dle typu arduina zkus pwm pin ktery ridi jinaci timer.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: PWM a Servo

Příspěvek od Ludek » 26 dub 2022, 19:48

Jo zkoušel jsem, ale pořád to koliduje. A tak tam přidám nějaké mini ATtiny,
které převede impulzy, co dostává servo na PWM a bude klid :-)

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: PWM a Servo

Příspěvek od Ludek » 27 dub 2022, 15:25

Tak to asi nezvládnu. Myslel jsem si, jak to bude jednoduché a ejhle....
Dokáže někdo toto :
impulzy 0,5 - 2,5 ms, které se opakují po 20ms připojit na vstup ATtiny,
a on bude dělat PWM třeba 4 - 16 kHz tak, že 0,5ms je 0% střída a 2,5ms je 100% střída
:-(

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: PWM a Servo

Příspěvek od Ludek » 27 dub 2022, 17:21

Je možné nastavit PWM (třeba 3,9kHz) už v SETUPU?
A pak bych měnil jen střídu v Loop, změnou hodnoty nějakého registru.
Prostě aby PWM běžel bez ohledu na probíhající kod, aby to nerušil a nezpoždoval...
Na ATtiny 85 jsem něco našel, jde to upravit pro UNO?

Kód: Vybrat vše

#include<avr/io.h>
void PWM_config()
{
DDRB =(1<<PB1)|(1<<PB0); // set PB1 and PB0 as output to enable PWM generation
TCCR0A=0x00;             //Normal mode
TCCR0A|=(1<<WGM00)|(1<<COM0A1)|(1<<COM0B1)|(1<<COM0A0)|(1<<COM0B0);
TCCR0B=0x00;
TCCR0B |= (1<<CS00)|(1<<CS02);   //prescaling with 1024
TCNT0=0;
OCR0A=150;            //Generating PWM of 58.9% duty cycle from OC0A 
OCR0B=250;           //Generating PWM of 98% duty cycle from OC0B 
}
int main()
{
  PWM_config();
  while(1)
  {
 
  }
}

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: PWM a Servo

Příspěvek od Caster » 27 dub 2022, 21:48

Neprogramoval bych přímo registry, ale použil standardní funkce nebo nějakou Arduino knihovnu na PWM viz např. příklad v článku "DC Motor Speed Control Using Arduino".

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: PWM a Servo

Příspěvek od Ludek » 28 dub 2022, 12:41

Jo to jo, to funguje, ale ten motorek "ječí", a tak potřebuji aspoň 3,9kHz
a to knihovna neumí. A tak jsem si myslel, jestli lze mít PWM na pozadí,
a v klidu, bez zadrhnutí mu změnit střídu.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: PWM a Servo

Příspěvek od Ludek » 28 dub 2022, 17:47

Tak jsem to vzdal a udělal samostatný MINI modul se SMD ATtiny.
Funguje to tak, že kašlu na PWM od Arduina a beru pulzy stejné jako má servo.
A tak toto udělátko převede pulzy 1,0 - 2,0 ms, ev 0,8 - 2,2 ms (dle potřeby),
na PWM 3,9kHz 0 - 100%. Nekoktá to, PWM pracuje samostatně, paráda.
ALE PROSÍM !!!
můžete mi někdo překodovat nastavení registru?
Mám to pro UNO, ale rád bych to dal do toho ATtiny85. Koukněte :-(

Kód: Vybrat vše

int  Pulse_In = 7;                              // vstup "servo" pulzu
int  PWout    = 9;                              // PWM výstup
byte Duty;                                      // promenna pro byte 0-255
int  Puls_Time;                                 // promenna pro delku pulsu v usec
//--------------------------------------------------------------------------------
void setup() {
    pinMode(Pulse_In,INPUT);                    // nastavi vstup
    pinMode(PWout, OUTPUT);                     // nastavi vystup
    TCCR1B = TCCR1B & B11111000 | B00000010;    // set timer 1  div8
  }                                             // PWM freq.3921.16 Hz
//--------------------------------------------------------------------------------
void loop() {                                   // meni Duty PWM nezavisle
  Puls_Time = pulseIn(Pulse_In, HIGH);          // zmeri sirku impulzu
  Duty = map(Puls_Time, 1000, 2000, 0, 255);    // servo impulz = 1-2ms (0,8-2,0)
  analogWrite(PWout,Duty);                      // meni PWM 0 - 100%
  }                                             // a to vse porad dokola
//--------------------------------------------------------------------------------
díky MOC

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: PWM a Servo

Příspěvek od AstroMiK » 28 dub 2022, 19:48

Tady je kus kódu, který používám na ovládání ventilátoru v Raspberry Pi pomocí ATtiny85.
Frekvence je tam ale nastavena až na 32kHz, protože při nižší frekvenci hučely reproduktory.
Změna frekvence má vliv na funkci delay().
Funkce delayMicroseconds() zůstává neovlivněna.
Nevím, jak by se v tomhle případě chovala funkce pulseIn(), kterou ve svém programu používáš. To by se muselo vyzkoušet.

Kód: Vybrat vše

.
.
.
.

pinMode(0,OUTPUT);                                      // PB0 na vystup  
digitalWrite(0,LOW);                                    // Ventilator vypnout
.
.
.
.

TCCR0B = TCCR0B & 0b11111101 | 0x01;                     // frekvence PWM na neslysitelnych 32kHz
.
.
.
.

analogWrite(0,pwm);                                      // PWM na pin PB0  (promenna 'pwm' v rozsahu 0 az 255)
.
.
.
.


Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů