This shows you the differences between two versions of the page.
pm:lab:lab3-2021 [2021/03/28 22:05] alexandru.predescu [4. Exerciții] |
pm:lab:lab3-2021 [2021/04/02 10:55] (current) alexandru.predescu [4. Exerciții] |
||
---|---|---|---|
Line 83: | Line 83: | ||
Astfel, tensiunea medie care ajunge la dispozitiv este dată de relația: D * Vcc. | Astfel, tensiunea medie care ajunge la dispozitiv este dată de relația: D * Vcc. | ||
- | {{.:lab3:avr_pwm_01.jpg?600|Figura 8. Semnal PWM cu diferiți factori de umplere}} | + | {{.:lab3:avr_pwm_01.jpg?700|Figura 8. Semnal PWM cu diferiți factori de umplere}} |
Modularea folosește variația factorului de umplere a unui semnal dreptunghiular pentru a genera la ieșire o tensiune analogică. Considerând o formă de undă dreptunghiulară //f(t)// cu o valoare minimă //ymin=0// și o valoare maximă //ymax// și factorul de umplere //D// (ca în figură) valoarea medie a formei de undă e dată de relația: | Modularea folosește variația factorului de umplere a unui semnal dreptunghiular pentru a genera la ieșire o tensiune analogică. Considerând o formă de undă dreptunghiulară //f(t)// cu o valoare minimă //ymin=0// și o valoare maximă //ymax// și factorul de umplere //D// (ca în figură) valoarea medie a formei de undă e dată de relația: | ||
Line 160: | Line 160: | ||
<note important> | <note important> | ||
- | Frecvența semnalului PWM depinde de prescaler și de frecvența oscilatorului. Din secțiunea 15.9.3 (pag 102), formula de calcul a frecvenței în modul Fast PWM este: | + | Frecvența semnalului PWM depinde de prescaler și de frecvența oscilatorului. Din secțiunea 15.9.3 (pag 102), formula de calcul a frecvenței în modul Fast PWM 8-bit este: |
\begin{equation} | \begin{equation} | ||
- | f_{OCnX}=\frac{f_{clk}}{N \cdot 256} | + | f_{OCnX}=\frac{f_{clk}}{N \cdot (TOP + 1)}=\frac{f_{clk}}{N \cdot 256} |
\end{equation} </note> | \end{equation} </note> | ||
Line 209: | Line 209: | ||
==== AnalogWrite ==== | ==== AnalogWrite ==== | ||
- | Funcția //analogWrite// din Arduino, configurează de fapt un timer în modul Fast PWM pe 8 biți și poate genera semnal PWM (doar) pe pinii asociați unuia dintre timer-e. ''analogWrite(pin_arduino, value_0_255)'' De exemplu, pe Atmega328p avem următorii pini care pot genera semnal PWM folosind funcția //analogWrite//: | + | Funcția //analogWrite// din Arduino, configurează de fapt un timer în modul Fast PWM pe 8 biți și poate genera semnal PWM (doar) pe pinii asociați unuia dintre timer-e. ''analogWrite(pin_arduino, value_0_255)'' De exemplu, pe Arduino/Atmega328p avem următorii pini care pot genera semnal PWM folosind funcția //analogWrite//: |
^ Pin Arduino ^ Pin Atmega328p ^ Timer output ^ Frecvența PWM (default) ^ | ^ Pin Arduino ^ Pin Atmega328p ^ Timer output ^ Frecvența PWM (default) ^ | ||
Line 300: | Line 300: | ||
=== Task 1a (LED RGB) === | === Task 1a (LED RGB) === | ||
- | Conectați un LED RGB la pinii 9, 10, 11 de pe Arduino folosind câte o rezistență de 330ohm și rulați programul de mai jos: | + | Conectați un LED RGB catod comun la pinii 9, 10, 11 de pe Arduino folosind câte o rezistență de 330ohm și rulați programul de mai jos: |
* Observați modificarea culorii LED-ului | * Observați modificarea culorii LED-ului | ||
Line 350: | Line 350: | ||
* Funcția //setLedColorHSV// permite modificarea culorii folosind reprezentarea alternativă HSV (Hue Saturation Value), fiind mai ușor apoi de modificat culoarea, saturația și intensitatea luminoasă. {{:pm:lab:lab3_2021:hsv.txt|setLedColorHSV}} | * Funcția //setLedColorHSV// permite modificarea culorii folosind reprezentarea alternativă HSV (Hue Saturation Value), fiind mai ușor apoi de modificat culoarea, saturația și intensitatea luminoasă. {{:pm:lab:lab3_2021:hsv.txt|setLedColorHSV}} | ||
+ | * Setați valorile pentru saturație (s) și intensitate (v) pe 1 și modificați culoarea (h) în intervalul 0-360 | ||
Pentru a urmări corespondența dintre cele 2 reprezentări (RGB și HSV) există selectoare de culori precum: | Pentru a urmări corespondența dintre cele 2 reprezentări (RGB și HSV) există selectoare de culori precum: | ||
Line 413: | Line 414: | ||
void setup() { | void setup() { | ||
myservo.attach(9); // attaches the servo on pin 9 to the servo object | myservo.attach(9); // attaches the servo on pin 9 to the servo object | ||
- | setup_interrupts(); | ||
// test led | // test led | ||
DDRD |= (1 << PD7); | DDRD |= (1 << PD7); | ||
Line 438: | Line 438: | ||
=== Task 4 (Servo / buton) === | === Task 4 (Servo / buton) === | ||
- | Folosind întreruperile de la **Task 0**, modificați incremental poziția servomotorului (0-180): | + | Folosind întreruperile de la **Task 0**, modificați incremental poziția servomotorului (0-180) |
| | ||
{{:pm:lab:lab3_2021:button_servo.png?600|}} | {{:pm:lab:lab3_2021:button_servo.png?600|}} | ||
Line 444: | Line 444: | ||
* Atenție la limite (min, max). Depășirea acestora poate avaria servomotorul. | * Atenție la limite (min, max). Depășirea acestora poate avaria servomotorul. | ||
* Dacă lucrați pe placă, folosiți debouncing pentru a obține o funcționare corectă (o apăsare va incrementa o singură dată poziția) | * Dacă lucrați pe placă, folosiți debouncing pentru a obține o funcționare corectă (o apăsare va incrementa o singură dată poziția) | ||
- | * Există și servomotoare care folosesc un alt interval de comenzi (ex. 700-2300), se poate folosi funcția //writeMicroseconds// pentru a controla direct durata pulsului. [[https://www.arduino.cc/en/Reference/ServoWriteMicroseconds|Servo.writeMicroseconds]] | + | * Există și servomotoare care folosesc un alt interval de comenzi (ex. 0.7ms-2.3ms), se poate folosi funcția //writeMicroseconds// pentru a controla direct durata pulsului. [[https://www.arduino.cc/en/Reference/ServoWriteMicroseconds|Servo.writeMicroseconds]] |
<hidden> | <hidden> |