<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PWM Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/pwm/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/pwm/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Thu, 18 Mar 2021 10:47:02 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>PWM Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/pwm/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pilotare striscia LED RGB</title>
		<link>https://logicaprogrammabile.it/pilotare-striscia-led-rgb-arduino/</link>
					<comments>https://logicaprogrammabile.it/pilotare-striscia-led-rgb-arduino/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Fri, 01 Mar 2013 12:03:34 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Domotica]]></category>
		<category><![CDATA[Led]]></category>
		<category><![CDATA[PWM]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3390</guid>

					<description><![CDATA[<p>Come usare Arduino per pilotare strip led RGB La tecnologia di illuminazione a led si è ormai evoluta ed inizia ad essere presente in modo pronunciato in molti ambienti, dalla casa agli uffici fino ad arrivare all&#8217;illuminazione pubblica (vedi progetto di lampada di cortesia a...</p>
<p>The post <a href="https://logicaprogrammabile.it/pilotare-striscia-led-rgb-arduino/">Pilotare striscia LED RGB</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come usare Arduino per pilotare strip led RGB</h1>
<p>La tecnologia di illuminazione a led si è ormai evoluta ed inizia ad essere presente in modo pronunciato in molti ambienti, dalla casa agli uffici fino ad arrivare all&#8217;illuminazione pubblica (<a href="https://logicaprogrammabile.it/attiny85-costruire-lampada-led-batteria/">vedi progetto di lampada di cortesia a led</a>).</p>
<p>I vantaggi in termini di risparmio energetico sono enormi e la qualità della luce emessa sta raggiungendo un comfort visivo soddisfacente.</p>
<p>Anche nell&#8217;arredamento troviamo soluzioni molto interessanti che vanno dalla lampada da salotto multicolore alle luci di cortesia nei piani cottura oppure alle barre led impermeabili poste nel box doccia.</p>
<p>Vista la nostra passione per l&#8217;auto-costruzione possiamo realizzare un dispositivo basato su Arduino per pilotare una barra led RGB. Per questo tutorial ho usato una Arduino Leonardo e uno spezzone di <a href="http://www.amazon.it/gp/product/B012NOSAOS/ref=as_li_ss_tl?ie=UTF8&amp;camp=3370&amp;creative=24114&amp;creativeASIN=B012NOSAOS&amp;linkCode=as2&amp;tag=logicaprogram-21" target="_blank" rel="nofollow noopener">10 cm di una strip led RGB da un metro</a>. Questo modello viene alimentato a 12Vdc e un modulo assorbe, con tutti i led accesi circa 55mA (quindi un metro assorbe circa 550mA).</p>
<p>Un elemento <strong>RGB</strong> è composto da 3 LED distinti (LED <strong>Rosso</strong>, LED <strong>Verde</strong>, LED <strong>Blu</strong>) disposti in modo da poter interagire tra loro per formare diversi colori complementari.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Strip_LED.png"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-3398" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Strip_LED.png" alt="Stril Led RGB da 10 cm" width="527" height="138" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Strip_LED.png 527w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/Strip_LED-300x78.png 300w" sizes="(max-width: 527px) 100vw, 527px" /></a></p>
<p><span id="more-3390"></span></p>
<p>Il modo più semplice per accendere i led è di collegare uno dei pin (B,R,G) verso massa; non è necessario utilizzare delle resistenze per limitare la corrente perché sono già integrate nel circuito.</p>
<p>Vediamo ora come usare Arduino per accendere e spegnere singolarmente i vari led. Il circuito da realizzare è il seguente e si basa su tre transistor PNP tipo BC337.</p>
<figure id="attachment_3402" aria-describedby="caption-attachment-3402" style="width: 563px" class="wp-caption aligncenter"><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Arduino_Leonardo_Strip_LED_RGB.png"><img decoding="async" class="wp-image-3402 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Arduino_Leonardo_Strip_LED_RGB.png" alt="Controllo strip led rbg" width="563" height="539" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Arduino_Leonardo_Strip_LED_RGB.png 563w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/Arduino_Leonardo_Strip_LED_RGB-300x287.png 300w" sizes="(max-width: 563px) 100vw, 563px" /></a><figcaption id="caption-attachment-3402" class="wp-caption-text">Circuito per pilotare strip led rgb</figcaption></figure>
<p>Le basi dei tre transistors sono collegate ai pin 3, 5 e 6 non a caso poiché su questi pin è disponibile anche il segnale PWM che utilizzeremo per andare a pilotare i <strong>led RGB</strong> in modo migliore.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">void setup()
{
 //led Rosso
 pinMode(5, OUTPUT);
 //led verde
 pinMode(6, OUTPUT);
 //led blu
 pinMode(3, OUTPUT);
 //init seriale
 Serial.begin(9600);
}

void loop() 
{
 //se arrivano dati...
 if (Serial.available())
 {
  //leggi il carattere in arrivo
  byte data = Serial.read();
  if(data == 'q') //accende il led blu
   digitalWrite(3, HIGH);
  else if (data == 'w') //spegne il led blu
   digitalWrite(3, LOW);
 
  if(data == 'a') //accende il led verde
   digitalWrite(5, HIGH);
  else if (data == 's') //spegne il led verde
   digitalWrite(5, LOW);
  if(data == 'z') //accende il led rosso
   digitalWrite(6, HIGH);
  else if (data == 'x') //spegne il led rosso
   digitalWrite(6, LOW);
 }
}</pre>
<p>Il codice precedente permette di accendere o spegnere i led inviando tramite serial monitor dei caratteri di comando. L&#8217;effetto che otteniamo è una miscelazione dei colori.</p>
<p>Un maggior controllo dei led RGB possiamo ottenerlo utilizzando il segnale PWM generato da Arduino. In questo modo abbiamo la possibilità di creare dissolvenze per creare combinazioni di colori visivamente più interessanti.<br />
Il codice seguente permette di accendere e spegnere il led BLU in modo graduale tramite una dissolvenza:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">void setup()
{
 //led Rosso
 pinMode(5, OUTPUT);
 //led verde
 pinMode(6, OUTPUT);
 //led blu
 pinMode(3, OUTPUT);
 //init seriale
 Serial.begin(9600);
}

void loop()
{
 //Aumenta il duty cycle da 100% a 0%
 for(byte sfuma = 0; sfuma &lt; 255; sfuma++)
 {
  analogWrite(3, sfuma);
  delay(40);
 }
 //diminuisci il duty cycle da 100% a 0%
 for(byte sfuma = 255; sfuma &gt; 0; sfuma--)
 {
  analogWrite(3, sfuma);
  delay(40);
 }
}</pre>
<p>Se volessi miscelare i colori potrei scrivere qualcosa del genere</p>
<pre class="EnlighterJSRAW" data-enlighter-language="avrasm">void setup()
{
 //led Rosso
 pinMode(5, OUTPUT);
 //led verde
 pinMode(6, OUTPUT);
 //led blu
 pinMode(3, OUTPUT);
 //init seriale
 Serial.begin(9600);
}

void loop()
{
 //accendo il led rosso
 digitalWrite(6, HIGH);
 //Aumenta il duty cycle da 100% a 0%
 for(byte sfuma = 0; sfuma &lt; 255; sfuma++)
 {
  analogWrite(3, sfuma);
  delay(40);
 }

 //spengo il rosso
 digitalWrite(6, LOW);
 //accendo il verde
 digitalWrite(5, HIGH);
 //diminuisci il duty cycle da 100% a 0%
 for(byte sfuma = 255; sfuma &gt; 0; sfuma--)
 {
  analogWrite(3, sfuma);
  delay(40);
 }
}</pre>
<p>Le combinazioni che possiamo creare sono innumerevoli, potete provare a sperimentare creando effetti luminosi che possono abbellire i vostri ambienti.</p>
<p>The post <a href="https://logicaprogrammabile.it/pilotare-striscia-led-rgb-arduino/">Pilotare striscia LED RGB</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/pilotare-striscia-led-rgb-arduino/feed/</wfw:commentRss>
			<slash:comments>43</slash:comments>
		
		
			</item>
		<item>
		<title>Servo SG-5010 come controllarlo con Netduino tramite segnale PWM</title>
		<link>https://logicaprogrammabile.it/netduino-controllare-servo-sg5010/</link>
					<comments>https://logicaprogrammabile.it/netduino-controllare-servo-sg5010/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Tue, 18 Oct 2011 08:08:59 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[Duty Cycle]]></category>
		<category><![CDATA[Netduino]]></category>
		<category><![CDATA[PWM]]></category>
		<category><![CDATA[Servo]]></category>
		<category><![CDATA[SG-5010]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2095</guid>

					<description><![CDATA[<p>Utilizzare la classe PWM per controllare un servo 0-180 gradi Il servo meccanismo è un dispositivo capace di eseguire dei movimenti meccanici in funzione del segnale applicato al suo ingresso. Viene utilizzato spesso per eseguire lavori continui, ovvero per controllare meccanismi che non possono essere...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-controllare-servo-sg5010/">Servo SG-5010 come controllarlo con Netduino tramite segnale PWM</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Utilizzare la classe PWM per controllare un servo 0-180 gradi</h1>
<p>Il servo meccanismo è un dispositivo capace di eseguire dei movimenti meccanici in funzione del segnale applicato al suo ingresso. Viene utilizzato spesso per eseguire lavori continui, ovvero per controllare meccanismi che non possono essere azionati continuamente da personale umano.  In campo hobbystico viene impegnato per azionamenti a distanza tipici del radio modellismo.</p>
<p style="text-align: center;"><img decoding="async" class="size-full wp-image-2100 aligncenter" title="Servo_SG_5010" src="https://logicaprogrammabile.it/wp-content/uploads/2011/10/Servo_SG_5010.jpg" alt="Servo meccanismo TowerPro sg-5010" width="396" height="292" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/10/Servo_SG_5010.jpg 396w, https://logicaprogrammabile.it/wp-content/uploads/2011/10/Servo_SG_5010-300x221.jpg 300w" sizes="(max-width: 396px) 100vw, 396px" /></p>
<p><span id="more-2095"></span>Le caratteristiche comuni tra i servo sono principalmente, l&#8217;angolo di rotazione, la velocità di rotazione e la <a href="http://it.wikipedia.org/wiki/Coppia_motrice" target="_blank">coppia motrice</a>.<br />
Il modello <strong>SG-5010</strong> che ho acquistato viene prodotto dalla <a href="http://www.towerpro.com.tw/" target="_blank">TowerPro</a> e le sue caratteristiche tecniche sono elencate nella tabella seguente:</p>
<div align="center">
<table style="width: 383px;" align="center">
<tbody align="center">
<tr>
<td><strong>Segnale di pilotaggio</strong></td>
<td style="text-align: left;">PWM</td>
</tr>
<tr>
<td><strong>Tensione Alimentazione</strong></td>
<td style="text-align: left;">da 4.8Vdc a 6.0 Vdc</td>
</tr>
<tr>
<td><strong>Velocità</strong></td>
<td style="text-align: left;">a 4.8Vdc 0.2  S/60°<br />
a 6.0Vdc 0.16 S/60°</td>
</tr>
<tr>
<td><strong>Coppia</strong></td>
<td style="text-align: left;">a 4.8Vdc 5.5 Kg/cm<br />
a 6.0Vdc 6.5 Kg/cm</td>
</tr>
<tr>
<td><strong>Intervallo di rotazione</strong></td>
<td style="text-align: left;">0 &#8211; 180 gradi</td>
</tr>
<tr>
<td><strong>Peso</strong></td>
<td style="text-align: left;">38g</td>
</tr>
<tr>
<td><strong>Dimensioni</strong></td>
<td style="text-align: left;">40x20x40 mm</td>
</tr>
<tr>
<td><strong>Costo</strong></td>
<td style="text-align: left;">Circa 10 €</td>
</tr>
</tbody>
</table>
</div>
<p>Il suo funzionamento è veramente elementare, tutto si riduce nell&#8217;utilizzo del segnale <a href="http://it.wikipedia.org/wiki/Pulse-width_modulation" target="_blank"><strong>PWM</strong></a> variando il valore di <a title="PWM gestione col Netduino" href="https://logicaprogrammabile.it/netduino-gestione-pwm/">duty cycle</a> tra 1% e 50% .<br />
Per convenienza possiamo alimentare il servo tramite il pin 5Vdc del Netduino, anche se per applicazioni operative consiglio vivamente di alimentare il servo con una tensione esterna, evitando in questo modo di sovraccaricare il Netduino rendendolo instabile.<br />
Il TowerPro Sg-5010 dispone di tre fili con colori che possono essere ambigui infatti il filo marrone deve essere collegato a massa, il filo rosso deve essere collegato alla +5Vdc e il filo arancione va collegato ad un pin PWM del Netduino (Pin 5-6-9-10).</p>
<p>In via generale il segnale PWM tipico deve avere una frequenza di 50Hz (Periodo di 20mS), mentre l&#8217;impulso positivo del segnale deve avere una larghezza compresa tra 1ms e 2ms, infatti per portare l&#8217;asse del servo nella posizione centrale la larghezza dovrà essere di 1.5ms (zero gradi) per portare l&#8217;asse a +90° l&#8217;impulso deve essere largo 2ms mentre per portare l&#8217;asse a -90° l&#8217;impulso dovrà essere largo 1ms.</p>
<p>L&#8217;illustrazione seguente aiuta a capire meglio il funzionamento</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2132" title="ServoDutyCycle" src="https://logicaprogrammabile.it/wp-content/uploads/2011/10/ServoDutyCycle1.gif" alt="Impostazione periodo pwm servo meccanismo" width="564" height="449" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/10/ServoDutyCycle1.gif 564w, https://logicaprogrammabile.it/wp-content/uploads/2011/10/ServoDutyCycle1-300x238.gif 300w" sizes="auto, (max-width: 564px) 100vw, 564px" /></p>
<p>Il codice che andremmo a scrivere dovrà generare un segnale pwm con una frequenza di 50Hz e con un impulso la cui larghezza dovrà variare da 1ms sino a 2ms, questo è possibile utilizzando la classe PWM e il metodo SetPulse(), per maggiori informazioni riguardo questa classe vi consiglio di leggere <a title="PWM gestione col Netduino" href="https://logicaprogrammabile.it/netduino-gestione-pwm/">questo articolo</a></p>
<pre class="lang:c# decode:true ">// Istanzio un oggetto pwm
// Setto il pin 9 come uscita pwm
PWM servo = new PWM(Pins.GPIO_PIN_D9);

while (true)
{
  //imposto una frequenza di circa 50Hz
  //con un impulso di 1.5ms
  //l'asse del servo viene posizionato a 0°
  servo.SetPulse(20000, 1500);
  //attendo 2 secondi
  Thread.Sleep(2000);

  //imposto la frequenza sempre a 50Hz
  //con un impulso di 1ms
  //l'asse del servo si posiziona a -90°
  servo.SetPulse(20000, 1000);
  Thread.Sleep(2000);

  //imposto la frequenza sempre a 50Hz
  //con un impulso di 2ms
  //l'asse del servo si posiziona a +90°
  servo.SetPulse(20000, 2000);
  Thread.Sleep(2000);
}</pre>
<p>&nbsp;</p>
<p>Il codice esegue continuamente, ogni due secondi, la rotazione dell&#8217;asse del servo. Sicuramente i valori di larghezza generati non portano alla rotazione completa dell&#8217;asse del servo, questo perché anche se si ha una certa standardizzazione ci possono essere delle differenze tra i vari modelli.</p>
<p>Quindi sarà necessaria una calibrazione per capire quali sono i valori limite che portano alla rotazione di 180° dell&#8217;asse. Eseguendo il codice precedente potremo vedere se l&#8217;asse compie una manovra di 180° se per esempio non raggiunge i limiti di -90° e +90° possiamo aumentare e diminuire della stessa quantità la larghezza degli impulsi relativa a questi limiti ad esempio portando il valore di 1000 (1ms) a 800 (0.8ms) e il valore di 2000 (2ms) a 2200 (2.2ms).</p>
<p>Tabella riepilogativa</p>
<div align="center">
<table>
<tbody>
<tr>
<td>Gradi Asse Servo</td>
<td>Larghezza impulso</td>
<td>Valore duration da passare alla SetPulse()</td>
</tr>
<tr>
<td style="text-align: center;">0 Gradi</td>
<td style="text-align: center;">1.5ms</td>
<td style="text-align: center;">1500</td>
</tr>
<tr>
<td style="text-align: center;">-90 Gradi</td>
<td style="text-align: center;">1ms</td>
<td style="text-align: center;">1000</td>
</tr>
<tr>
<td style="text-align: center;">+90 Gradi</td>
<td style="text-align: center;">2ms</td>
<td style="text-align: center;">2000</td>
</tr>
</tbody>
</table>
</div>
<p>Col servo in mio possesso ho dovuto cambiare i valori della larghezza dell&#8217;impulso in questo modo</p>
<div align="center">
<table>
<tbody>
<tr>
<td style="text-align: center;" colspan="3">Valori per il mio servo</td>
</tr>
<tr>
<td>Gradi Asse Servo</td>
<td>Larghezza impulso</td>
<td>Valore duration da passare alla SetPulse()</td>
</tr>
<tr>
<td style="text-align: center;">0 Gradi</td>
<td style="text-align: center;">1.5ms</td>
<td style="text-align: center;">1500</td>
</tr>
<tr>
<td style="text-align: center;">-90 Gradi</td>
<td style="text-align: center;">0.6ms</td>
<td style="text-align: center;">600</td>
</tr>
<tr>
<td style="text-align: center;">+90 Gradi</td>
<td style="text-align: center;">2.4ms</td>
<td style="text-align: center;">2400</td>
</tr>
</tbody>
</table>
</div>
<p>In questo modo abbiamo capito quali sono i valori limite per il nostro servo, questo è fondamentale per impostare la larghezza dell&#8217;impulso per spostare l&#8217;asse anche nei valori intermedi.</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-controllare-servo-sg5010/">Servo SG-5010 come controllarlo con Netduino tramite segnale PWM</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-controllare-servo-sg5010/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>PWM gestione col Netduino</title>
		<link>https://logicaprogrammabile.it/netduino-gestione-pwm/</link>
					<comments>https://logicaprogrammabile.it/netduino-gestione-pwm/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 16 Mar 2011 14:48:26 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[Duty Cycle]]></category>
		<category><![CDATA[Netduino]]></category>
		<category><![CDATA[PWM]]></category>
		<category><![CDATA[SetDutyCycle]]></category>
		<category><![CDATA[SetPulse]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=412</guid>

					<description><![CDATA[<p>Come generare un segnale PWM I pin digitali del Netduino, come sapiamo, possono svolgere anche delle funzioni aggiuntive, in particolare i pin 5, 6, 10 ed 11 sono in grado di generare un segnale pwm (Pulse Width Modulation). Utilizzando questa funzione possiamo generare un segnale...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-gestione-pwm/">PWM gestione col Netduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come generare un segnale PWM</h1>
<p>I pin digitali del Netduino, come sapiamo, possono svolgere anche delle funzioni aggiuntive, in particolare i pin 5, 6, 10 ed 11 sono in grado di generare un segnale pwm (Pulse Width Modulation). Utilizzando questa funzione possiamo generare un segnale con una frequenza minima di 15Hz ed una massima di 500KHz, con un <a title="Capire il duty cycle" href="https://logicaprogrammabile.it/capire-il-duty-cycle/">Duty Cycle</a> variabile da 0 a 100%. Per poter generarlo dobbiamo creare un’istanza di oggetto dalla classe PWM</p>
<p style="text-align: center;"><strong>PWM pwm = new PWM(pin del Netduino);</strong></p>
<p>Il costruttore della classe richiede come parametro il pin del Netduino che vogliamo utilizzare per generare il pwm.<br />
Le funzioni disponibili sono due:</p>
<pre class="lang:c# decode:true ">pwm.SetPulse(frequenza, duty cycle);
pwm.SetDutyCycle(duty cycle);</pre>
<p>&nbsp;</p>
<p><strong>SetPulse </strong>accetta due argomenti, il primo indica il valore della frequenza da generare ed il secondo il valore del duty cycle. Il valori validi da inserire nel parametro della frequenza vanno da 2 a 65535 mentre quelli validi da inserire nel parametro duty cycle vanno da 1 a 65534 ma dipendono dal parametro frequenza.<br />
Il valore 2 corrisponde a una frequenza di 500Khz mentre il valore 65535 corrisponde a un frequenza di 15hz.<br />
Il secondo parametro che definisce il duty cycle dipende strettamente dal valore numerico inserito nel parametro della frequenza. Chiarisco subito con un esempio, se voglio generare un segnale a 100Hz con duty cycle del 30% devo procedere in questo modo:<span id="more-412"></span></p>
<p>Calcolo il valore del parametro <em>frequenza</em> basandomi su questa proporzione</p>
<p style="text-align: center;"><strong>65535 : 2 = 500000 : 15</strong></p>
<p>quindi per calcolare il numero intero che produrrà un segnale pwm con una frequenza di 100Hz devo eseguire questo calcolo</p>
<p style="text-align: center;"><strong>(65535*15) / 100 ~= <span style="color: #800000;">9830</span></strong></p>
<p style="text-align: left;">Il risultato del calcolo va immesso nel campo <em>frequenza</em> della funzione SetPulse. Il valore di duty cycle da inserire nel secondo parametro dipende dal valore della frequenza, e per calcolarlo devo usare questa formula:</p>
<p style="text-align: center;"><strong>(Valore Frequenza / 100) * Valore Duty Cycle</strong></p>
<p style="text-align: left;">che in pratica diviene:</p>
<p style="text-align: center;"><strong>(9830/100)*30 = <span style="color: #800000;">2949</span></strong></p>
<p style="text-align: left;">di conseguenza la funzione SetPulse per generare un segnale a 100Hz con duty cycle al 30% è:</p>
<pre class="lang:c# decode:true ">pwm.SetPulse(9830, 2949); //100Hz 30%</pre>
<p>&nbsp;</p>
<p><strong>SetDutyCycle </strong>genera una frequenza fissa di 10KHz con un duty cycle variabile a seconda del valore inserito nel suo parametro. <strong>SetDutyCycle </strong>accetta valori da 0 a 100 rispettivamente per un duty cycle del 0% e del 100%. Se in questo parametro inseriamo il valore o otterremo un segnale basso all&#8217;uscita del pin del Netduino mentre se specifichiamo 100 otterremo sul pin in questione un valore fisso di 5Vdc, tutti gli altri valori da 1 a 99 produrranno il segnale pwm con duty cycle da 1% a 99%.</p>
<p>Il PWM solitamente è impiegato nel controllo della velocità di rotazione dei motori, la possibilità di variare il duty cycle permette di controllare direttamente la velocità di rotazione del motore, aumentandola o diminuendola in funzione del valore di duty cycle.</p>
<p>Il codice seguente mostra un esempio di utilizzo della funzione pwm del Netduino</p>
<pre class="lang:c# decode:true ">public static void Main()
{
UInt32 DutyCycle = 0;
PWM pw1 = new PWM(Pins.GPIO_PIN_D5); //uscita pwm su pin5

while (true) //ciclo infinito
{
// incrementato per 100 iterazioni la variabile Intensita
// e la passo come parametro alla funzione SetDutyCycle
for (DutyCycle = 1; DutyCycle &lt;= 100; DutyCycle++)
{
pw1.SetDutyCycle(DutyCycle);
Thread.Sleep(25);
}
}
}</pre>
<p>&nbsp;</p>
<p style="text-align: center;">Il diagramma seguente mostra l&#8217;andamento del segnale pwm che progressivamente va da un duty cycle dell&#8217;1% sino al 99%. La frequenza del segnale è sempre di 10KHz <img loading="lazy" decoding="async" class="aligncenter wp-image-417 size-full" title="Segnale PWM" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/pwm.gif" alt="Segnale PWM Pulse Width Modulation" width="474" height="511" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/pwm.gif 474w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/pwm-278x300.gif 278w" sizes="auto, (max-width: 474px) 100vw, 474px" /> il circuito elettrico invece è il seguente; <img loading="lazy" decoding="async" class="aligncenter wp-image-418 size-full" title="Collegamento Netduino e oscilloscopio" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/TestPwm.gif" alt="Generare segnale PWM Collegamento Netduino e oscilloscopio" width="359" height="278" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/TestPwm.gif 359w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/TestPwm-300x232.gif 300w" sizes="auto, (max-width: 359px) 100vw, 359px" /></p>
<p>Come sempre critiche e suggerimenti sono sempre ben accetti.</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-gestione-pwm/">PWM gestione col Netduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-gestione-pwm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Capire il duty cycle</title>
		<link>https://logicaprogrammabile.it/duty-cycle-guida-definitiva/</link>
					<comments>https://logicaprogrammabile.it/duty-cycle-guida-definitiva/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 02 Mar 2011 16:02:22 +0000</pubDate>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Duty Cycle]]></category>
		<category><![CDATA[Netduino]]></category>
		<category><![CDATA[PWM]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=150</guid>

					<description><![CDATA[<p>La guida definitiva al Duty Cycle Uno dei primi esperimenti che feci quando iniziai a studiare elettronica, fu pilotare un piccolo motorino dc. Presto capii che abbassando la tensione di alimentazione, per far diminuire la velocità del motore, portava anche a una perdita di potenza...</p>
<p>The post <a href="https://logicaprogrammabile.it/duty-cycle-guida-definitiva/">Capire il duty cycle</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>La guida definitiva al Duty Cycle</h1>
<p>Uno dei primi esperimenti che feci quando iniziai a studiare elettronica, fu pilotare un piccolo motorino dc. Presto capii che abbassando la tensione di alimentazione, per far diminuire la velocità del motore, portava anche a una perdita di potenza del motore stesso, dovuta ad un conseguente calo di corrente.<br />
Dopo vari studi imparai che, per tenere il motore sempre con una certa forza a diverse velocità, non bisognava abbassare il valore di tensione, ma pilotare il motore con un segnale ad onda quadra e variare il duty cycle dello stesso.<br />
Il <strong>duty cycle</strong> è il rapporto che c&#8217;è tra il segnale positivo e il periodo totale del segnale ad onda quadra ed è espresso in percentuale. Un duty cycle del 100% equivale ad un segnale Alto continuo, uno del 0% equivale ad un segnale Basso continuo mentre un duty cycle del 50% significa che il segnale Alto dura quanto quello Basso.</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-154 size-full" title="Onda Quadra" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra.gif" alt="Onda quadra e duty cycle" width="605" height="169" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra.gif 605w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra-300x83.gif 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></p>
<p>per calcolarlo basta eseguire questa semplice formula</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-160 size-full" title="Formula" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/Formula.gif" width="204" height="43" /><br />
dove Livello Alto è il valore di tempo della durata del segnale positivo mentre Periodo è il tempo relativo al periodo del segnale ad onda quadra.<br />
Possiamo fare un semplice esempio:</p>
<p>Supponendo che il livello alto duri 10ms e il periodo del segnale ad onda quadra sia di 20ms, potremmo calcolare che il duty cycle sia del 50%, infatti 10ms / 20ms = 0.5 che moltiplicato per 100 da 50(%).</p>
<p>Nel caso in cui invece il tempo del livello alto sia di 2ms e il periodo del segnale di 20ms otterremo un duty cycle del 10%</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-157 size-full" title="Onda Quadra 10%" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra10x100.gif" alt="Duty Cycle 10%" width="605" height="169" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra10x100.gif 605w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra10x100-300x83.gif 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></p>
<p>Mentre se il tempo del livello alto è di 18ms e il periodo del segnale di 20ms otterremo un duty cycle del 90%.</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-156 size-full" title="Onda Quadra 90%" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra90x100.gif" alt="Duty Cycle 90%" width="605" height="169" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra90x100.gif 605w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/OndaQuadra90x100-300x83.gif 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></p>
<p>Questa caratteristica è stata implementata sia nel Netduino che nell&#8217;Arduino e la capacità di variare il duty cycle viene comunemente detta PWM (Pulse Width Modulation). Per generare un segnale ad onda quadra con duty cycle variabile bisogna configurare alcuni pin dedicati del Netduino/Arduino ed usare delle semplici funzioni.</p>
<p>The post <a href="https://logicaprogrammabile.it/duty-cycle-guida-definitiva/">Capire il duty cycle</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/duty-cycle-guida-definitiva/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
