PWM a Servo
PWM a Servo
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.
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.
Re: PWM a Servo
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
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
Re: PWM a Servo
Zkus jinaci pwm pin. VirtualWire obsazuje timer0. Dle typu arduina zkus pwm pin ktery ridi jinaci timer.
Re: PWM a Servo
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
které převede impulzy, co dostává servo na PWM a bude klid
Re: PWM a Servo
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
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
Re: PWM a Servo
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?
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)
{
}
}
Re: PWM a Servo
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".
Re: PWM a Servo
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.
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.
Re: PWM a Servo
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
díky MOC
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
//--------------------------------------------------------------------------------
Re: PWM a Servo
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.
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)
.
.
.
.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů