Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:lab:lab3-2021 [2021/03/28 22:03]
alexandru.predescu [LED RGB]
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 271: Line 271:
 ===== 4. Exerciții ===== ===== 4. Exerciții =====
  
-=== Task 0 (Întreruperi și butoane) === +=== Task 0 (întreruperi / butoane) === 
 Folosiți întreruperi externe (INT și/sau PCINT) pentru a detecta apăsarea unui buton conectat la ''​PD2''​ (pin 2) și a unuia conectat la ''​PD4''​ (pin 4). Modificați starea unui LED conectat la ''​PD7''​ (pin 7) în ISR. Folosiți întreruperi externe (INT și/sau PCINT) pentru a detecta apăsarea unui buton conectat la ''​PD2''​ (pin 2) și a unuia conectat la ''​PD4''​ (pin 4). Modificați starea unui LED conectat la ''​PD7''​ (pin 7) în ISR.
  
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 345: Line 345:
 </​file>​ </​file>​
  
-=== Task 1b (LED RGB/extra) ===+=== Task 1b (LED RGB / HSV) ===
  
 Modificați programul folosind functia //​setLedColorHSV//:​ Modificați programul folosind functia //​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}}   * 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 359: Line 360:
  
  
-=== Task 2 (LED RGB/Serial) ===+=== Task 2 (LED RGB / Serial) ===
  
 Scrieți un program care primește comenzi pe serială (USART) și setează o anumită culoare a LED-ului RGB, în funcție de valorile primite pentru fiecare canal, separate prin virgulă (R,G,B). Formatul de tip [[https://​en.wikipedia.org/​wiki/​Comma-separated_values|CSV]] reprezintă o variantă simplă și flexibilă (deși mai puțin eficientă decât transmiterea în format binar, sub formă de octeți) de codificare a datelor trimise pe serială. Scrieți un program care primește comenzi pe serială (USART) și setează o anumită culoare a LED-ului RGB, în funcție de valorile primite pentru fiecare canal, separate prin virgulă (R,G,B). Formatul de tip [[https://​en.wikipedia.org/​wiki/​Comma-separated_values|CSV]] reprezintă o variantă simplă și flexibilă (deși mai puțin eficientă decât transmiterea în format binar, sub formă de octeți) de codificare a datelor trimise pe serială.
Line 393: Line 394:
  
  
-=== Task 3 (Servo/​sweep) ===+=== Task 3 (Servo / sweep) ===
  
 Conectați un servo la pinul 9 și rulați exemplul standard din Arduino, prin care se modifică în mod "​continuu"​ poziția (0-180) Conectați un servo la pinul 9 și rulați exemplul standard din Arduino, prin care se modifică în mod "​continuu"​ poziția (0-180)
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 436: Line 436:
 </​hidden>​ </​hidden>​
  
-=== 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>​
pm/lab/lab3-2021.1616958223.txt.gz · Last modified: 2021/03/28 22:03 by alexandru.predescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0